Код Dice.com для реализации идей, обсуждаемых в следующих докладах:
Это расширяет мою предыдущую работу над «Концептуальным поиском», которую можно найти здесь — https://github.com/DiceTechJobs/ConceptualSearch (включая слайды и ссылки на видео). В этом докладе я представляю ряд различных подходов к поиску векторов в масштабе с использованием инвертированного индекса. Это реализует подходы к приблизительному поиску k-ближайшего соседа, включая:
и описывает, как эти идеи могут быть эффективно реализованы и запрошены в инвертированном индексе.
ОБНОВЛЕНИЕ: после разговора с Треем Грейнджером и Эриком Хэтчером из LucidWorks они рекомендовали использовать частоту терминов вместо полезных данных для решений, в которых я встраиваю веса терминов в индекс и использую специальную функцию сходства с учетом полезной нагрузки (которая также не понадобится). Полезные нагрузки подвергаются значительному снижению производительности. Проблема заключается в отрицательных весах. Я предполагаю, что невозможно закодировать частоты отрицательных терминов, но это можно обойти, используя разные токены для токенов с положительным и отрицательным взвешиванием и внося аналогичные корректировки во время запроса (где отрицательные повышения могут быть применяться в Solr по мере необходимости).
Документация Lucene: Частотный фильтр Lucene с разделителями
Также недавно вышло обновление ядра Lucene, которое применимо здесь и скоро появится в Elastic search на момент написания статьи: Block Max WAND. Это обеспечивает значительное ускорение выполнения больших логических запросов ИЛИ, где вам не нужно знать точное количество результатов, а просто нужно как можно быстрее получить первые N результатов. Все подходы, которые я обсуждаю здесь, генерируют относительно большие запросы OR, поэтому это очень актуально. Я также читал, что текущая реализация минимального соответствия также включает в себя аналогичные оптимизации, и поэтому такого же прироста производительности уже можно достичь, используя соответствующие настройки мм, с чем я уже экспериментировал в своем коде.
Активация 2018: «Векторы в поиске»
Haystack 2019: «Поиск с помощью векторов»
Саймон Хьюз (главный специалист по данным, Dice.com)