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

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

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

В этой статье описаны практические операции с векторными индексами. Концептуальную информацию о типах векторных индексов и их характеристиках см. в разделе Векторные индексы в категории "Концепции".

Создание векторных индексов

Векторный индекс можно создать:

Пример создания префиксного векторного индекса с покрывающими колонками:

ALTER TABLE my_table
  ADD INDEX my_index
  GLOBAL USING vector_kmeans_tree
  ON (user, embedding) COVER (data)
  WITH (distance=cosine, type="uint8", dimension=512, levels=2, clusters=128);

Подробное описание параметров векторного индекса смотри в YQL-команде CREATE TABLE.

Поскольку построение векторного индекса требует обработки существующих данных, создание индекса для заполненной таблицы может занять значительное время. Эта операция выполняется в фоновом режиме, позволяя продолжать работу с таблицей во время построения. Индекс становится доступным автоматически после завершения.

Использование векторных индексов для поиска схожести

Для выполнения поиска схожести явно укажите имя индекса в предложении VIEW. Для префиксных индексов включите условия для префиксных колонок в предложение WHERE:

DECLARE $query_vector AS List<Uint8>;

SELECT user, data
FROM my_table VIEW my_index
WHERE user = "john_doe"
ORDER BY Knn::CosineSimilarity(embedding, $query_vector) DESC
LIMIT 10;

Примечание

Без предложения VIEW запрос выполнит полное сканирование таблицы с попарным сравнением векторов.

Проверка стоимости запросов

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

При использовании CLI YDB выберите опцию --stats, чтобы включить вывод статистики после выполнения команды yql. Все SDK YDB также содержат структуры со статистикой, возвращаемой после выполнения запроса. В пользовательском интерфейсе статистика отображается на отдельной вкладке рядом с результатами запроса.

Важно

В текущей версии векторные индексы не поддерживают операции модификации данных.
Любая попытка изменить строки в индексированных таблицах завершится ошибкой.
Это ограничение будет снято в будущих релизах.