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

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

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

CSS векторная база данных поддерживает разнообразные методы запросов, включая стандартный запрос, гибридный запрос, script_score запрос, rescore запрос и расширение синтаксиса painless. Они обеспечивают эффективный поиск векторных данных, удовлетворяя разнообразные потребности поиска.

  • Стандартный запрос: возвращает документы, наиболее похожие на вектор запроса.
  • Гибридный запрос: объединяет векторный поиск с традиционными запросами Elasticsearch, такими как предварительная фильтрация и булевы запросы.
  • Script Score запрос: позволяет выполнять пользовательские расчёты сходства для векторных поисков, исполняя пользовательский скрипт
  • Rescore запрос: переоценивает и переставляет в порядке убывания лучшие результаты, полученные первоначальным запросом, чтобы улучшить полноту.
  • Painless расширение синтаксиса: позволяет использовать функции расчёта расстояния или сходства векторных данных в пользовательских скриптах.

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

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

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

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

Параметр

Обязательно

Тип

Описание

размер

Да

Целое

Количество результатов поиска для возврата.

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

_source

Нет

Булево

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

Диапазон значений:

  • true (default): Returns the source text.
  • false: Not to return the source text.

запрос

Да

Карта

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

Параметры:

вектор (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

Hybrid Query

Гибридный запрос объединяет поиск векторов с традиционными запросами 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" }
    }
    }
    }
    }
    }

    Таблица 2 Параметры предфильтрации запроса

    Параметр

    Обязательный

    Тип

    Описание

    фильтр

    Да

    Карта

    Векторные фильтры запросов. Поддерживаются стандартные фильтры запросов 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" }
    }
    }
    }
    }

    Таблица 3 Параметры Boolean запроса

    Параметр

    Обязательно

    Тип

    Описание

    bool

    Да

    Map

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

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

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

    bool.must

    Да

    Map

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

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

    bool.filter

    Да

    Map

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

Script Score Query

Запрос 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"
}
}
}
}
}
Table 4 Параметры запроса script_score

Параметр

Обязательно

Тип

Описание

script_score

Да

Карта

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

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

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

источник

Да

Строка

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

lang

Да

Строка

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

поле

Да

Строка

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

вектор

Да

Array/String

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

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

метрика

Да

Строка

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

Диапазон значений:

  • euclidean (по умолчанию): Эвклидово расстояние
  • inner_product: расстояние внутреннего произведения
  • cosine: косинусное расстояние
  • Хэмминг: расстояние Хэмминга, которое может использоваться только когда dim_type установлено в двоичный.

Rescore Query

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"
}
}
}
Таблица 5 Параметры пересчёта запроса

Параметр

Обязательно

Тип

Описание

пересчёт

Да

Карта

Определяет параметры пересчёта.

Ключевые параметры:

  • window_size: размер окна пересчёта/переранжирования.
  • vector_rescore: прочие настройки векторного пересчёта.

window_size

Да

Целое

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

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

поле

Да

Строка

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

вектор

Да

Массив/Строка

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

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

метрика

Да

Строка

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

Диапазон значений:

  • euclidean (по умолчанию): Евклидово расстояние
  • inner_product: расстояние внутреннего произведения
  • cosine: косинусное расстояние
  • хэмминг: расстояние Хэмминга, которое может использоваться только когда dim_type установлен в бинарный.

Расширение синтаксиса Painless

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

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

Описание

euclidean(Float[], DocValues)

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

cosine(Float[], DocValues)

Косинусная схожесть

innerproduct(Float[], DocValues)

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

hamming(String, DocValues)

Hamming distance Только векторы, у которых dim_type является бинарный поддерживаются. Входной вектор запроса должен быть строкой символов, закодированной в Base64.