---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ydb.tech/docs/en/yql/reference/syntax/create_table/vector_index.md?version=main
  - https://ydb.tech/docs/ru/yql/reference/syntax/create_table/vector_index.md?version=main
sourcePath: ru/core/yql/reference/syntax/create_table/vector_index.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

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

[Векторный индекс](https://ydb.tech/docs/ru/dev/vector-indexes.md?version=main) в [строковых](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=main#row-oriented-tables) таблицах создаётся с помощью того же синтаксиса, что и [вторичные индексы](https://ydb.tech/docs/ru/yql/reference/syntax/create_table/secondary_index.md?version=main), при указании `vector_kmeans_tree` в качестве типа индекса. Подмножество доступного для векторных индексов синтаксиса:

```yql
CREATE TABLE `<table_name>` (
    ...
    INDEX `<index_name>`
        GLOBAL
        [SYNC]
        USING vector_kmeans_tree
        ON ( <index_columns> )
        [COVER ( <cover_columns> )]
        [WITH ( <parameter_name> = <parameter_value>[, ...])]
    [,   ...]
)
```

Где:

* `<index_name>` - уникальное имя индекса для доступа к данным
* `SYNC` - указывает на синхронную запись данных в индекс. Это единственная доступная на данный момент опция, явно указывать не обязательно.
* `<index_columns>` - список колонок таблицы через запятую, используемых для поиска по индексу (последняя колонка используется как эмбеддинг, остальные - как фильтрующие колонки)
* `<cover_columns>` - список дополнительных колонок создаваемой таблицы, которые будут сохранены в индексе для возможности их извлечения без обращения к основной таблице
* `<parameter_name>` и `<parameter_value>` - список параметров в формате ключ-значение:

<!-- source: ru/yql/reference/syntax/_includes/vector_index_parameters.md -->
  * общие параметры для всех векторных индексов:
    * `vector_dimension` - размерность вектора эмбеддинга (значение от 1 до 16384);
    * `vector_type` - тип значений вектора (`float`, `uint8` или `int8`);
    * `distance` - [функция расстояния](https://ydb.tech/docs/ru/yql/reference/udf/list/knn.md?version=main#functions-distance) (`cosine`, `manhattan` или `euclidean`), взаимосключающий с `similarity`;
    * `similarity` - [функция схожести](https://ydb.tech/docs/ru/yql/reference/udf/list/knn.md?version=main#functions-distance) (`inner_product` или `cosine`), взаимосключающий с `distance`;
  * специфичные параметры для `vector_kmeans_tree` ([подробнее о типе индекса](https://ydb.tech/docs/ru/dev/vector-indexes.md?version=main#kmeans-tree-type)):
    * `clusters` - количество центроидов для алгоритма k-means (значение от 2 до 2048);
    * `levels` - количество уровней в дереве (значение от 1 до 16);
    * `overlap_clusters` - число ближайших кластеров, в которые будет добавлен каждый вектор (по умолчанию 1);
    * `adaptive_clusters` - для [индексов с фильтрацией](https://ydb.tech/docs/ru/dev/vector-indexes.md?version=main#filtered) автоматически выбирать количество кластеров для каждого значения фильтруемой колонки в зависимости от количества векторов у этого значения (`true` или `false`, по умолчанию `false`). Подробнее см. [Адаптивное количество кластеров](https://ydb.tech/docs/ru/dev/vector-indexes-kmeans-tree-type.md?version=main#adaptive-clusters);
    * общее количество узлов в дереве, рассчитываемое как `clusters` в степени `levels`, должно быть не более чем 1073741824;
    * произведение `vector_dimension` на `clusters` должно быть не более чем 4194304.
<!-- endsource: ru/yql/reference/syntax/_includes/vector_index_parameters.md -->

{% note warning %}

Создавать векторный индекс рекомендуется после загрузки данных в таблицу, так как индекс, созданный на пустой таблице, будет вырожденным и не будет ускорять поиск. Подробности смотрите в разделе [Обновление векторных индексов](https://ydb.tech/docs/ru/dev/vector-indexes.md?version=main#update).

{% endnote %}

<!-- source: ru/_includes/not_allow_for_olap_note.md -->
{% note warning %}

<!-- source: ru/_includes/not_allow_for_olap_text.md -->
Поддерживается только для [строковых](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=main#row-oriented-tables) таблиц. Поддержка функциональности для [колоночных](https://ydb.tech/docs/ru/concepts/datamodel/table.md?version=main#column-oriented-tables) таблиц находится в разработке.
<!-- endsource: ru/_includes/not_allow_for_olap_text.md -->

{% endnote %}
<!-- endsource: ru/_includes/not_allow_for_olap_note.md -->

## Пример

```yql
CREATE TABLE user_articles (
    article_id Uint64,
    user String,
    title String,
    text String,
    embedding String,
    INDEX emb_cosine_idx GLOBAL SYNC USING vector_kmeans_tree
    ON (user, embedding) COVER (title, text)
    WITH (
        distance="cosine",
        vector_type="float",
        vector_dimension=512,
        clusters=128,
        levels=2,
        overlap_clusters=3
    ),
    PRIMARY KEY (article_id)
)
```
