Я знаю, что в PostgreSQL оптимизирован поиск по сходству триграмм и даже индексирование (CREATE INDEX trgm_idx ON table USING gist (column gist_trgm_ops);
), которое можно использовать непосредственно из Django (веб-фреймворк):
Model.objects.filter(attribute__trigram_similar=query_string)
Но что, если вместо поверхностного сходства я хочу выполнить запрос семантического сходства для объектов базы данных? (что явно отличается от классического сходства триграмм).
Хорошим примером может служить универсальный кодировщик предложений Google , где я бы преобразовал все строки в 512 векторов вложения (используя библиотеку) и выполнил запрос, рассчитав нормализованное произведение точек (косинусное сходство) и получив объект с наибольшим сходством (или, возможно, n объектов со сходством >=0.50
).
Самое простое, что нужно сделать - это выполнить итерацию (на уровне инфраструктуры) объектов базы данных, но это крайне неэффективно (особенно если база данных велика), поэтому я бы предпочел найти способ выполнения запроса к базе данных. уровень (и, возможно, если это возможно, настроить оптимальную индексацию для семантического поиска?).
Как лучше всего выполнить пользовательский поиск сходства в базе данных предварительно векторизованных объектов?
Что если я получу точечное произведение всех объектов в предварительно векторизованной базе данных вручную?
Спасибо!