Для создания векторного индекса выполните следующие шаги:
- (Опционально) Подготовка: Настройте расширенные настройки кластера в соответствии с потребностями сервиса.
- (Опционально) Предварительное построение и регистрация векторного центрального пункта: Если алгоритмы индекса IVF_GRAPH и IVF_GRAPH_PQ выбираются при создании векторного индекса, предварительно построьте и зарегистрируйте вектор центральной точки.
- Создание векторного индекса: Создайте векторный индекс в соответствии с потребностями сервиса.
- Импорт векторных данных: Импортируйте векторные данные в кластер.
- Поиск данных с использованием векторного индекса: Выполните векторный поиск.
Предварительные требования
Вы создали кластер, ссылаясь на Выбор спецификаций узлов кластера для векторного поиска. Кластер должен быть кластером Elasticsearch версии 7.6.2 или 7.10.2, либо кластером OpenSearch версии 1.3.6.
(Optional) Подготовка
Перед созданием векторного индекса настройте расширенные параметры для кластера в соответствии с потребностями сервиса.
- При импорте данных в офлайн-режиме вам рекомендуется установить refresh_interval для индексов в -1 чтобы отключить автоматическое обновление индексов и тем самым улучшить производительность пакетной записи.
- Вам рекомендуется установить number_of_replicas в 0. После завершения офлайн-импорта данных вы можете при необходимости снова изменить значение параметра.
- Таблица 1 описывает остальные расширенные настройки.
Таблица 1 Параметры расширенных настроек кластера Параметр
Описание
native.cache.circuit_breaker.enabled
Включать ли circuit breaker для off-heap памяти.
Значение по умолчанию: true
native.cache.circuit_breaker.cpu.limit
Верхний предел использования off-heap памяти векторным индексом.
Например, если общий объём памяти хоста составляет 128 ГБ, а heap‑память занимает 31 ГБ, то значение предела использования off-heap памяти по умолчанию равно 43,65 ГБ, то есть (128 - 31) × 45 %. Если использование off-heap памяти превысит этот предел, circuit breaker будет сработан.
Значение по умолчанию: 45%
native.cache.expiry.enabled
Включать ли политику истечения срока действия кэша. Если этот параметр установлен в истина, некоторые элементы кэша, к которым давно не обращались, будут очищены.
Значение: истина или ложь
Значение по умолчанию: ложь
native.cache.expiry.time
Время истечения.
Значение по умолчанию: 24h
native.vector.index_threads
Количество потоков, используемых для создания базовых индексов. Каждый shard использует несколько потоков. Установите относительно небольшое значение, чтобы избежать вытеснения ресурсов, вызываемого запросами построения слишком большого количества потоков.
Значение по умолчанию: 4
(Опционально) Предварительное построение и регистрация векторного центрального пункта
Если алгоритмы индексации IVF_GRAPH и IVF_GRAPH_PQ выбираются при создании векторного индекса, необходимо предварительно построить и зарегистрировать вектор центральной точки.
Алгоритмы ускорения векторного индекса IVF_GRAPH и IVF_GRAPH_PQ подходят для сверхмасштабных вычислений. Эти два алгоритма позволяют сузить область запроса, разделив векторное пространство на подсубпространства с помощью кластеризации или случайного отбора. Перед предварительным построением необходимо получить все векторы центральных точек с помощью кластеризации или случайного отбора. Векторы центральных точек предварительно строятся в индексах GRAPH или GRAPH_PQ, а затем регистрируются в кластере Elasticsearch. Все узлы в кластере могут совместно использовать этот файл индекса. Повторное использование центрального индекса между шардами может эффективно снизить нагрузку на обучение и количество запросов к центральному индексу, улучшая производительность записи и запросов.
- На Кластеры странице, найдите целевой кластер и нажмите Открыть Kibana в Операция колонка.
- Нажмите Инструменты разработки в дереве навигации слева.
- Создайте таблицу индекса центральных точек.
- Например, если созданный индекс называется my_dict, number_of_shards для индекса должно быть установлено в 1. В противном случае индекс не может быть зарегистрирован.
- Если вы хотите использовать IVF_GRAPH индекс, установите алгоритм центрального индекса точек в GRAPH.
- Если вы хотите использовать IVF_GRAPH_PQ индекс, набор алгоритм для индекса центральной точки GRAPH_PQ.
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"}}}} - Запишите вектор центральной точки в созданный индекс.
Запишите вектор центральной точки, полученный посредством выборки или кластеризации, в созданный my_dict индекс. Для подробностей см Импорт векторных данных.
- Вызовите API регистрации.
Зарегистрируйте созданный my_dict индекс с Dict объект с глобальным уникальным именем идентификатора (dict_name).
PUT _vector/register/my_dict{"dict_name": "my_dict"} - Создайте IVF_GRAPH или IVF_GRAPH_PQ индекс.
Вам не нужно указывать информацию о размерности или метрике. Просто укажите зарегистрированное имя словаря.
PUT my_index{"settings": {"index": {"vector": true,"sort.field": "my_vector.centroid" # Set the centroid subfield of each vector field as a sorting field.}},"mappings": {"properties": {"my_vector": {"type": "vector","indexing": true,"algorithm": "IVF_GRAPH","dict_name": "my_dict","offload_ivf": true}}}}Таблица 2 Параметры сопоставления полей Параметр
Описание
dict_name
Указывает имя зависимого центрального индекса. Размерности вектора и метрики индекса совпадают с размерностями и метриками индекса Dict.
offload_ivf
Выгружает IVF инвертированный индекс, реализованный базовым индексом, в Elasticsearch. Это снижает использование памяти вне кучи и накладные расходы на операции записи и слияния. Рекомендуется установить этот параметр в true.
Значение: true или false
Значение по умолчанию: false
Создание векторного индекса
- Войдите в консоль управления CSS.
- Выберите Кластеры в навигационной панели. На Кластеры странице, найдите целевой кластер и кликните Доступ к Kibana в Операция столбце.
- Нажмите Dev Tools в навигационном дереве слева и выполните следующую команду для создания векторного индекса.
Создайте индекс с именем my_index в котором содержится векторное поле my_vector и текстовое поле my_label. Поле vector создает графовый индекс и использует расстояние Евклида для измерения схожести.
PUT my_index{"settings": {"index": {"vector": true}},"mappings": {"properties": {"my_vector": {"type": "vector","dimension": 2,"indexing": true,"algorithm": "GRAPH","metric": "euclidean"},"my_label": {"type": "keyword"}}}}Таблица 3 Параметры создания индекса Тип
Параметр
Описание
Параметры настроек индекса
вектор
Чтобы использовать векторный индекс, установите этот параметр в true.
Параметры сопоставления полей
тип
Тип поля, например, вектор.
размерность
Размерность вектора. Диапазон значений: [1, 4096]
индексация
Включать ли ускорение векторного индекса.
Значение может быть:
- false: отключает ускорение векторного индекса. Если этот параметр установлен в false, векторные данные записываются только в docvalues, и только ScriptScore и Rescore может использоваться для векторного запроса.
- true: включает ускорение векторного индекса. Если этот параметр установлен в true, создаётся дополнительный векторный индекс. Алгоритм индекса указывается в алгоритм поле и VectorQuery может использоваться для запросов данных.
Значение по умолчанию: false
алгоритм
Алгоритм индекса. Этот параметр действителен только когда индексирование установлен в true.
Значение может быть:
- FLAT: алгоритм грубой силы, вычисляющий расстояние между целевым вектором и всеми векторами последовательно. Алгоритм опирается на чистую вычислительную мощность, и его коэффициент отзыва достигает 100%. Вы можете использовать этот алгоритм, если вам требуется высокая точность отзыва.
- GRAPH: алгоритм Hierarchical Navigable Small Worlds (HNSW) для графовых индексов. Этот алгоритм в основном используется в сценариях, где требуются высокая производительность и точность, и количество записей данных в отдельном шарде менее 10 миллионов.
- GRAPH_PQ: комбинация алгоритма HNSW и алгоритма PQ. Алгоритм PQ уменьшает накладные расходы на хранение оригинальных векторов, позволяя HNSW быстро искать данные среди сотен миллионов записей.
- IVF_GRAPH: комбинация IVF и HNSW. Всё пространство разделено на несколько кластерных центроидов, что делает поиск гораздо быстрее, но немного неточным. Вы можете использовать этот алгоритм, если вам нужна высокая производительность при поиске данных среди сотен миллионов записей.
- IVF_GRAPH_PQ: комбинация алгоритма PQ с алгоритмом IVF или HNSW для дальнейшего повышения ёмкости системы и снижения нагрузки. Этот алгоритм применим в сценариях, где более 1 миллиарда файлов в шардах и требуется высокая производительность извлечения.
Значение по умолчанию: GRAPH
NOTE:Если IVF_GRAPH или IVF_GRAPH_PQ указан, вам необходимо предварительно построить и зарегистрировать индекс центральных точек. Подробности см. (Необязательно) Предварительное построение и регистрация вектора центральной точки.
Другие необязательные параметры
Если Индексация установлен в true, CSS предоставляет необязательные параметры для векторного поиска, которые вы можете настроить для достижения более высокой производительности запросов или точности. Для получения дополнительной информации см Таблица 4.
метрика
Метод расчёта расстояния между векторами.
Значение может быть:
- euclidean: Евклидово расстояние
- inner_product: расстояние внутреннего произведения
- cosine: косинусное расстояние
- hamming: расстояние Хэмминга, которое может использоваться только когда dim_type установлен в бинарный.
Значение по умолчанию: эвклидовский
dim_type
Тип значения размерности вектора.
Значение может быть бинарный и вещественный (по умолчанию).
Таблица 4 Необязательные параметры Тип
Параметр
Описание
Параметры конфигурации графового индекса
соседи
Количество соседей каждого вектора в графовом индексе. Значение по умолчанию 64. Более крупное значение указывает на более высокую точность запроса. Более крупный индекс приводит к более медленному построению и скорости запросов.
Диапазон значений: [10, 255]
уменьшить
Коэффициент обрезки во время построения HNSW. Значение по умолчанию 1.0f.
Диапазон значений: (0.1, 10)
масштабирование
Коэффициент масштабирования узлов верхнего уровня графа во время построения HNSW. Значение по умолчанию 50.
Диапазон значений: (0, 128]
efc
Размер очереди соседнего узла во время построения HNSW. Значение по умолчанию 200. Более высокое значение указывает на более высокую точность и более медленную скорость построения.
Диапазон значений: (0, 100000]
max_scan_num
Максимальное количество узлов, которые могут быть просканированы. Значение по умолчанию 10000. Более высокое значение указывает на большую точность и более медленную скорость индексации.
Диапазон значений: (0, 1000000]
Параметры конфигурации PQ‑индекса
centroid_num
Количество центроидов кластера для каждого фрагмента. Значение по умолчанию — 255.
Диапазон значений: (0, 65535]
fragment_num
Количество фрагментов. Значение по умолчанию — 0. Плагин автоматически устанавливает количество фрагментов на основе длины вектора.
Диапазон значений: [0, 4096]
Импорт векторных данных
Выполните следующую команду для импорта векторных данных. При записи векторных данных в my_index индекс, необходимо указать имя векторного поля и векторные данные.
- Если входные векторные данные представляют собой массив чисел с плавающей запятой, разделённых запятыми (,):POST my_index/_doc{"my_vector": [1.0, 2.0]}
- Если входные векторные данные представляют собой строку Base64, закодированную в формате little endian:
При записи бинарных векторов или высоко‑размерных векторов, в которых большое количество валидных битов, формат кодирования Base64 эффективен для передачи данных и парсинга.
POST my_index/_doc{"my_vector": "AACAPwAAAEA="} - Для записи большого объёма данных рекомендуется выполнять bulk‑операции.POST my_index/_bulk{"index": {}}{"my_vector": [1.0, 2.0], "my_label": "red"}{"index": {}}{"my_vector": [2.0, 2.0], "my_label": "green"}{"index": {}}{"my_vector": [2.0, 3.0], "my_label": "red"}