CSS векторная база данных поддерживает разнообразные методы запросов, включая стандартный запрос, гибридный запрос, script_score запрос, rescore запрос и расширение синтаксиса painless. Они обеспечивают эффективный поиск векторных данных, удовлетворяя разнообразные потребности поиска.
Стандартный запрос используется для получения документов, наиболее похожих на вектор запроса.
Следующая команда вернёт k (указанным размер/topk) записи которые являются наиболее близкими совпадениями с вектором запроса.
POST my_index/_search{"size":2,"_source": false,"query": {"vector": {"my_vector": {"vector": [1, 1],"topk":2}}}}
Параметр | Обязательно | Тип | Описание |
|---|---|---|---|
размер | Да | Целое | Количество результатов поиска для возврата. Значение по умолчанию: 10 |
_source | Нет | Булево | Возвращать ли исходный текст в документах. Чтобы уменьшить передачу данных и улучшить производительность запросов, установите этот параметр в false. Диапазон значений:
|
запрос | Да | Карта | Указывает вектор запроса. Параметры: вектор (mandatory): indicates a vector query (vector similarity-based search), including the vector field and query vector value. my_vector (mandatory): queried vector field (for example, my_vector). |
вектор (подпараметр) | Да | Массив/Строка | Значение вектора запроса. Оно используется для вычисления сходства между индексированными векторами и вектором запроса. Значение может быть массивом (например, [1, 1]) или Base64-encoded value (for example, 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 |
Гибридный запрос объединяет поиск векторов с традиционными запросами Elasticsearch, такими как предварительная фильтрация и булевы запросы.
Только кластеры Elasticsearch 7.10.2 поддерживают запросы предварительной фильтрации.
В следующем примере, первые 10 записей, у которых my_label значение равно red возвращаются.
Сначала применяются фильтры для получения совпадающих результатов. Затем выполняется векторный поиск по этим результатам, чтобы получить наиболее релевантные векторы на основе сходства.
Следующее является примером:
POST my_index/_search{"size": 10,"query": {"vector": {"my_vector": {"vector": [1, 2],"topk": 10,"filter": {"term": { "my_label": "red" }}}}}}
Параметр | Обязательный | Тип | Описание |
|---|---|---|---|
фильтр | Да | Карта | Векторные фильтры запросов. Поддерживаются стандартные фильтры запросов Elasticsearch, такие как term и range. Если фильтр слишком ограничительный, приводя к небольшому промежуточному набору результатов, вы можете задать index.vector.exact_search_threshold параметр, чтобы когда промежуточный набор результатов меньше этого порога, запрос предварительной фильтрации автоматически переключается на запрос полного перебора (FLAT algorithm), что обеспечивает высокий коэффициент полноты. Для получения дополнительной информации см Создание векторного индекса. |
термин | Нет | Карта | Запрос терма является типом точного запроса. Документы, содержащие точный терм, будут возвращены. Например, {"term": {"my_label": "red"}} означает только возвращать документы, у которых my_label значение равно red. |
Булев запрос на самом деле является методом пост-фильтрации запросов. Фильтрация и поиск на основе векторного сходства выполняются отдельно. Затем результаты обеих объединяются с помощью булевой логики, определяемой условиями, такими как 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 | Да | Map | Составное условие запроса, которое объединяет подзапросы с использованием настроенной Boolean‑логики. Описание параметра:
|
bool.must | Да | Map | Клаузы, которые должны совпадать, чтобы документы были включены в результаты. Описание параметра:
|
bool.filter | Да | Map | Клаузы, которые должны совпадать, но не вносят вклад в оценку релевантности. Поддерживаются стандартные фильтры запросов Elasticsearch, такие как 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. |
вектор | Да | Array/String | Значение вектора запроса. Оно используется для расчёта схожести между проиндексированными векторами и вектором запроса. Значение может быть массивом (например, [1, 1]) или значением, закодированным в Base64 (например, AAABAAACAAAD). |
метрика | Да | Строка | Метрика расстояния между векторами, измеряющая схожесть или расстояние между векторами. Диапазон значений:
|
Rescore query переоценивает и переупорядочивает лучшие результаты, возвращённые начальным запросом, чтобы улучшить полноту.
Когда используется алгоритм индексации GRAPH_PQ или IVF_GRAPH_PQ, результаты запросов ранжируются на основе асимметричного расстояния, вычисленного PQ. Rescore query затем переоценивает и переупорядочивает начальные результаты поиска, чтобы улучшить полноту.
The following is an example of пересчёта запроса on a PQ index named 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) | Hamming distance Только векторы, у которых dim_type является бинарный поддерживаются. Входной вектор запроса должен быть строкой символов, закодированной в Base64. |