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

Performing Vector Search

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

CSS‑векторная база данных поддерживает разнообразные методы запросов, включая стандартный запрос, гибридный запрос, запрос script_score, запрос rescore и расширение синтаксиса painless. Они обеспечивают эффективный поиск векторных данных, удовлетворяя разнообразные потребности поиска.

  • Standard Query: извлекает документы, наиболее похожие на вектор запроса.
  • Hybrid Query: комбинирует векторный поиск с традиционными запросами OpenSearch, такими как предварительная фильтрация и булевы запросы.
  • Script Score Query: позволяет выполнять пользовательские расчёты сходства для векторных поисков, исполняя пользовательский скрипт.
  • Rescore Query: переоценивает и переупорядочивает лучшие результаты, возвращённые первоначальным запросом, чтобы улучшить полноту.
  • Painless Syntax Extension: позволяет использовать функции расчёта векторного расстояния или сходства в пользовательских скриптах.

Standard Query

Standard query используется для получения документов, наиболее похожих на вектор запроса.

Следующая команда вернёт k (указанным Размер/topk) записи, которые являются наиболее близкими совпадениями с вектором запроса.

POST my_index/_search
{
"size":2,
"_source": false,
"query": {
"vector": {
"my_vector": {
"vector": [1, 1],
"topk":2
}
}
}
}
Таблица 1 Параметры для стандартного запроса

Параметр

Обязательно

Тип

Описание

Размер

Да

Целое

Количество возвращаемых результатов поиска.

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

_source

Нет

Булево

Возвращать ли исходный текст в документах. Чтобы сократить передачу данных и повысить производительность запросов, установите этот параметр в false.

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

  • true (по умолчанию): Возвращает исходный текст.
  • false: Не возвращать исходный текст.

запрос

Да

Карта

Указывает вектор запроса.

Параметры:

вектор (обязательно): указывает векторный запрос (поиск на основе сходства векторов), включая поле вектора и значение вектора запроса.

my_vector (обязательно): запрашиваемое поле вектора (например, my_vector).

вектор (подпараметр)

Да

Массив/Строка

Запросное значение вектора. Оно используется для расчёта схожести между проиндексированными векторами и запросным вектором.

Значение может быть массивом (например, [1, 1]) или значением, закодированным в Base64 (например, AAABAAACAAAD).

topk

Да

Целое число

Количество наиболее похожих или релевантных результатов, которые следует вернуть.

Значение по умолчанию: то же, что размер.

ef

Нет

Целое число

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

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

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

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

max_scan_num

Нет

Целое

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

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

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

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

nprobe

Нет

Целое

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

Этот параметр доступен только когда алгоритм равен IVF_GRAPH или IVF_GRAPH_PQ.

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

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

Hybrid Query

Hybrid query сочетает векторный поиск с традиционными запросами OpenSearch, такими как предварительная фильтрация и булевы запросы.

Только кластеры OpenSearch 2.19.0 поддерживают предварительную фильтрацию.

В следующем примере верхние 10 записей, у которых my_label значение равно red будут возвращены.

  • Pre-filtering query

    Сначала применяются фильтры для получения соответствующих результатов. Затем выполняется векторный поиск по этим результатам, чтобы получить наиболее релевантные векторы на основе схожести.

    Ниже приведён пример:

    POST my_index/_search
    {
    "size": 10,
    "query": {
    "vector": {
    "my_vector": {
    "vector": [1, 2],
    "topk": 10,
    "filter": {
    "term": { "my_label": "red" }
    }
    }
    }
    }
    }

    Таблица 2 Параметры предфильтрации запроса

    Параметр

    Обязательно

    Тип

    Описание

    фильтр

    Да

    Карта

    Фильтры векторных запросов. Поддерживаются стандартные фильтры запросов OpenSearch, такие как term и range.

    Если фильтр слишком ограничительный, приводя к небольшому промежуточному набору результатов, вы можете установить index.vector.exact_search_threshold параметр, так чтобы когда промежуточный набор результатов меньше этого порога, запрос предварительной фильтрации автоматически переключается на запрос brute-force (алгоритм FLAT), который обеспечивает высокий коэффициент полноты. Для получения дополнительной информации см Создание векторного индекса.

    терм

    Нет

    Карта

    Запрос term — это тип точного запроса. Документы, содержащие точный термин, будут возвращены. Например, {"term": {"my_label": "red"}} означает только возвращать документы, у которых my_label значение равно красный.

  • Булевый запрос

    Булевый запрос, по сути, является методом пост-фильтрации. Фильтрация и поиск на основе векторного сходства выполняются отдельно. Затем результаты двух запросов объединяются с использованием булевой логики, определяемой клаузулами, такими как must, should и filter.

    Следующее является примером:

    POST my_index/_search
    {
    "size": 10,
    "query": {
    "bool": {
    "must": {
    "vector": {
    "my_vector": {
    "vector": [1, 2],
    "topk": 10
    }
    }
    },
    "filter": {
    "term": { "my_label": "red" }
    }
    }
    }
    }

    Таблица 3 Параметры Boolean-запроса

    Параметр

    Обязательно

    Тип

    Описание

    bool

    Да

    Карта

    Составное условие запроса, которое объединяет подзапросы, используя настроенную Boolean-логику.

    Описание параметра:

    • must: Клаузы, которые must совпадают, чтобы документы были включены в результаты.
    • filter: Похоже на must, но не вносят вклад в оценку релевантности.
    • should: Клаузы, которые should совпадают, но не обязательны. Они похожи на желательные.
    • must_not: Клаузулы, которые не должны совпадать, чтобы документы были включены в результаты.

    bool.must

    Да

    Map

    Клаузулы, которые должны совпадать, чтобы документы были включены в результаты. Описание параметра:

    • vector: вектор запроса
    • my_vector: поле вектора
    • topk: количество возвращаемых результатов

    bool.filter

    Да

    Map

    Клаузулы, которые должны совпадать, но не влияют на оценку релевантности. Поддерживаются стандартные фильтры запросов OpenSearch, такие как term и range.

Запрос скриптовой оценки

Запрос Script_score позволяет выполнять пользовательские расчёты похожести для векторных поисков, исполняя определённый пользователем скрипт. Принцип работы следующий:

Предфильтрация работает с любым запросом. script_score затем вычисляет сходство векторов по предварительно отфильтрованным результатам и ранжирует результаты. Этот метод запроса не использует векторные индексы. Его производительность зависит от размера промежуточного набора результатов после предварительной фильтрации. Если условие предварительной фильтрации установлено в match_all, выполняется поиск перебором по всем данным.

Ниже приведён пример:

POST my_index/_search
{
"size":2,
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "vector_score",
"lang": "vector",
"params": {
"field": "my_vector",
"vector": [1.0, 2.0],
"metric": "euclidean"
}
}
}
}
}
Таблица 4 Параметры запроса script_score

Параметр

Обязательно

Тип

Описание

script_score

Да

Карта

Корневой параметр для запроса script_score.

Описание параметра:

  • запрос: критерии предварительной фильтрации. Когда он установлен в match_all, выполняется поиск грубой силы по всем данным.
  • скрипт: пользовательский скрипт, вычисляющий оценки схожести.

источник

Да

Строка

Имя скрипта. Значение фиксировано в vector_score, указывая, что используется встроенный скрипт для вычисления схожести.

lang

Да

Строка

Тип языка скрипта. Значение фиксировано в vector.

поле

Да

Строка

Запрашиваемое поле вектора, например, my_vector.

вектор

Да

Массив/Строка

Значение вектора запроса. Оно используется для расчёта схожести между проиндексированными векторами и вектором запроса.

Значение может быть массивом (например, [1, 1]) или значением, закодированным в Base64 (например, AAABAAACAAAD).

метрика

Да

Строка

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

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

  • евклидово (по умолчанию): Евклидово расстояние
  • inner_product: расстояние внутреннего произведения
  • косинус: косинусное расстояние
  • хэмминг: Расстояние Хэмминга, которое может использоваться только когда dim_type установлено двоичный.

Пересчёт запроса

Запрос пересчёта переоценивает и переупорядочивает лучшие результаты, возвращённые начальным запросом, чтобы повысить полноту.

Когда используется алгоритм индексации GRAPH_PQ или IVF_GRAPH_PQ, результаты запросов ранжируются на основе асимметричного расстояния, вычисляемого PQ. Запрос пересчёта затем переоценивает и переупорядочивает начальные результаты поиска, чтобы повысить полноту.

Ниже приведён пример запроса пересчёта на PQ‑индексе с именем my_index:

GET my_index/_search
{
"size": 10,
"query": {
"vector": {
"my_vector": {
"vector": [1.0, 2.0],
"topk": 100
}
}
},
"rescore": {
"window_size": 100,
"vector_rescore": {
"field": "my_vector",
"vector": [1.0, 2.0],
"metric": "euclidean"
}
}
}
Таблица 5 Параметры запроса пересчёта

Параметр

Обязательно

Тип

Описание

пересчет

Да

Карта

Определяет параметры пересчёта.

Ключевые параметры:

  • window_size: размер окна пересчёта/перепозиционирования.
  • vector_rescore: другие настройки векторного пересчёта.

window_size

Да

Целое число

Размер окна пересчёта/перепозиционирования. Векторный поиск возвращает top k результатов, но только первые window_size результаты перепересчитываются и переупорядочиваются. Большее значение указывает на более широкий диапазон перепозиционирования и, следовательно, более высокий уровень полноты, но также приводит к большему вычислительному расходу.

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

поле

Да

Строка

Запрашиваемое векторное поле, например, my_vector.

вектор

Да

Массив/Строка

Значение векторного запроса. Он используется для расчёта схожести между проиндексированными векторами и вектором запроса.

Значение может быть массивом (например, [1, 1]) или значением, закодированным в Base64 (например, AAABAAACAAAD).

метрика

Да

Строка

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

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

  • евклидово (по умолчанию): Евклидово расстояние
  • inner_product: расстояние по внутреннему произведению
  • косинус: косинусное расстояние
  • хэмминг: Расстояние Хэмминг, которое может использоваться только когда dim_type установлен в двоичный.

Расширение синтаксиса Painless

Расширение синтаксиса Painless позволяет использовать функции расчёта векторного расстояния или схожести в пользовательских скриптах. Расширение CSS поддерживает несколько функций расчёта векторного расстояния/схожести, которые пользователи могут сразу использовать в пользовательских скриптах Painless для построения гибких формул пересчёта.

Ниже приведён пример:

POST my_index/_search
{
"size": 10,
"query": {
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "1 / (1 + euclidean(params.vector, doc[params.field]))",
"params": {
"field": "my_vector",
"vector": [1, 2]
}
}
}
}
}
Таблица 6 Поддерживаемые функции расчёта векторного расстояния/схожести

Сигнатура функции

Описание

euclidean(Float[], DocValues)

Евклидово расстояние

cosine(Float[], DocValues)

Косинусная схожесть

innerproduct(Float[], DocValues)

Внутреннее произведение

hamming(String, DocValues)

Расстояние Хэмминга Только векторы чьи dim_type является бинарный поддерживаются. Входной вектор запроса должен быть строкой, закодированной в Base64.

Только кластеры OpenSearch 1.3.6 поддерживают эту функцию.

hammings(String, DocValues)

Расстояние Хэмминга Только векторы чьи dim_type является бинарный поддерживаются. Входной вектор запроса должен быть строкой, закодированной в Base64.

Только кластеры OpenSearch 2.19.0 поддерживают эту функцию.