CSS‑векторная база данных поддерживает разнообразные методы запросов, включая стандартный запрос, гибридный запрос, запрос script_score, запрос rescore и расширение синтаксиса painless. Они обеспечивают эффективный поиск векторных данных, удовлетворяя разнообразные потребности поиска.
Standard query используется для получения документов, наиболее похожих на вектор запроса.
Следующая команда вернёт k (указанным Размер/topk) записи, которые являются наиболее близкими совпадениями с вектором запроса.
POST my_index/_search{"size":2,"_source": false,"query": {"vector": {"my_vector": {"vector": [1, 1],"topk":2}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
Размер | Да | Целое | Количество возвращаемых результатов поиска. Значение по умолчанию: 10 |
_source | Нет | Булево | Возвращать ли исходный текст в документах. Чтобы сократить передачу данных и повысить производительность запросов, установите этот параметр в 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 сочетает векторный поиск с традиционными запросами OpenSearch, такими как предварительная фильтрация и булевы запросы.
Только кластеры OpenSearch 2.19.0 поддерживают предварительную фильтрацию.
В следующем примере верхние 10 записей, у которых my_label значение равно red будут возвращены.
Сначала применяются фильтры для получения соответствующих результатов. Затем выполняется векторный поиск по этим результатам, чтобы получить наиболее релевантные векторы на основе схожести.
Ниже приведён пример:
POST my_index/_search{"size": 10,"query": {"vector": {"my_vector": {"vector": [1, 2],"topk": 10,"filter": {"term": { "my_label": "red" }}}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
фильтр | Да | Карта | Фильтры векторных запросов. Поддерживаются стандартные фильтры запросов 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" }}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
bool | Да | Карта | Составное условие запроса, которое объединяет подзапросы, используя настроенную Boolean-логику. Описание параметра:
|
bool.must | Да | Map | Клаузулы, которые должны совпадать, чтобы документы были включены в результаты. Описание параметра:
|
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"}}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
script_score | Да | Карта | Корневой параметр для запроса script_score. Описание параметра:
|
источник | Да | Строка | Имя скрипта. Значение фиксировано в vector_score, указывая, что используется встроенный скрипт для вычисления схожести. |
lang | Да | Строка | Тип языка скрипта. Значение фиксировано в vector. |
поле | Да | Строка | Запрашиваемое поле вектора, например, my_vector. |
вектор | Да | Массив/Строка | Значение вектора запроса. Оно используется для расчёта схожести между проиндексированными векторами и вектором запроса. Значение может быть массивом (например, [1, 1]) или значением, закодированным в Base64 (например, AAABAAACAAAD). |
метрика | Да | Строка | Метрика расстояния между векторами, измеряющая схожесть или расстояние между векторами. Диапазон значений:
|
Запрос пересчёта переоценивает и переупорядочивает лучшие результаты, возвращённые начальным запросом, чтобы повысить полноту.
Когда используется алгоритм индексации 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"}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
пересчет | Да | Карта | Определяет параметры пересчёта. Ключевые параметры:
|
window_size | Да | Целое число | Размер окна пересчёта/перепозиционирования. Векторный поиск возвращает top k результатов, но только первые window_size результаты перепересчитываются и переупорядочиваются. Большее значение указывает на более широкий диапазон перепозиционирования и, следовательно, более высокий уровень полноты, но также приводит к большему вычислительному расходу. Значение по умолчанию: 100 |
поле | Да | Строка | Запрашиваемое векторное поле, например, my_vector. |
вектор | Да | Массив/Строка | Значение векторного запроса. Он используется для расчёта схожести между проиндексированными векторами и вектором запроса. Значение может быть массивом (например, [1, 1]) или значением, закодированным в Base64 (например, AAABAAACAAAD). |
метрика | Да | Строка | Метрика расстояния между векторами, измеряющая схожесть или расстояние между векторами. Диапазон значений:
|
Расширение синтаксиса 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]}}}}}
Сигнатура функции | Описание |
|---|---|
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 поддерживают эту функцию. |