Векторный индекс
Кратко В Apache Doris 4.0 появился встроенный ANN-индекс для столбцов
ARRAY<FLOAT>. Индекс объявляется непосредственно вCREATE TABLE(или с помощьюCREATE INDEX ... USING ANN); выберите HNSW или IVF, затем L2 или скалярное произведение и вызовитеl2_distance_approximateилиinner_product_approximateвORDER BY ... LIMIT k. Векторный индекс построен на Faiss и выполняет предварительную фильтрацию перед TopN, поэтому предикатыWHEREучитываются корректно.

Зачем использовать векторный индекс в Apache Doris?
Векторный индекс Apache Doris избавляет от необходимости держать отдельную векторную базу данных рядом с аналитическим хранилищем. Обычно, когда нужен векторный поиск, добавляют второй кластер. Это работает, но платить приходится дважды: деньгами и затратами на эксплуатацию двух систем, в одной из которых находятся фильтры по ключевым словам, а в другой эмбеддинги.
- Отдельный кластер, для которого нужно подбирать ресурсы, настраивать мониторинг и оплачивать работу, только чтобы ответить на запрос «найти 10 ближайших векторов».
- Расхождения между аналитической таблицей и векторным хранилищем, когда строку обновляют в одной системе, но не в другой.
- Связующий код в приложении, который отправляет запрос в обе системы и объединяет результаты, потому что SQL-движок не видит векторы.
Apache Doris размещает векторный индекс в той же таблице, что и остальные данные. Данные поступают по одному конвейеру, а результат возвращает один SQL-запрос.
Что такое векторный индекс Apache Doris?
Векторный индекс Apache Doris представляет собой вторичный ANN-индекс (Approximate Nearest Neighbor, приближённый поиск ближайших соседей) для столбца с векторами. Новый тип столбца не требуется: векторы хранятся как ARRAY<FLOAT> фиксированной размерности. Индекс располагается рядом с данными, строится на уровне сегментов и используется, когда планировщик обнаруживает функцию приближённого вычисления расстояния в ORDER BY.
Основные термины
ARRAY<FLOAT>: способ хранения вектора в Apache Doris. Столбец должен бытьNOT NULL, а длина массива в каждой строке должна совпадать с параметром индексаdim.USING ANN: конструкция объявления индекса. Свойства задают алгоритм (hnsw,ivf,ivf_on_disk), метрику (l2_distanceилиinner_product) и размерность.- HNSW: алгоритм на основе графа, используемый по умолчанию. Быстрый, с высокой полнотой поиска; индекс должен находиться в памяти.
- IVF / IVF on-disk: алгоритмы на основе инвертированных списков для больших наборов данных при ограниченном объёме памяти.
l2_distance_approximate/inner_product_approximate: SQL-функции, которые задействуют индекс. Существуют и версии без суффикса_approximate, но они выполняют сканирование полным перебором.
Как работает векторный индекс Apache Doris?
Жизненный цикл векторного индекса Apache Doris состоит из пяти этапов: построение при загрузке, распознавание шаблона запроса, предварительная фильтрация, объединение TopN по сегментам и настройка полноты поиска параметрами сеанса.
- Построение при загрузке. При записи сегмента Apache Doris передаёт столбец в Faiss и создаёт файл индекса рядом с данными. На каждый сегмент приходится один индекс, отдельное задание для построения не требуется.
- Распознавание шаблона при планировании. Запрос с
ORDER BY l2_distance_approximate(col, [...]) LIMIT kпреобразуется в операторAnnTopNна уровне хранения. Векторный литерал передаётся на этот уровень вместе с LIMIT. - Предварительная фильтрация, затем TopN. Если есть конструкция
WHERE, Apache Doris сначала вычисляет предикат, а затем выполняет ANN TopN для оставшихся строк. Это сохраняет полноту поиска при фильтрах с высокой избирательностью. Столбцы предиката должны иметь собственный вторичный индекс, например инвертированный; иначе движок переходит к полному перебору этих строк, чтобы обеспечить корректность результатов. - Локальный TopN для каждого сегмента, затем объединение. Каждый сегмент возвращает свои k ближайших векторов. Оператор TopN объединяет результаты сегментов и таблетов, чтобы получить глобальные k ближайших векторов.
- Настройка при выполнении запроса. Переменные сеанса, такие как
hnsw_ef_search, расширяют очередь кандидатов для повышения полноты поиска ценой увеличения задержки. Значения по умолчанию консервативны; корректируйте их, если у вас есть целевой уровень полноты.
Быстрый старт
CREATE TABLE docs (
id INT NOT NULL,
embedding ARRAY<FLOAT> NOT NULL,
INDEX idx_emb (embedding) USING ANN PROPERTIES(
"index_type" = "hnsw",
"metric_type" = "l2_distance",
"dim" = "3"
)
) DUPLICATE KEY(id) DISTRIBUTED BY HASH(id) BUCKETS 1;
INSERT INTO docs VALUES
(1, [1.0, 2.0, 3.0]),
(2, [0.5, 2.1, 2.9]),
(3, [10.0, 10.0, 10.0]);
SELECT id, l2_distance_approximate(embedding, [1.0, 2.0, 3.0]) AS dist
FROM docs ORDER BY dist LIMIT 3;
Ожидаемый результат
+------+------------+
| id | dist |
+------+------------+
| 1 | 0 |
| 2 | 0.51961523 |
| 3 | 13.928389 |
+------+------------+
Для id=1 запрос даёт точное совпадение (расстояние 0). ANN-индекс ставит двух близких соседей первыми, а удалённый вектор последним. Запрос той же формы к набору данных SIFT-1M (1 миллион векторов размерности 128) выполняется примерно за 20 мс с индексом и примерно за 290 мс без него; оба показателя приведены в обзоре векторного поиска.
Когда стоит использовать векторный индекс Apache Doris?
Векторный индекс Apache Doris подходит для любой нагрузки, при которой эмбеддинги находятся в той же таблице, что и структурированные столбцы, по которым вы уже выполняете фильтрацию и агрегацию.
Подходящие сценарии
- Поиск для RAG, когда в той же таблице хранятся идентификатор арендатора, тип документа, время и другие столбцы фильтрации. Фильтрация и векторный поиск выполняются в одном запросе.
- Отбор кандидатов для рекомендаций и функции «найти похожее», когда эмбеддинги хранятся рядом с метаданными товаров или контента, которые уже используются в остальных дашбордах.
- Обнаружение аномалий или задачи вида «найти всё в пределах расстояния X», для которых используется приближённый поиск по диапазону (
WHERE l2_distance_approximate(...) > 300). - Гибридный поиск, сочетающий текстовые предикаты
MATCH_*с ранжированием по векторам. Инвертированный индекс выполняет предварительную фильтрацию, а ANN-индекс ранжирует результаты. См. раздел Гибридный поиск.
Неподходящие сценарии
- Только ANN-поиск по миллиарду векторов без фильтров и SQL-аналитики. Специализированная векторная база данных может быть дешевле в эксплуатации и потреблять меньше памяти на единицу QPS.
- Таблицы
AGGREGATE KEYилиUNIQUE KEYбез merge-on-write. Сейчас ANN-индексы требуютDUPLICATE KEYили MoWUNIQUE KEY. - Векторные столбцы, допускающие NULL, или строки с несовпадающей длиной массива. Столбец должен быть
NOT NULL ARRAY<FLOAT>, а длина массива в каждой строке должна точно соответствовать объявленномуdim. Загрузка данных с неверной формой завершается ошибкой. score()вместе с функцией расстояния в одномORDER BY. Передача TopN на уровень хранения поддерживает одно выражение сортировки; если нужно объединить оценки BM25 и ANN, выполняйте это объединение на уровне выше SQL.- Косинусное сходство через вызов
cosine_distance. В Apache Doris нет косинусной метрики; нормализуйте векторы перед вставкой и используйтеinner_product. Для векторов единичной длины косинусное сходство равно скалярному произведению.
Производительность и показатели
Приведённые ниже показатели взяты из опубликованного проектом теста производительности на Cohere-MEDIUM-1M (размерность 768, 1M векторов, FE 32C 64GB + BE 32C 64GB).
| Число параллельных запросов | Вариант | QPS | Средняя задержка | Задержка P99 | Полнота |
|---|---|---|---|---|---|
| 240 | HNSW (FLAT) | 3,340 | 71 мс | 163 мс | 91.0% |
| 240 | HNSW + SQ INT8 | 3,189 | 75 мс | 160 мс | 88.3% |
| 240 | Полный перебор (без индекса) | 3.7 | 25.6 с | 29.4 с | 100% |
Источник: Производительность векторного индекса. Используйте эти показатели как ориентир, а не как гарантию для вашей нагрузки. На той же странице указано, что квантование SQ8 уменьшает индекс примерно до трети размера FLAT при небольшом снижении полноты, показанном выше.
Дополнительные материалы
- Гибридный поиск: как объединить ANN-индекс и инвертированный индекс в одном SQL-запросе.
- Обзор векторного поиска: полный справочник по свойствам индекса, шаблонам запросов и ограничениям.
- Подробно о HNSW: как
max_degree,ef_constructionиef_searchвлияют на соотношение полноты поиска и задержки. - IVF on-disk: вариант для случаев, когда набор векторов больше не помещается в памяти BE.
- Практическое руководство: пошаговый разбор всего процесса, включая подготовку данных, загрузку и настройку.
- Эмбеддинги: SQL-функция
EMBED(), которая преобразует текст и медиаданные в векторыARRAY<FLOAT>, используемые этим индексом. - Обзор возможностей AI: как векторный поиск сочетается с остальными возможностями AI в Doris.