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
    
Предыдущая
Следующая