Перейти к содержимому
Последнее обновление

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

Кратко Гибридный поиск в Apache Doris объединяет полнотекстовое сопоставление и векторное сходство в одном SQL-запросе к одной таблице. Таблица содержит и инвертированный индекс, и ANN-индекс по столбцам, которые обычно распределяют между Elasticsearch и векторной базой данных. Одна секция WHERE сочетает MATCH_ANY с l2_distance_approximate, позволяя выполнить фильтрацию и ранжирование за один проход.

Гибридный поиск в Apache Doris: полнотекстовое сопоставление и векторное сходство в одном SQL-запросе к одной таблице без необходимости поддерживать отдельный поисковый кластер.

Зачем использовать гибридный поиск в Apache Doris?​

Гибридный поиск в Apache Doris объединяет два режима поиска в одном SQL-запросе, поэтому вам не нужно поддерживать отдельный поисковый кластер рядом с хранилищем данных. Поисковые задачи редко ограничиваются одним режимом. Пользователь, который ищет «лёгкие беговые кроссовки для трейла», ожидает точных совпадений по словам «беговые» и «трейл», а также семантических совпадений с описаниями, где говорится о «бездорожье» или «пересечённой местности». Обычное решение, распределение работы между двумя системами, влечёт за собой привычные издержки:

  • Два конвейера загрузки данных, которые нужно поддерживать синхронными, иначе полнота поиска становится нестабильной.
  • Два языка запросов, связанные вручную написанной логикой объединения результатов.
  • Два кластера, для которых нужно подбирать ресурсы, вести мониторинг и оплачивать эксплуатацию.

Apache Doris сводит всё это к одной таблице и одному SQL-запросу, который выполняет тот же движок MPP, что и остальные ваши запросы.

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

Гибридный поиск в Apache Doris представляет собой шаблон запроса, а не отдельный движок. Одна таблица может содержать и инвертированный индекс (обеспечивающий работу операторов MATCH_* и оценку релевантности BM25 через score()), и ANN-индекс (обеспечивающий работу функций приближённого вычисления векторного расстояния, таких как l2_distance_approximate и inner_product_approximate). Планировщик Apache Doris обращается к обоим индексам в одном запросе и возвращает единый ранжированный набор результатов.

Основные термины

  • Инвертированный индекс: полнотекстовый индекс по столбцу типа STRING. Доступны токенизаторы english, standard и токенизаторы для китайского языка.
  • ANN-индекс: индекс приближённого поиска ближайших соседей по столбцу типа ARRAY<FLOAT>. Доступные реализации: HNSW, IVF и IVF on-disk.
  • Предварительная фильтрация: стратегия, используемая в Apache Doris по умолчанию. Сначала применяются скалярные и текстовые предикаты, затем среди оставшихся строк выбираются TopN по векторному расстоянию.

Как работает гибридный поиск в Apache Doris?​

При гибридном поиске Apache Doris строит оба индекса во время загрузки данных, а затем использует их в едином плане MPP: инвертированный индекс выполняет фильтрацию, а ANN-индекс обеспечивает ранжирование.

  1. Построение индексов при загрузке данных. При загрузке данных инвертированный индекс разбивает содержимое каждого текстового столбца на токены; ANN-индекс строит граф HNSW или кодовую книгу IVF на основе векторов. Оба индекса хранятся рядом с базовой таблицей на том же уровне хранения.
  2. Единое планирование. Когда запрос сочетает операторы MATCH_* и функцию векторного расстояния, планировщик направляет текстовый предикат к инвертированному индексу, а функцию расстояния к ANN-индексу. Второй запрос и соединение на стороне клиента не требуются.
  3. Сначала фильтрация, затем ранжирование. Apache Doris сначала выполняет предварительную фильтрацию с помощью инвертированного индекса, затем запускает ANN TopN по оставшимся строкам. Такой порядок обратен распространённой схеме «сначала ANN, затем фильтрация» и позволяет сохранять высокую полноту поиска при селективных фильтрах.
  4. Адаптивный переход к полному перебору. Если фильтр настолько селективен, что обход ANN пропускал бы слишком много кандидатов, Apache Doris переходит к вычислению векторных оценок полным перебором отфильтрованного набора. Тот же SQL продолжает работать; меняется только путь выполнения.
  5. Возврат результата. Один отсортированный набор результатов с ограничением количества строк. Без внешнего сервиса объединения результатов и дополнительной логики ранжирования на стороне приложения.

Быстрый старт​

CREATE TABLE docs (
id INT NOT NULL,
embedding ARRAY<FLOAT> NOT NULL,
body STRING NOT NULL,
INDEX idx_body(body) USING INVERTED PROPERTIES("parser"="english"),
INDEX idx_vec(embedding) USING ANN
PROPERTIES("index_type"="hnsw","metric_type"="l2_distance","dim"="8")
) DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 1;

INSERT INTO docs VALUES
(1, [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8], 'this is about music'),
(2, [0.2,0.1,0.5,0.3,0.9,0.4,0.7,0.1], 'sports news today'),
(3, [0.9,0.8,0.7,0.6,0.5,0.4,0.3,0.2], 'latest music trend'),
(4, [0.05,0.06,0.07,0.08,0.09,0.1,0.2,0.3], 'politics update');

SELECT id, body,
l2_distance_approximate(embedding, [0.1,0.1,0.2,0.2,0.3,0.3,0.4,0.4]) AS dist
FROM docs
WHERE body MATCH_ANY 'music' -- inverted index pre-filter
ORDER BY dist ASC -- ANN TopN over the filtered rows
LIMIT 2;

Ожидаемый результат

+------+---------------------+----------+
| id | body | dist |
+------+---------------------+----------+
| 1 | this is about music | 0.663325 |
| 3 | latest music trend | 1.280625 |
+------+---------------------+----------+

MATCH_ANY 'music' сокращает набор кандидатов до строк, в которых body содержит «music»; затем ANN-индекс ранжирует эти строки по расстоянию до вектора запроса и возвращает две ближайшие.

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

Используйте гибридный поиск в Apache Doris, когда вам нужны фильтрация по ключевым словам и поиск по векторному сходству на одних и тех же данных в одном SQL-запросе без отдельной векторной базы данных.

Подходящие сценарии

  • Поиск для RAG, когда фильтры по ключевым словам (тенант, тип документа, диапазон дат) должны сузить корпус документов перед семантическим ранжированием.
  • Поиск товаров или поиск по Catalog, сочетающий структурированные фильтры (бренд, цена, наличие) со сходством эмбеддингов названия и описания.
  • Поиск по журналам и документам, где пользователи регулярно сочетают условия «должно содержать X» и «похоже на Y».
  • Нагрузки, при которых данные уже хранятся в Doris для SQL-аналитики и не хочется отправлять их копию в векторную базу данных.

Неподходящие сценарии

  • Только ANN-поиск в масштабе миллиардов записей, без фильтров и аналитики. Специализированная векторная база данных может потреблять меньше памяти и обходиться дешевле в расчёте на запрос.
  • Таблицы, которым требуется AGGREGATE KEY или UNIQUE KEY без merge-on-write. В настоящее время ANN-индексы требуют таблиц DUPLICATE KEY или MoW-таблиц UNIQUE KEY.
  • Векторные столбцы, допускающие NULL. Векторный столбец должен иметь тип NOT NULL ARRAY<FLOAT> с фиксированной размерностью, совпадающей с размерностью индекса.
  • Нагрузки, которым требуется Reciprocal Rank Fusion для объединения результатов двух функций оценки. Шаблон с одним проходом ранжирует строки по векторному расстоянию после предварительной фильтрации по ключевым словам; для объединения ранжирования BM25 и векторного ранжирования используйте SQL-шаблон с двумя списками из раздела Reciprocal Rank Fusion.

Сравнение с другими подходами​

АспектГибридный поиск в DorisElasticsearch + векторная база данныхТолько векторная база данных
Конвейеры загрузки данныходиндва, с поддержанием синхронизацииодин
Выполнение запросаодин SQL-запрособъединение результатов на стороне приложенияодин API
Выразительность фильтроввсе возможности SQL (соединения, диапазоны, агрегации)DSL, ограниченная поддержка соединенийтолько теги и метаданные
Аналитика на тех же данныхвсе возможности MPP SQLограниченнаяотсутствует

Гибридный поиск в Doris оправдывает себя, когда вам также нужны соединения или агрегации на тех же данных. Для исключительно векторного поиска в особо больших масштабах специализированная векторная база данных обычно проще в эксплуатации.

Дополнительные материалы​