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

Creating a Vector Index

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

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

Logging In to OpenSearch Dashboards

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

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

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

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

Выполните следующую команду в OpenSearch Dashboards, чтобы создать векторный индекс.

Например, создать индекс с именем 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 (отключает автоматическое переключение от предварительной фильтрации к полному перебору)

Таблица 2 параметры сопоставлений

Параметр

Обязательно

Тип

Описание

тип

Да

Строка

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

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

измерение

Да

Целое

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

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

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

Нет

Булево

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

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

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

lazy_indexing

Нет

Булево

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

Ленивая индексация вступает в силу только когда индексация установлена в true и версия кластера OpenSearch 2.19.0.

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

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

алгоритм

Нет

Строка

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

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

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

  • FLAT: алгоритм brute-force, который вычисляет расстояние между целевым вектором и всеми векторами последовательно. Алгоритм полагается на огромную вычислительную мощность, и его показатель точности может достигать 100%. Вы можете использовать этот алгоритм, если вам требуется высокая точность поиска.
  • GRAPH (default): Алгоритм Hierarchical Navigable Small Worlds (HNSW) для графовых индексов. Этот алгоритм в основном используется, когда требуются высокая производительность и точность, и количество документов в отдельном шарде достигает 10 миллионов.
  • GRAPH_PQ: комбинация алгоритма HNSW и алгоритма PQ. Алгоритм PQ уменьшает объем хранения оригинальных векторов, чтобы HNSW мог легко искать по сотням миллионов записей.
  • GRAPH_SQ8: комбинация алгоритма HNSW и алгоритма скалярной квантизации (SQ). Путём квантизации значений float32 в int8, этот алгоритм уменьшает объем хранения оригинальных векторов и повышает эффективность построения и запросов. Недостаток — слегка сниженый показатель точности. Этот алгоритм поддерживается только кластерами OpenSearch 2.19.0.
  • GRAPH_SQ4: комбинация алгоритма HNSW и алгоритма SQ. Путём квантизации значений float32 в int4 этот алгоритм уменьшает объём хранения оригинальных векторов и повышает эффективность построения и запросов. Недостаток — слегка сниженый уровень полноты. У SQ4 более высокий коэффициент квантизации/сжатия и более высокая вычислительная эффективность, чем у SQ8, но также наблюдается значительное снижение уровня полноты. Только кластеры OpenSearch 2.19.0 поддерживают этот алгоритм.
  • 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

Нет

Целое

Максимальное количество узлов, которое будет сканировано во время поиска или построения индекса. Большое значение приводит к более высокой точности запросов, но к более медленному индексированию.

Этот параметр доступен только когда индексация установлен в 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. Создайте центрoидный индекс.

    Например, выполните следующую команду в OpenSearch Dashboards, чтобы создать центрoидный индекс с именем 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 регистрации.

    Выполните следующую команду в OpenSearch Dashboards, чтобы зарегистрировать центрированный индекс как объект 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. Это уменьшает использование памяти вне кучи и нагрузку от операций записи и слияния.
    • false (значение по умолчанию): Не выгружать IVF инвертированный индекс.