Быстрый поиск ближайшего соседа

У меня есть таблица с ~ 3 миллионами строк. Каждая строка представляет объект с 5 свойствами. Каждое значение свойства является плавающим и находится в диапазоне от 0 до 1.

Таблица объявлена ​​как

CREATE TABLE tbl (
  OBJECT_ID integer,
  property_1 float,
  property_2 float,
  property_3 float,
  property_4 float,
  property_5 float
);

Мне нужно найти первые 10 наиболее похожих объектов на указанный.

Мой запрос:

select T2.OBJECT_ID,
       sqrt(
         (T1.property_1 - T2.property_1)^2 +
         (T1.property_2 - T2.property_2)^2 +
         (T1.property_3 - T2.property_3)^2 +
         (T1.property_4 - T2.property_4)^2 +
         (T1.property_5 - T2.property_5)^2
       ) similarity
  from tbl T1, tbl T2
 where T1.OBJECT_ID = 42
 order by 2
 limit 10;

Как повысить производительность поиска наиболее похожих объектов?

Принимается любое решение (oracle, postgres, noSQL или C++).


person a.oberon    schedule 21.08.2013    source источник
comment
Ознакомьтесь с поиском KNN в PostgreSQL. См., например. sai.msu.su/~megera/postgres/ talks/pgcon-2010-1.pdf . Мне действительно нужны образцы данных, чтобы получить фактический ответ.   -  person Craig Ringer    schedule 21.08.2013


Ответы (1)


Выполнение быстрого поиска KNN требует возможности сделать это вне индекса. Чтобы сделать это с помощью пользовательского типа, как у вас, требуется указать целые диапазоны поддержки индексации для этой таблицы и написать функции для выполнения вычислений. Итак, вам предстоит много работы, и ответ не прост.

Что вам нужно сделать, это, в основном:

  1. Просмотрите поддерживаемые операторы GIST.

  2. Напишите функции для поддержки вычисления любого или всех из них.

  3. Создайте класс операторов, который связывает их с индексом GIST, и, наконец,

  4. Индексируйте всю свою таблицу, используя этот метод индекса. Если в вашей таблице есть большие поля, у вас могут возникнуть проблемы (здесь вам может помочь наследование таблиц, но это уже другая большая тема).

Каждый из них был бы достаточно широким для серии вопросов сам по себе, поэтому я не думаю, что вы можете ожидать здесь решения. Но это должно дать вам базовую дорожную карту.

person Chris Travers    schedule 12.11.2013