Создайте векторный индекс в кластере Elasticsearch и определите сопоставление, которое содержит векторные поля, включая размерность вектора, алгоритм индексации и методы измерения сходства. Затем сохраните векторы (обычно вместе с исходными данными или метаданными) в этот индекс.
Войдите в Kibana и перейдите на страницу выполнения команд. Кластеры Elasticsearch поддерживают несколько методов доступа. В этом разделе в качестве примера используется Kibana для описания процедур операций.
Левая часть консоли — это поле ввода команды, а треугольный значок в её правом верхнем углу — кнопка выполнения. Правая часть отображает результат выполнения.
Выполните следующую команду в Kibana для создания векторного индекса.
Например, создайте индекс с именем my_index. Этот индекс содержит векторное поле с именем my_vector и текстовое поле с именем my_label. Для векторного поля создаётся графовый индекс, и для измерения сходства используется евклидово расстояние.
PUT my_index{"settings": {"index": {"vector": true,"number_of_shards": 1,"number_of_replicas": 1}},"mappings": {"properties": {"my_vector": {"type": "vector","dimension": 2,"indexing": true,"algorithm": "GRAPH","metric": "euclidean"},"my_label": {"type": "keyword"}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
index.vector | Да | Булево | Включить векторные индексы. Установите этот параметр в true. Иначе векторные индексы не могут быть созданы. |
index.number_of_shards | Нет | Целое | Количество шардов индекса. Это значение должно делиться на количество узлов кластера. Диапазон значений: 1–1024 Значение по умолчанию: 1 |
index.number_of_replicas | Нет | Целое | Количество реплик индекса. Реплики повышают доступность данных. Диапазон значений: от 0 до количества узлов минус 1 Значение по умолчанию: 1 |
index.vector.exact_search_threshold | Нет | Целое | Порог для автоматического переключения от предфильтрации поиска к переборному поиску. Когда размер промежуточного набора результатов в сегменте меньше этого порога, выполняется переборный поиск. Диапазон значений: null (отключает автоматическое переключение от предфильтрации поиска к переборному поиску) или положительное целое число Значение по умолчанию: null (отключает автоматическое переключение от предфильтрации поиска к переборному поиску) |
index.vector.search.concurrency.enabled | Нет | Булево | Включать ли параллельные векторные поиски между сегментами. В Elasticsearch кластере каждый шард индекса состоит из нескольких сегментов. По умолчанию каждый сегмент ищется последовательно. Включение параллельных поисков между сегментами снижает задержку запросов, но не увеличивает максимальную пропускную способность запросов кластера. Кроме того, это может увеличить среднее использование CPU узлами кластера. Этот параметр доступен только для кластеров Elasticsearch 7.10.2, версия образа которых 7.10.2_25.3.0_x.x.x или новее. Диапазон значений:
|
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
тип | Да | Строка | Тип данных поля. Установите этот параметр в вектор для обозначения векторных полей. |
размерность | Да | Целое | Количество измерений вектора. Диапазон значений: 1–4096 |
индексирование | Нет | Логическое | Включает ли ускорение векторного индекса. Диапазон значений:
|
lazy_indexing | Нет | Boolean | Указывает, включить ли отложенное векторное индексирование, при котором векторные индексы не создаются немедленно при вводе данных. Цель — ускорить операции записи. Конфигурация lazy_indexing вступает в силу только когда: индексация установлено в true; версия кластера — Elasticsearch 7.10.2; и версия образа кластера не ранее, чем 7.10.2_24.3.3_x.x.x. Диапазон значений:
|
алгоритм | Нет | String | Алгоритм векторной индексации. Этот параметр действителен только когда индексирование установлен в true. Когда этот параметр установлен в IVF_GRAPH или IVF_GRAPH_PQ, (Опционально) Предварительное построение и регистрация центроидных векторов необходимо. Диапазон значений:
|
dim_type | Нет | String | Векторный тип данных. Диапазон значений:
|
метрика | Нет | String | Метрика расстояния между векторами, измеряющая сходство или расстояние между векторами. Диапазон значений:
|
Параметр | Обязательный | Тип | Описание |
|---|---|---|---|
соседи | Нет | Целое | Количество соседей каждого вектора в графовом индексе. Большее значение приводит к более высокой точности запросов, но замедляет построение индекса и выполнение запросов. Этот параметр доступен только когда индексирование устанавливается в true, и алгоритм является GRAPH, GRAPH_PQ, GRAPH_SQ8 или GRAPH_SQ4. Диапазон значений: 20–255 Значение по умолчанию: 64 |
уменьшить | Нет | Float | Насколько агрессивно граф HNSW удаляет избыточные ребра во время построения. Эта настройка влияет на структуру графа HNSW. Значение по умолчанию: 1.0f Этот параметр доступен только когда индексирование установлен в true, и алгоритм является GRAPH, GRAPH_PQ, GRAPH_SQ8 или GRAPH_SQ4. Диапазон значений: 0.1–10 Значение по умолчанию: 1 |
масштабирование | Нет | Целое число | Коэффициент масштабирования количества узлов верхнего уровня графа в HNSW графе. Эта настройка влияет на слои HNSW графа. Этот параметр доступен только когда индексирование установлен в true, и алгоритм является GRAPH, GRAPH_PQ, GRAPH_SQ8 или GRAPH_SQ4. Диапазон значений: 0–128 Значение по умолчанию: 50 |
efc | Нет | Целое число | Сколько ближайших соседей исследовать при вставке нового вектора в HNSW граф. Большее значение приводит к более высокой точности, но к более медленному построению индекса. Этот параметр доступен только когда индексирование установлен в true, и алгоритм является GRAPH, GRAPH_PQ, GRAPH_SQ8, или GRAPH_SQ4. Диапазон значений: 0–100000 Значение по умолчанию: 200 |
max_scan_num | Нет | Integer | Максимальное количество узлов, сканируемых во время поиска или построения индекса. Более высокое значение приводит к более высокой точности запросов, но к более медленной индексации. Этот параметр доступен только когда индексация установлен в true, и алгоритм является GRAPH, GRAPH_PQ, GRAPH_SQ8, или GRAPH_SQ4. Диапазон значений: 0 до 1000000 Значение по умолчанию: 10000 |
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
centroid_num | Нет | Целое | Количество центроидов, используемых на этапе грубой квантизации алгоритма. Оно влияет на гранулярность квантизации и объём хранения. Этот параметр доступен только когда индексация установлен в true, и алгоритм равен GRAPH_PQ. Диапазон значений: 0–65535 Значение по умолчанию: 255 |
fragment_num | Нет | Целое число | Количество фрагментов, на которые разбивается каждый вектор. Это влияет на гранулярность PQ квантизации. Значение по умолчанию 0. Плагин автоматически задает количество фрагментов на основе длины вектора. Этот параметр доступен только когда индексирование установлено в true, и алгоритм является GRAPH_PQ. Диапазон значений: 0–4096 Значение по умолчанию: 0. Плагин автоматически задает количество фрагментов на основе длины вектора. |
Когда используется алгоритм IVF_GRAPH или IVF_GRAPH_PQ для векторного индексирования, необходимо предварительно построить и зарегистрировать векторы центроидов.
IVF_GRAPH и IVF_GRAPH_PQ помогают ускорить индексирование и запросы в ультра‑крупномасштабных кластерах. Они позволяют сузить область запроса, разделяя векторное пространство на подпространства с помощью кластеризации или случайного отбора. Перед предварительным построением необходимо получить все векторы центроидов с помощью кластеризации или случайного отбора. Векторы центроидов предварительно построены в индекс GRAPH или GRAPH_PQ и затем регистрируются в кластере Elasticsearch. Все узлы кластера могут использовать этот индекс. Повторное использование индекса центроидов между шардов может эффективно уменьшить накладные расходы на обучение и количество запросов к индексу центроидов, улучшая производительность записи и запросов.
Например, выполните следующую команду в Kibana, чтобы создать индекс центроидов с именем my_dict:
PUT my_dict{"settings": {"index": {"vector": true},"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"properties": {"my_vector": {"type": "vector","dimension": 2,"indexing": true,"algorithm": "GRAPH","metric": "euclidean"}}}}
Для подробной настройки параметров смотрите Создание векторного индекса. Обратите внимание на следующие обязательные параметры:
Выполните следующую команду в Kibana, чтобы зарегистрировать центроидный индекс как объект Dict с глобально уникальным именем (dict_name):
PUT _vector/register/my_dict{"dict_name": "my_dict"}
При создании векторного индекса вам не требуется указывать размерность или метрика. Вместо этого вы указываете зарегистрированный объект Dict. Таблица 5 описывает ключевые параметры для указания объекта Dict. Для получения подробностей о других параметрах смотрите Создание векторного индекса.
Например, выполните следующую команду для создания векторного индекса IVF_GRAPH:
PUT my_index{"settings": {"index": {"vector": true,"sort.field": "my_vector.centroid" # Set the centroid subfield of each vector field as a ranking field.}},"mappings": {"properties": {"my_vector": {"type": "vector","indexing": true,"algorithm": "IVF_GRAPH","dict_name": "my_dict","offload_ivf": true}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
dict_name | Да | Строка | Имя индекса центроидов. Например, my_dict. Размерности вектора и метрики индекса должны быть одинаковыми с теми, что у индекса Dict. |
offload_ivf | Да | Булевый | Нужно ли выгружать IVF обратный индекс в Elasticsearch. Значение: true или false.
|