Векторные индексы поддерживают поиск данных разными способами.
Стандартный запрос
Для векторных полей с векторными индексами предоставлен стандартный синтаксис векторного запроса. Следующая команда вернёт n (указан размер/topk) записей данных, наиболее близких к вектору запроса.
POST my_index/_search{"size":2,"_source": false,"query": {"vector": {"my_vector": {"vector": [1, 1],"topk":2}}}}
Параметр | Описание |
|---|---|
вектор (первый) | Указывает, что тип запроса VectorQuery. |
my_vector | Указывает имя поля вектора, которое вы хотите запросить. |
вектор (второй) | Указывает значение вектора, которое вы хотите запросить, которое может быть массивом или строкой Base64. |
topk | То же, что значение size обычно. |
Другие необязательные параметры | Указывает необязательные параметры запроса. Вы можете настроить параметры векторного индекса для достижения более высокой производительности запросов или точности. Для получения дополнительной информации см. Таблица 2. |
Тип | Параметр | Описание |
|---|---|---|
Параметры конфигурации графового индекса | ef | Размер очереди соседнего узла во время запроса. Большое значение указывает на более высокую точность запроса и более медленную скорость запроса. Значение по умолчанию равно 200. Диапазон значений: (0, 100000] |
max_scan_num | Максимальное количество просканированных узлов. Большое значение указывает на более высокую точность запроса и более медленную скорость запроса. Значение по умолчанию равно 10000. Диапазон значений: (0, 1000000] | |
Параметры конфигурации индекса IVF | nprobe | Количество центральных точек. Большое значение указывает на более высокую точность запроса и более медленную скорость запроса. Значение по умолчанию равно 100. Диапазон значений: (0, 100000] |
Составной запрос
Поиск по векторам можно использовать вместе с другими подзапросами Elasticsearch, такими как Boolean‑запрос и post‑filtering, для составного запроса.
В следующих двух примерах, top 10 (topk) результаты, ближайшие к вектору запроса, запрашиваются первыми. filter сохраняет только те результаты, у которых my_label поле равно красный.
- Пример Boolean‑запросаPOST my_index/_search{"size": 10,"query": {"bool": {"must": {"vector": {"my_vector": {"vector": [1, 2],"topk": 10}}},"filter": {"term": { "my_label": "red" }}}}}
- Пример post‑filteringGET my_index/_search{"size": 10,"query": {"vector": {"my_vector": {"vector": [1, 2],"topk": 10}}},"post_filter": {"term": { "my_label": "red" }}}
ScriptScore‑запрос
Можно использовать script_score для выполнения поиска ближайших соседей (NSS) по векторам. Синтаксис запроса приведён ниже.
Условие предфильтрации может быть любым запросом. 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"}}}}}
Параметр | Описание |
|---|---|
источник | Описание скрипта. Его значение vector_score если сходство векторов используется для оценки. |
lang | Описание синтаксиса скрипта. Его значение вектор. |
поле | Имя векторного поля |
вектор | Векторные данные для запроса |
метрика | Метод измерения, который может быть эвклидово, inner_product, косинусное, и Хэмминга. Значение по умолчанию: эвклидово |
Повторный скоринг запроса
Если GRAPH_PQ или IVF_GRAPH_PQ используется индекс, результаты запросов сортируются на основе асимметричного расстояния, вычисленного с помощью PQ. CSS поддерживает перепросчитывание и ранжирование результатов запросов для повышения уровня полноты.
Предполагая, что my_index is a PQ index, an example of re-scoring the query results is as follows:
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 | Векторный поиск возвращает topk результаты поиска и ранжирует первые window_size результаты. |
поле | Имя векторного поля |
вектор | Векторные данные для запроса |
метрика | Метод измерения, который может быть эвклидово, inner_product, косинус, и хэмминг. Значение по умолчанию: евклид |
Расширение синтаксиса Painless
CSS extension поддерживает несколько функций вычисления векторных расстояний, которые можно непосредственно использовать в пользовательских скриптах 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. |