Каков наилучший способ внедрения KNN в postgreSQL с использованием пользовательского расстояния metri c? - PullRequest
1 голос
/ 14 апреля 2020

Позвольте мне объяснить мою проблему. У меня есть таблица с этой формой:

+----+------+-----------+-----------+
| ID |  A   |     B     |     W     |
+----+------+-----------+-----------+
| 1  | 534  | [a,b,c]   | [4,6,2]   |
| 2  | 534  | [a,b,d,e] | [6,3,6,2] |
| …  | …    | …         | …         |
| 54 | 667  | [a,b,r,e] | [4,6,2,3] |
| 55 | 8789 | [d]       | [9]       |
| 56 | 8789 | [a,b,d]   | [7,2,3]   |
| 57 | 8789 | [d,e,f,g] | [4,2,2,8] |
| …  | …    | …         | …         |
+----+------+-----------+-----------+

Запрос, который мне нужно выполнить, следующий: дан ввод со значениями A, B и W (например, A = 8789; B = [a, b ]; W = [3,2]) Мне нужно найти «ближайшую» строку в таблице, которая имеет такое же значение на A.

Я уже определил свою пользовательскую функцию расстояния. Наивный подход был бы что-то вроде (учитывая входные данные в примере):

SELECT * from my_table T, dist_function(T.B,T.W,ARRAY[a,b],ARRAY[3,2]) as dist 
WHERE T.A = 8789
ORDER BY dist ASC
LIMIT 7

В моем понимании это классическая проблема KNN, для которой я понял, что что-то уже существует:

Я просто не уверен, какой показатель лучше всего рассмотреть. Спасибо.

...