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

Векторный индекс

Кратко В 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: встроенный ANN-индекс для столбцов ARRAY из элементов FLOAT. Создайте его в таблице Doris и выполняйте векторный поиск TopN за миллисекунды вместе с аналитическими SQL-запросами.

Зачем использовать векторный индекс в 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 по сегментам и настройка полноты поиска параметрами сеанса.

  1. Построение при загрузке. При записи сегмента Apache Doris передаёт столбец в Faiss и создаёт файл индекса рядом с данными. На каждый сегмент приходится один индекс, отдельное задание для построения не требуется.
  2. Распознавание шаблона при планировании. Запрос с ORDER BY l2_distance_approximate(col, [...]) LIMIT k преобразуется в оператор AnnTopN на уровне хранения. Векторный литерал передаётся на этот уровень вместе с LIMIT.
  3. Предварительная фильтрация, затем TopN. Если есть конструкция WHERE, Apache Doris сначала вычисляет предикат, а затем выполняет ANN TopN для оставшихся строк. Это сохраняет полноту поиска при фильтрах с высокой избирательностью. Столбцы предиката должны иметь собственный вторичный индекс, например инвертированный; иначе движок переходит к полному перебору этих строк, чтобы обеспечить корректность результатов.
  4. Локальный TopN для каждого сегмента, затем объединение. Каждый сегмент возвращает свои k ближайших векторов. Оператор TopN объединяет результаты сегментов и таблетов, чтобы получить глобальные k ближайших векторов.
  5. Настройка при выполнении запроса. Переменные сеанса, такие как 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 или MoW UNIQUE 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Полнота
240HNSW (FLAT)3,34071 мс163 мс91.0%
240HNSW + SQ INT83,18975 мс160 мс88.3%
240Полный перебор (без индекса)3.725.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.