Облачная платформаAdvanced

Создание векторного индекса

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Создайте векторный индекс в кластере Elasticsearch и определите сопоставление, которое содержит векторные поля, включая размерность вектора, алгоритм индексации и методы измерения сходства. Затем сохраните векторы (обычно вместе с исходными данными или метаданными) в этот индекс.

Вход в Kibana

Войдите в Kibana и перейдите на страницу выполнения команд. Кластеры Elasticsearch поддерживают несколько методов доступа. В этом разделе в качестве примера используется Kibana для описания процедур операций.

  1. Войдите в консоль управления CSS.
  2. В левой навигационной панели выберите Clusters > Elasticsearch.
  3. В списке кластеров найдите целевой кластер и нажмите Kibana в Операция в столбце для входа в консоль Kibana.
  4. В левой навигационной панели выберите Инструменты разработки.

    Левая часть консоли — это поле ввода команды, а треугольный значок в её правом верхнем углу — кнопка выполнения. Правая часть отображает результат выполнения.

Создание векторного индекса

Выполните следующую команду в 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"
}
}
}
}
Таблица 1 параметры настройки

Параметр

Обязательно

Тип

Описание

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 или новее.

Диапазон значений:

  • true: Включает параллельный поиск.
  • false (default): Выполняет последовательный поиск.

Таблица 2 параметры mappings

Параметр

Обязательно

Тип

Описание

тип

Да

Строка

Тип данных поля.

Установите этот параметр в вектор для обозначения векторных полей.

размерность

Да

Целое

Количество измерений вектора.

Диапазон значений: 1–4096

индексирование

Нет

Логическое

Включает ли ускорение векторного индекса.

Диапазон значений:

  • true: Включает ускорение векторного индекса. Когда этот параметр установлен в true, создаётся дополнительный векторный индекс. Алгоритм индексирования указывается алгоритм поле, и индекс поддерживает векторный поиск.
  • false: Отключает ускорение векторного индекса. Когда этот параметр установлен в false, данные вектора записываются только в docvalues, и только ScriptScore и Пересчёт может использоваться для векторного поиска.

lazy_indexing

Нет

Boolean

Указывает, включить ли отложенное векторное индексирование, при котором векторные индексы не создаются немедленно при вводе данных. Цель — ускорить операции записи.

Конфигурация lazy_indexing вступает в силу только когда: индексация установлено в true; версия кластера — Elasticsearch 7.10.2; и версия образа кластера не ранее, чем 7.10.2_24.3.3_x.x.x.

Диапазон значений:

  • true: Включает отложенное индексирование. Векторные индексы (например, основанные на графе) не создаются немедленно при вводе данных. Вместо этого, (Optional) Постобработка после ввода данных: Офлайн построение индекса необходимо выполнить для создания векторных индексов. Затем векторные индексы могут использоваться для векторного поиска.
  • false (по умолчанию): Отключает отложенную индексацию.

алгоритм

Нет

String

Алгоритм векторной индексации.

Этот параметр действителен только когда индексирование установлен в true. Когда этот параметр установлен в IVF_GRAPH или IVF_GRAPH_PQ, (Опционально) Предварительное построение и регистрация центроидных векторов необходимо.

Диапазон значений:

  • FLAT: грубый переборный алгоритм, который вычисляет расстояние между целевым вектором и всеми векторами последовательно. Алгоритм опирается на огромную вычислительную мощность и его показатель recall rate может достигать 100%. Вы можете использовать этот алгоритм, если вам требуется высокая точность recall.
  • GRAPH (default): алгоритм Hierarchical Navigable Small Worlds (HNSW) для графовых индексов. Этот алгоритм в основном используется, когда требуется высокая производительность и точность, и количество документов в отдельном шарде достигает 10 миллионов.
  • GRAPH_PQ: комбинация алгоритма HNSW и алгоритма PQ. Алгоритм PQ уменьшает затраты на хранение оригинальных векторов, позволяя HNSW легко искать по сотням миллионов записей.
  • GRAPH_SQ8: комбинация алгоритма HNSW и алгоритма скалярной квантизации (SQ). Квантизируя значения float32 в int8, этот алгоритм уменьшает затраты на хранение оригинальных векторов и повышает эффективность построения и запросов. Минусом является небольшое снижение recall rate. Поддержка этого алгоритма доступна только в кластерах Elasticsearch 7.10.2.
  • GRAPH_SQ4: комбинация алгоритма HNSW и алгоритма SQ. Квантуя значения float32 в int4, этот алгоритм уменьшает накладные расходы на хранение оригинальных векторов и повышает эффективность построения и запросов. Недостаток — слегка сниженый recall rate. SQ4 имеет более высокий коэффициент квантизации/компрессии и более высокую вычислительную эффективность, чем SQ8, но также большой спад recall rate. Только кластеры Elasticsearch 7.10.2 поддерживают этот алгоритм.
  • IVF_GRAPH: комбинация IVF и HNSW. Всё пространство делится на несколько центроидов кластеров, что делает поиск гораздо быстрее, но слегка неточным. Вы можете использовать этот алгоритм, если требуется высокая производительность при поиске по сотням миллионов записей.
  • IVF_GRAPH_PQ: комбинация алгоритма PQ с алгоритмом IVF или HNSW для дальнейшего повышения ёмкости системы и снижения её накладных расходов. Этот алгоритм применим, когда в шардах более 1 миллиарда документов и требуется высокая производительность извлечения.

Когда алгоритм индексирования установлен в GRAPH, GRAPH_PQ, GRAPH_SQ8 или GRAPH_SQ4, CSS предоставляет дополнительные параметры, как показано в Таблица 3 и Таблица 4, которую вы можете выбрать для настройки с целью повышения производительности запросов и точности.

dim_type

Нет

String

Векторный тип данных.

Диапазон значений:

  • binary: бинарное значение
  • float (по умолчанию): число с плавающей точкой

метрика

Нет

String

Метрика расстояния между векторами, измеряющая сходство или расстояние между векторами.

Диапазон значений:

  • euclidean (по умолчанию): Евклидовое расстояние
  • inner_product: расстояние внутреннего произведения
  • cosine: косинусное расстояние
  • hamming: Расстояние Хэмминга, которое может использоваться только когда dim_type устанавливается в бинарный.
Таблица 3 Необязательные параметры для алгоритма индексирования GRAPH

Параметр

Обязательный

Тип

Описание

соседи

Нет

Целое

Количество соседей каждого вектора в графовом индексе. Большее значение приводит к более высокой точности запросов, но замедляет построение индекса и выполнение запросов.

Этот параметр доступен только когда индексирование устанавливается в 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

Таблица 4 Опциональные параметры для алгоритма индексации GRAPH_PQ

Параметр

Обязательно

Тип

Описание

centroid_num

Нет

Целое

Количество центроидов, используемых на этапе грубой квантизации алгоритма. Оно влияет на гранулярность квантизации и объём хранения.

Этот параметр доступен только когда индексация установлен в true, и алгоритм равен GRAPH_PQ.

Диапазон значений: 0–65535

Значение по умолчанию: 255

fragment_num

Нет

Целое число

Количество фрагментов, на которые разбивается каждый вектор. Это влияет на гранулярность PQ квантизации.

Значение по умолчанию 0. Плагин автоматически задает количество фрагментов на основе длины вектора.

Этот параметр доступен только когда индексирование установлено в true, и алгоритм является GRAPH_PQ.

Диапазон значений: 0–4096

Значение по умолчанию: 0. Плагин автоматически задает количество фрагментов на основе длины вектора.

(Optional) Предварительное построение и регистрация векторных центроидов

Когда используется алгоритм IVF_GRAPH или IVF_GRAPH_PQ для векторного индексирования, необходимо предварительно построить и зарегистрировать векторы центроидов.

IVF_GRAPH и IVF_GRAPH_PQ помогают ускорить индексирование и запросы в ультра‑крупномасштабных кластерах. Они позволяют сузить область запроса, разделяя векторное пространство на подпространства с помощью кластеризации или случайного отбора. Перед предварительным построением необходимо получить все векторы центроидов с помощью кластеризации или случайного отбора. Векторы центроидов предварительно построены в индекс GRAPH или GRAPH_PQ и затем регистрируются в кластере Elasticsearch. Все узлы кластера могут использовать этот индекс. Повторное использование индекса центроидов между шардов может эффективно уменьшить накладные расходы на обучение и количество запросов к индексу центроидов, улучшая производительность записи и запросов.

  1. Создайте индекс центроидов.

    Например, выполните следующую команду в 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"
    }
    }
    }
    }

    Для подробной настройки параметров смотрите Создание векторного индекса. Обратите внимание на следующие обязательные параметры:

    • index.number_of_shards: Количество шардов индекса должно быть установлено в 1. Иначе центроидный индекс не может быть зарегистрирован.
    • индексирование: Этот параметр должен быть установлен в true для включения ускорения векторного индекса.
    • алгоритм: Установите алгоритм индексирования. Установите его в GRAPH для алгоритма IVF_GRAPH и GRAPH_PQ, если используется алгоритм IVF_GRAPH_PQ.

  2. Запишите векторные центроиды в созданный индекс. Запишите векторные центроиды, полученные методом выборки или кластеризации, в вновь созданный индекс my_dict.
  3. Вызовите API регистрации.

    Выполните следующую команду в Kibana, чтобы зарегистрировать центроидный индекс как объект Dict с глобально уникальным именем (dict_name):

    PUT _vector/register/my_dict
    {
    "dict_name": "my_dict"
    }
  4. Создайте векторный индекс IVF_GRAPH или IVF_GRAPH_PQ.

    При создании векторного индекса вам не требуется указывать размерность или метрика. Вместо этого вы указываете зарегистрированный объект 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
    }
    }
    }
    }
    Таблица 5 Параметры сопоставления полей

    Параметр

    Обязательно

    Тип

    Описание

    dict_name

    Да

    Строка

    Имя индекса центроидов. Например, my_dict. Размерности вектора и метрики индекса должны быть одинаковыми с теми, что у индекса Dict.

    offload_ivf

    Да

    Булевый

    Нужно ли выгружать IVF обратный индекс в Elasticsearch.

    Значение: true или false.

    • true (рекомендованное значение): Выгружает IVF обратный индекс, реализованный базовым индексом, в Elasticsearch. Это снижает использование off-heap памяти и накладные расходы на операции записи и слияния.
    • false (значение по умолчанию): Не выгружать IVF обратный индекс.