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

Выполнение векторного поиска

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

В современных AI‑поисковых приложениях векторы высокой размерности фиксируют семантическую суть данных, а бизнес‑специфические теги (например, категория, цена и регион) обеспечивают точную фильтрацию. Стандартный векторный поиск быстр, но часто не справляется с реализацией сложной бизнес‑логики или пользовательских требований к ранжированию. Чтобы преодолеть разрыв между производительностью и гибкостью, CSS vector database поддерживает широкий спектр методов запросов, от ультрабыстрого приближённого поиска ближайших соседей (ANN) до интенсивного переоценивания и полностью настраиваемого ранжирования на основе скриптов. Стратегически внедряя предварительную фильтрацию для сужения пространства поиска или используя переоценивание для компенсации потери точности из‑за векторной квантизации, разработчики могут создавать интеллектуальные поисковые движки, способные эффективно обрабатывать наборы данных с сотнями миллионов записей, удовлетворяя требования сервиса к низкой задержке и высокому охвату.

Сравнение различных методов запросов

Чтобы сбалансировать точность поиска и производительность, выберите подходящий метод запроса в зависимости от размера вашего набора данных.

Table 1 Сравнение различных методов запросов

Метод запроса

Как это работает

Когда использовать

Версия кластера

Стандартный векторный поиск

Выполняет ANN‑поиски, используя графовые структуры, такие как HNSW. Навигация по заранее построенным иерархическим уровням обеспечивает задержку уровня миллисекунд. Этот метод сохраняет как ультра‑высокую пропускную способность, так и высокую точность охвата (с лишь небольшими потерями).

Общий поиск в крупном масштабе: сценарии, где приоритетом является низкая задержка, например поиск среди сотен миллионов изображений и рекомендация коротких видеороликов.

Elasticsearch: 7.6.2 or 7.10.2

OpenSearch: 1.3.6 or 2.19.0

Гибридный запрос: предварительная фильтрация

Сначала применяется фильтрация метаданных (например, по категории и региону), затем выполняется полный векторный поиск по отфильтрованному набору кандидатов. За счёт значительного сокращения пространства поиска этот метод обеспечивает отличную производительность поиска и высокий recall. Возвращённые результаты соответствуют применённым фильтрам.

Условный поиск: точная фильтрация метаданных, например поиск похожих продуктов под конкретным брендом.

Elasticsearch: 7.10.2

OpenSearch: 2.19.0

Hybrid query: Boolean query

Boolean query фактически представляет собой метод пост‑фильтрации, при котором векторный поиск и фильтрация по тегам выполняются отдельно, а затем их результаты объединяются с помощью булевой логики.

Простое комбинирование логики: когда требуется fusion scoring или устаревшая версия не поддерживает предварительную фильтрацию.

Elasticsearch: 7.6.2 or 7.10.2

OpenSearch: 1.3.6 or 2.19.0

Script score query

Этот метод не работает с векторными индексами. Он выполняет brute-force поиск по промежуточному набору результатов, полученному после предварительной фильтрации. На отфильтрованном подмножестве можно достичь 100 % recall. Однако задержка растёт линейно с объёмом данных, что приводит к узким местам в производительности на больших наборах данных.

Ранжирование небольших масштабов: высокоточная сопоставимость на небольших наборах данных (менее 10 000 записей) или вторичный проход ранжирования после точной фильтрации метаданных.

Elasticsearch: 7.6.2 or 7.10.2

OpenSearch: 1.3.6 or 2.19.0

Rescore query

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

Квантование в большом масштабе: уменьшает потерю точности при PQ‑квантовании и обеспечивает высокий охват при небольшом объёме памяти.

Elasticsearch: 7.6.2 or 7.10.2

OpenSearch: 1.3.6 or 2.19.0

Painless syntax extension

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

Динамическое многофакторное ранжирование, например, на основе «similarity + price offset + promotion weight»

Elasticsearch: 7.6.2 or 7.10.2

OpenSearch: 1.3.6 or 2.19.0

Вход в Dev Tools

Войдите в Dev Tools, чтобы выполнить команды DSL.

  • Для кластера Elasticsearch войдите в Kibana
    1. Войдите в консоль управления CSS.
    2. В панели навигации слева выберите Clusters > Elasticsearch.
    3. В списке кластеров найдите целевой кластер и нажмите Kibana в столбце Operation, чтобы войти в консоль Kibana.
    4. В левой панели навигации выберите Dev Tools.

      Левая часть консоли — это поле ввода команды, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.

  • Для кластера OpenSearch войдите в Dashboards.
    1. Войдите в консоль управления CSS.
    2. В левой панели навигации выберите Clusters > OpenSearch.
    3. В списке кластеров найдите нужный кластер и нажмите Dashboards в столбце Operation, чтобы войти в OpenSearch Dashboards.
    4. В левой панели навигации выберите Dev Tools.

      Левая часть консоли — это поле ввода команды, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.

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

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

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

Parameter

Mandatory

Type

Default Value

Description

size

No

Integer

10

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

_source

No

Boolean

true

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

Значение может быть:

  • true: Возвращает исходный текст.
  • false: Не возвращать исходный текст.

query

Yes

Map

N/A

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

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

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

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

vector (подпараметр)

Да

Array/String

N/A

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

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

topk

Да

Integer

N/A

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

Сохраните значение согласованным с size.

ef

No

Integer

200

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

Ограничения: Этот параметр доступен только для алгоритмов индексирования на основе графов. Конкретно, он применяется, когда algorithm установлен в GRAPH, GRAPH_PQ, GRAPH_SQ8 или GRAPH_SQ4.

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

max_scan_num

No

Integer

10000

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

Ограничения: Этот параметр доступен только для алгоритмов индексирования на основе графов. Конкретно, он применяется, когда algorithm установлен в GRAPH, GRAPH_PQ, GRAPH_SQ8 или GRAPH_SQ4.

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

rescore

No

Boolean

false

Определяет, следует ли включать запрос повторного ранжирования. При запросах индекса PQ или SQ этот параметр определяет, следует ли включать запрос повторного ранжирования. Эффект тот же, что и Rescore Query, но конфигурация проще.

Ограничения: Этот параметр доступен только для кластеров Elasticsearch 7.10.2 и OpenSearch 2.19.0, а версия образа должна быть x.x.x_26.1.0_xxx или новее.

Значение может быть:

  • true: Включить запрос повторного ранжирования.
  • false: Отключить запрос повторного ранжирования.

nprobe

No

Integer

100

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

Ограничения: Этот параметр доступен только для алгоритмов на основе IVF. Конкретно он действует, когда algorithm установлен в IVF_GRAPH или IVF_GRAPH_PQ.

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

Гибридный запрос: Предфильтрация

Caution

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

Гибридный запрос означает комбинирование векторного поиска с другими запросами DSL. При предфильтрации документы сначала фильтруются с помощью метаданных тегов (например, цветов и категорий), а затем выполняется поиск векторного сходства по отфильтрованному набору результатов, чтобы вернуть наиболее похожие результаты.

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

POST my_index/_search
{
"size": 10,
"query": {
"vector": {
"my_vector": {
"vector": [1, 2],
"topk": 10,
"filter": {
"term": { "my_label": "red" }
}
}
}
}
}
Table 3 Параметры предфильтрации запроса

Параметр

Обязательно

Тип

Описание

filter

Да

Map

Фильтры векторного запроса.

Фильтры представлены в виде пар ключ-значение. Ключ может быть стандартным фильтром, например term или range, а значение — конкретным условием фильтрации.

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

term

Нет

Карта

Запрос term является типом точного запроса.

В паре ключ-значение ключ — это имя поля, а значение — точное значение для сопоставления.

Например, {"term": {"my_label": "red"}} означает возвращать только документы, у которых значение my_label равно red.

Гибридный запрос: Boolean Query

Гибридный запрос означает комбинирование векторного поиска с другими запросами DSL. Boolean query фактически является методом пост‑фильтрации запросов. Фильтрация и поиск на основе векторного сходства выполняются отдельно. Затем результаты обоих объединяются с помощью логики Boolean, определяемой такими клаузулами, как must, should и filter.

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

POST my_index/_search
{
"size": 10,
"query": {
"bool": {
"must": {
"vector": {
"my_vector": {
"vector": [1, 2],
"topk": 10
}
}
},
"filter": {
"term": { "my_label": "red" }
}
}
}
}
Table 4 Параметры Boolean query

Параметр

Обязательно

Тип

Описание

bool

Да

Отображение

Составной запросный клаузул, который комбинирует подзапросы с помощью настроенной булевой логики.

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

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

bool.must

Да

Отображение

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

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

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

bool.filter

Yes

Map

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

Script Score Query

Этот метод вычисляет сходство векторов по предварительно отфильтрованным результатам, выполняя пользовательский скрипт. Он не использует векторные индексы. Его производительность зависит от размера набора предварительно отфильтрованных результатов. Если условие предварительной фильтрации установлено в 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"
}
}
}
}
}
Таблица 5 script_score query parameters

Параметр

Обязательно

Тип

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

Описание

script_score

Yes

Map

N/A

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

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

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

source

Yes

String

N/A

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

lang

Yes

String

N/A

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

поле

Да

String

N/A

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

vector

Да

Array/String

N/A

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

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

метрика

Нет

String

euclidean

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

Значение может быть:

  • euclidean: Евклидово расстояние
  • inner_product: расстояние скалярного произведения
  • cosine: косинусное расстояние
  • hamming: расстояние Хэмминга, которое может использоваться только когда dim_type установлен в binary.

Rescore Query

Когда индекс использует алгоритм GRAPH_PQ или IVF_GRAPH_PQ, запрос состоит из двух этапов: сначала выполняется быстрая фильтрация сжатых векторов; затем оригинальные векторы извлекаются для точного ранжирования топ‑K результатов с целью повышения полноты.

Предположим, что my_index — это индекс, использующий продуктовую квантизацию. Выполните следующую команду, чтобы выполнить rescore query и вернуть 10 результатов:

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"
}
}
}
Table 6 Rescore query parameters

Parameter

Mandatory

Type

Default Value

Description

rescore

Yes

Map

N/A

Определяет параметры повторного ранжирования.

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

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

To implement rescore query for nested fields, perform Standard Vector Query.

window_size

No

Integer

100

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

field

Yes

String

N/A

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

vector

Yes

Array/String

N/A

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

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

metric

No

String

euclidean

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

Значение может быть:

  • euclidean: Евклидово расстояние
  • inner_product: расстояние скалярного произведения
  • cosine: косинусное расстояние
  • hamming: расстояние Хэмминга, которое может использоваться только когда dim_type установлен в binary.

Painless Syntax Extension

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

Выполните следующую команду, чтобы выполнить запрос на основе расширения синтаксиса Painless и получить 10 векторных записей:

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]
}
}
}
}
}

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

Table 7 Поддерживаемые функции расчёта векторного расстояния/сходства

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

Описание

euclidean(Float[], DocValues)

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

cosine(Float[], DocValues)

Косинусное сходство

innerproduct(Float[], DocValues)

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

hamming(String, DocValues)

Расстояние Хэмминга

Ограничения:

  • Поддерживаются только векторы, у которых dim_type имеет значение binary. Вектор запроса должен быть строкой, закодированной в Base64.
  • Поддерживают эту функцию только кластеры Elasticsearch 7.6.2, Elasticsearch 7.10.2 и OpenSearch 1.3.6.

hammings(String, DocValues)

Расстояние Хэмминга

Ограничения:

  • Поддерживаются только векторы, у которых dim_type имеет значение binary. Вектор запроса должен быть строкой, закодированной в Base64.
  • Поддерживают эту функцию только кластеры OpenSearch 2.19.0.