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

Зачем использовать гибридный поиск в 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 — ранжирование.
- Построение индексов при загрузке. При загрузке данных инвертированный индекс разбивает содержимое каждого текстового столбца на токены; индекс ANN строит по векторам граф HNSW или кодовую книгу IVF. Оба индекса хранятся рядом с основной таблицей, на том же уровне хранения.
- Единый план выполнения. Когда запрос сочетает операторы
MATCH_*и функцию расстояния между векторами, планировщик направляет текстовый предикат в инвертированный индекс, а функцию расстояния — в индекс ANN. Второй запрос и соединение на стороне клиента не требуются. - Сначала фильтрация, затем ранжирование. Apache Doris сначала выполняет предварительную фильтрацию с помощью инвертированного индекса, а затем запускает ANN TopN по оставшемуся набору строк. Этот порядок обратен распространённой схеме «сначала ANN, затем фильтрация» и позволяет сохранять высокую полноту поиска, когда фильтры отбирают небольшую долю строк.
- Адаптивное переключение. Если фильтр настолько селективен, что обход ANN пропустил бы слишком много кандидатов, Apache Doris переходит к вычислению векторных оценок полным перебором отфильтрованного набора. Тот же SQL продолжает работать; меняется только путь выполнения.
- Возврат результатов. Один отсортированный набор результатов с ограничением количества строк. Внешняя служба объединения результатов и дополнительная логика ранжирования в приложении не требуются.
Быстрый старт
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или MoWUNIQUE KEY. - Векторные столбцы, допускающие NULL. Векторный столбец должен иметь тип
NOT NULL ARRAY<FLOAT>с фиксированной размерностью, соответствующей индексу. - Нагрузки, которым нужен Reciprocal Rank Fusion для объединения результатов двух функций оценки. При однопроходной обработке ранжирование по расстоянию между векторами выполняется после предварительной фильтрации по ключевым словам; чтобы объединить ранжирование BM25 и векторное ранжирование, используйте SQL-шаблон с двумя списками из раздела Reciprocal Rank Fusion.
Сравнение с другими подходами
| Аспект | Гибридный поиск Doris | Elasticsearch + векторная база данных | Только векторная база данных |
|---|---|---|---|
| Конвейеры загрузки данных | один | два, с синхронизацией | один |
| Путь выполнения запроса | один SQL-запрос | объединение результатов на стороне приложения | один API |
| Выразительность фильтров | полноценный SQL (соединения, диапазоны, агрегации) | DSL, ограниченная поддержка соединений | только теги и метаданные |
| Аналитика на тех же данных | полноценный MPP SQL | ограничена | отсутствует |
Гибридный поиск в Doris оправдывает себя, когда вам уже нужны соединения или агрегации на тех же данных. Для чистого векторного поиска в чрезвычайно больших масштабах специализированная векторная база данных обычно проще в эксплуатации.
Дополнительные материалы
- Векторный индекс: индекс ANN, обеспечивающий векторную составляющую гибридного поиска.
- Полнотекстовый поиск: работа с инвертированным индексом, включая токенизаторы и семейство операторов
MATCH_*. - Оценка релевантности BM25: как
score()ранжирует текстовые совпадения; используйте её вместе с расстоянием между векторами в схеме с двумя функциями оценки. - Reciprocal Rank Fusion: SQL-шаблон для объединения ранжирования BM25 и векторного ранжирования, когда однопроходного объединения недостаточно.
- Эмбеддинги:
EMBED()создаёт векторы, с которыми работает индекс ANN. - Обзор векторного индекса: полный справочник по свойствам индекса и шаблонам запросов.
- Обзор инвертированного индекса: токенизаторы, операторы MATCH и выбор анализаторов.
- Практическое руководство по векторному поиску: пошаговое описание от подготовки данных до настройки.
- AI в Doris: как гибридный поиск сочетается с остальными возможностями AI в Doris.