⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.
blog-post

Гибридный поиск в Manticore Search

Поиск редко является универсальной задачей. Пользователь, вводящий "cheap running shoes", хочет точных совпадений по ключевым словам, но пользователь, задающий "comfortable footwear for jogging", выражает тот же намерение другими словами. Традиционный полнотекстовый поиск хорошо справляется с первым случаем. Векторный поиск решает второй. Гибридный поиск объединяет оба в одном запросе, так что вам не нужно выбирать.

В современных поисковых системах это часто описывается как комбинирование лексического (разреженного) поиска с семантическим (плотным) поиском. Разные термины, одна идея: точное совпадение плюс смысл.

Что такое гибридный поиск?

Гибридный поиск одновременно выполняет полнотекстовый (BM25) поиск и векторный (KNN) поиск, а затем объединяет два списка результатов в один. Документы, получившие высокий балл по любому из сигналов (или по обоим), поднимаются наверх.

Полнотекстовый поиск отлично работает с точными ключевыми словами, редкими терминами и идентификаторами. Векторный поиск понимает смысл — что "automobile" и "car" являются одной и той же концепцией — потому что их эмбеддинги находятся рядом в векторном пространстве.

Each method has blind spots:

  • Полнотекстовый затрудняется с синонимами и естественным языком
  • Векторный поиск затрудняется с точными токенами, такими как SKU, коды ошибок и идентификаторы

Гибридный поиск охватывает оба.

Как гибридный поиск вписывается в современные поисковые конвейеры

Гибридный поиск — это этап извлечения — часть, которая находит релевантные кандидаты из вашего набора данных.

Вместо того чтобы полагаться на один метод, гибридный поиск комбинирует совпадения по ключевым словам и семантическое сходство, чтобы сразу получить более сильный набор результатов.

In practice, this means:

  • Лучшее покрытие (recall) для запросов на естественном языке
  • Точное совпадение для идентификаторов, таких как SKU или коды ошибок
  • Более релевантные результаты без необходимости сложной логики запросов

Цель проста: вернуть наилучших возможных кандидатов за один проход, используя оба сигнала вместе.

Когда следует использовать гибридный поиск?

Гибридный поиск подходит, когда:

  • Ваши запросы сочетают намерение и детали. Поиск вроде python error 403 forbidden выигрывает от точности по ключевому слову в коде ошибки и семантического понимания описания проблемы.
  • Вы создаёте конвейер RAG. Retrieval-Augmented Generation требует подачи самых релевантных фрагментов в LLM. Гибридное извлечение постоянно находит более релевантные документы, чем любой из методов по отдельности.
  • Ваш каталог содержит как структурированные, так и неструктурированные данные. Товары электронной коммерции имеют точные названия и номера моделей (территория ключевых слов), но также описания, где смысл важнее точных формулировок.
  • Вы не можете предсказать, как пользователи будут искать. Некоторые вставят точные фразы, другие опишут, что ищут, на естественном языке. Гибридный поиск элегантно справляется с обоими случаями.

Как это работает

Manticore использует Reciprocal Rank Fusion (RRF) для объединения результатов. Идея проста: вместо попытки сравнивать сырые оценки BM25 с расстояниями KNN (которые находятся на совершенно разных шкалах), RRF смотрит на позиции рангов. Документ, занявший #1 в текстовых результатах и #3 в результатах KNN, получает более высокий комбинированный балл, чем документ, появившийся только в одном списке.

Вот быстрый пример. Предположим, что текстовый поиск и поиск KNN каждый возвращают свои топ‑3:

Результаты текстового поиска:

РангДокумент
1Doc A
2Doc B
3Doc C

Результаты поиска KNN:

РангДокумент
1Doc C
2Doc A
3Doc D

RRF оценивает каждый документ по формуле 1 / (rank_constant + rank). При значении по умолчанию rank_constant=60:

ДокументВклад текстаВклад KNNБалл RRF
Doc A1/(60+1) = 0.01641/(60+2) = 0.01610.0325
Doc C1/(60+3) = 0.01591/(60+1) = 0.01640.0323
Doc B1/(60+2) = 0.01610.0161
Doc D1/(60+3) = 0.01590.0159

Doc A занимает первое место, потому что появляется почти вверху обоих списков. Doc C находится рядом по той же причине. Doc B и Doc D присутствуют только в одном списке, поэтому их баллы ниже.

Почему RRF?

Существует два распространённых способа объединения результатов:

  • Слияние на основе рангов (RRF) — простое, надёжное, без необходимости нормализовать оценки
  • Слияние на основе оценок — сначала нормализовать оценки, затем объединять

Manticore использует RRF, потому что он хорошо работает сразу из коробки и избегает проблем калибровки оценок.

Внутри, гибридный запрос разбивается на независимые подзапросы — один для полнотекстового поиска, один (или несколько) для KNN — которые выполняются параллельно. После завершения всех подзапросов RRF объединяет их ранжированные списки результатов в один вывод.

Почему нельзя просто использовать один из методов?

Рассмотрим базу знаний поддержки со статьями для разных кодов ошибок — сбои соединения, проблемы аутентификации, проблемы синхронизации. Пользователь видит ошибку E-5020 на экране и сообщает: "Не могу подключиться к серверу."

Векторный поиск понимает симптом, но не код ошибки. KNN для "не могу подключиться к серверу" возвращает:

#ЗаголовокРасстояние KNN
1Ошибка E-5030: Ошибка разрешения DNS0.572
2Ошибка E-2091: Превышено время загрузки приложения0.583
3Ошибка E-5020: Несоответствие SSL‑сертификата0.605
4Ошибка E-5010: Сервис недоступен0.622
5Ошибка E-4001: Не удалось войти0.665

Правильная статья (E-5020) зарыта на позиции #3. KNN ставит выше ошибки DNS и таймаутов, потому что их описания семантически ближе к "не могу подключиться." Фактическая проблема — несоответствие SSL‑сертификата — использует совершенно другую лексику, поэтому получает более низкий балл.

Вы можете подумать: просто добавить код ошибки в запрос KNN. Но "E-5020" и "E-5010" — произвольные идентификаторы без семантического значения, эмбеддинги рассматривают их как почти одинаковые токены. KNN для "E-5020 не могу подключиться к серверу" действительно перемещает E-5020 на позицию #1, но только потому, что добавленный текст меняет семантический контекст — сам код ошибки не несёт веса.

Гибридный поиск решает эту проблему, отправляя каждый сигнал туда, где он работает лучше всего — код ошибки в полнотекстовый поиск, симптом — в KNN:

SELECT title, hybrid_score()
FROM support_articles
WHERE knn(embedding, 'can not connect to the server')
  AND MATCH('E-5020')
LIMIT 5
OPTION fusion_method='rrf';
#TitleHybrid score
1Error E-5020: SSL Certificate Mismatch0.032
2Error E-5030: DNS Resolution Failed0.016
3Error E-2091: App Loading Timeout0.016
4Error E-5010: Service Unavailable0.016
5Error E-4001: Login Failed0.015

E-5020 переходит с #3 на #1 с удвоенным баллом по сравнению со всеми остальными. Полнотекстовый поиск рассматривает «E-5020» как точную строку — не похожую на «E-5010», недостаточно близкую, просто другую. KNN гарантирует, что связанные ошибки соединения всё ещё отображаются ниже для контекста.

Это основная ценность гибридного поиска:

  • Идентификаторы → полнотекстовый поиск
  • Смысл → векторный поиск

Каждый метод покрывает слепую зону другого.

Getting started

Самый простой способ выполнить гибридный поиск — использовать hybrid_match(). Если в вашей таблице настроены авто‑эмбеддинги, одна строка делает всё — поиск по тексту, генерацию эмбеддингов, поиск KNN и объединение RRF:

SELECT id, hybrid_score()
FROM products
WHERE hybrid_match('running shoes');

JSON‑эквивалент:

POST /search
{
  "table": "products",
  "hybrid": { "query": "running shoes" }
}

Manticore:

  • генерирует эмбеддинги
  • выполняет оба поиска параллельно
  • объединяет результаты

Full control: explicit MATCH + KNN

Когда нужно предоставить свои собственные векторы или настроить отдельные подзапросы, используйте явную форму с MATCH() и KNN() в предложении WHERE:

SELECT id, hybrid_score()
FROM products
WHERE match('running shoes')
  AND knn(embedding, (0.12, 0.45, 0.78, ...))
OPTION fusion_method='rrf';
POST /search
{
  "table": "products",
  "knn": {
    "field": "embedding",
    "query_vector": [0.12, 0.45, 0.78, "..."]
  },
  "query": { "match": { "title": "running shoes" } },
  "options": { "fusion_method": "rrf" }
}

Каждый результат включает:

  • hybrid_score() — объединённый балл (используется для сортировки по умолчанию)
  • weight() — балл BM25
  • knn_dist() — векторное расстояние

Фильтры атрибутов (AND category = 'footwear') применяются к обоим подзапросам.

Tuning

Три опции позволяют настроить поведение объединения:

  • rank_constant — контролирует, насколько верхние позиции доминируют в объединённом балле. Низкие значения (например, 10) делают позицию #1 значительно более значимой, чем позицию #5. Высокие значения сглаживают кривую. См. rank_constant .
  • fusion_weights — позволяет задать разную важность каждому подзапросу. Если релевантность текста важнее, чем векторное сходство, задайте больший вес. См. fusion_weights .
  • window_size — сколько результатов каждый подзапрос получает до объединения. По умолчанию Manticore вычисляет это автоматически из параметров KNN и LIMIT запроса. См. window_size .

Multi‑vector fusion

Гибридный поиск не ограничивается одним текстовым поиском и одним поиском KNN. Вы можете объединять несколько векторных поисков — это полезно, когда ваши данные имеют несколько различных семантических измерений. Например, у товара в электронной коммерции есть текстовое описание и фотография. Пользователь, ищущий «минималистичные белые кроссовки», учитывает оба аспекта: название должно соответствовать стилю, а изображение продукта должно выглядеть так, как он представляет в уме. Закодировав название и изображение в отдельные векторные пространства, можно искать их одновременно и позволить RRF выводить товары, соответствующие всем трем сигналам — ключевым словам, смыслу текста и визуальному сходству:

SELECT id, hybrid_score()
FROM products
WHERE match('running shoes') AS text
  AND knn(title_vec, (0.12, 0.45, ...)) AS title_sim
  AND knn(image_vec, (0.88, 0.21, ...)) AS image_sim
OPTION fusion_method='rrf',
       fusion_weights=(text=0.5, title_sim=0.3, image_sim=0.2);

Все подзапросы выполняются параллельно и объединяются вместе через RRF.

Conclusion

Гибридный поиск не предназначен заменять полнотекстовый или векторный поиск — он предназначен использовать оба там, где они работают лучше всего.

Поиск по ключевым словам даёт точность для точных терминов и идентификаторов. Векторный поиск обеспечивает гибкость для естественного языка и смысла. По отдельности каждый имеет пробелы. Вместе они дают постоянно лучшие результаты по широкому спектру запросов.

С гибридным поиском в Manticore вам не нужно выбирать между двумя вариантами или строить сложную логику запросов для разных случаев. Вы можете запускать оба сигнала параллельно и получать единый, унифицированный набор результатов.

Если ваш поиск должен обрабатывать как точные совпадения, так и намерения — что характерно для большинства реальных приложений — гибридный поиск представляет собой простой способ повысить релевантность без добавления сложности.

Установить Manticore Search

Установить Manticore Search