VIEW (Векторный индекс)
Важно
Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.
Внимание
Фукциональность векторных индексов доступна, начиная с версии 25.1.2
.
Для включения векторных индексов необходимо установить значение feature flag enable_vector_index
в true
.
В настоящее время не поддерживается:
- Обновление индекса: модифицировать основную таблицу можно, но существующий индекс не обновится. Нужно построить новый индекс, чтобы учесть изменения. При необходимости, можно атомарно заменить существующий индекс на вновь построенный.
- Построение индекса для векторов c битовым квантованием.
Эти ограничения могут быть устранены в будущих версиях.
Для выполнения запроса SELECT
с использованием векторного индекса в строчно-ориентированной таблице используйте следующий синтаксис:
SELECT ...
FROM TableName VIEW IndexName
WHERE ...
ORDER BY Knn::DistanceFunction(...)
LIMIT ...
SELECT ...
FROM TableName VIEW IndexName
WHERE ...
ORDER BY Knn::SimilarityFunction(...) DESC
LIMIT ...
Примечание
Векторный индекс поддерживает функцию расстояния или сходства расширения Knn, выбранную при создании индекса.
Векторный индекс не будет автоматически выбран оптимизатором, поэтому его нужно указывать явно с помощью выражения VIEW IndexName
.
KMeansTreeSearchTopSize
Векторный поиск по индексу основан на приближённом алгоритме (ANN, Approximate Nearest Neighbors). Это значит, что результат поиска по векторному индексу может отличаться от результата поиска при полном сканировании таблицы.
Полнота поиска по индексу может быть отрегулирована параметром: PRAGMA ydb.KMeansTreeSearchTopSize
.
Данный параметр задаёт максимальное число сканируемых кластеров, ближайших к запрашиваемому вектору, на каждом уровне дерева поиска.
Необходимо явно задавать значение данного параметра для каждого запроса.
Значение по умолчанию - 1. То есть, по умолчанию сканируется только 1 ближайший кластер на каждом уровне дерева поиска. Такое значение оптимально с точки зрения производительности и будет достаточным для векторов, близких к центру какого-либо кластера. Однако для векторов, примерно одинаково близких к нескольким кластерам, значения 1 не достаточно. Для увеличения полноты поиска (ценой некоторого замедления) следует увеличить значение PRAGMA, например:
PRAGMA ydb.KMeansTreeSearchTopSize="10";
SELECT *
FROM TableName VIEW IndexName
ORDER BY Knn::CosineDistance(embedding, $target)
LIMIT 10
Примеры
-
Выбор всех полей из таблицы
series
с использованием векторного индексаviews_index
, созданного дляembedding
с мерой близости "косинусное расстояние":SELECT series_id, title, info, release_date, views, uploaded_user_id, Knn::CosineSimilarity(embedding, $target) as similarity FROM series VIEW views_index ORDER BY similarity DESC LIMIT 10
-
Выбор всех полей из таблицы
series
с использованием векторного индекса с фильтрациейviews_filtered_index
, созданного дляembedding
с мерой близости "косинусное расстояние" и с ускорением фильтрации по колонкеrelease_date
:SELECT series_id, title, info, release_date, views, uploaded_user_id, Knn::CosineSimilarity(embedding, $target) as similarity FROM series VIEW views_filtered_index WHERE release_date = "2025-03-31" ORDER BY similarity DESC LIMIT 10