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

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

Кратко Гибридный поиск 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.66332495 |
| 3 | latest music trend | 1.2806249 |
+------+---------------------+------------+

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 оправдывает себя, когда вам уже нужны соединения или агрегации на тех же данных. Для чистого векторного поиска в чрезвычайно больших масштабах специализированная векторная база данных обычно проще в эксплуатации.

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