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

Поиск данных с помощью векторного индекса

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

Векторные индексы поддерживают поиск данных разными способами.

Стандартный запрос

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

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

Параметр

Описание

вектор (первый)

Указывает, что тип запроса VectorQuery.

my_vector

Указывает имя поля вектора, которое вы хотите запросить.

вектор (второй)

Указывает значение вектора, которое вы хотите запросить, которое может быть массивом или строкой Base64.

topk

То же, что значение size обычно.

Другие необязательные параметры

Указывает необязательные параметры запроса. Вы можете настроить параметры векторного индекса для достижения более высокой производительности запросов или точности. Для получения дополнительной информации см. Таблица 2.

Таблица 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‑filtering
    GET 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"
}
}
}
}
}
Таблица 3 параметры script_score

Параметр

Описание

источник

Описание скрипта. Его значение 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"
}
}
}
Таблица 4 Описание параметров переоценки

Параметр

Описание

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]
}
}
}
}
}
Таблица 5 Поддерживаемые функции вычисления векторных расстояний

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

Описание

euclidean(Float[], DocValues)

Функция евклидового расстояния

cosine(Float[], DocValues)

Функция косинусного сходства

innerproduct(Float[], DocValues)

Функция скалярного произведения

hamming(String, DocValues)

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