Объединённые поля
Запрос combined_fields поддерживает поиск по нескольким текстовым полям, как если бы их содержимое было индексировано в одном объединённом поле. Запрос рассматривает входную строку с точки зрения отдельных терминов: сначала он анализирует строку запроса на отдельные термины, а затем ищет каждый термин в любом из полей. Этот запрос особенно полезен, когда совпадение может охватывать несколько текстовых полей, например, title, abstract и body статьи:
GET /_search
{
"query": {
"combined_fields" : {
"query": "database systems",
"fields": [ "title", "abstract", "body"],
"operator": "and"
}
}
} Запрос combined_fields использует обоснованный подход к оценке, основанный на простой формуле BM25F, описанной в The Probabilistic Relevance Framework: BM25 and Beyond. При оценке совпадений запрос комбинирует статистику по терминам и коллекции по полям, чтобы оценить каждое совпадение так, как если бы указанные поля были индексированы в одно объединённое поле. Эта оценка — лучшая возможная; combined_fields делает некоторые приближения, и оценки не будут идеально соответствовать модели BM25F.
Предел количества полей
По умолчанию существует ограничение на количество подзапросов, которые может содержать запрос. Это ограничение определяется настройкой indices.query.bool.max_clause_count, которая по умолчанию равна 1024. Для запросов с объединёнными полями количество подзапросов вычисляется как произведение количества полей на количество терминов.
Усиление по полю
Усиление полей интерпретируется в соответствии с моделью объединённого поля. Например, если поле title имеет усиление 2, оценка вычисляется так, как если бы каждый термин в заголовке появлялся дважды в синтетическом объединённом поле.
GET /_search
{
"query": {
"combined_fields" : {
"query" : "distributed consensus",
"fields" : [ "title^2", "body" ]
}
}
} | Отдельные поля могут быть усилены с помощью обозначения с возведением в степень ( |
Для запроса combined_fields требуется, чтобы усиление полей было не меньше 1,0. Усиление полей может быть дробным.
Параметры верхнего уровня для combined_fields
-
fields - (Обязательный массив строк) Список полей для поиска. Разрешены шаблоны подстановки полей. Поддерживаются только поля типа
text, и все они должны иметь одинаковый анализатор поискаanalyzer. -
query -
(Обязательный строковый параметр) Текст для поиска в предоставленных
<fields>.Запрос
combined_fieldsанализирует предоставленный текст перед выполнением поиска. -
auto_generate_synonyms_phrase_query -
(Необязательный булевый параметр) Если
true, запросы match phrase автоматически создаются для многословных синонимов. По умолчаниюtrue.См. Использование синонимов с запросом match для примера.
-
operator -
(Необязательный строковый параметр) Логика булевой логики, используемая для интерпретации текста в значении
query. Допустимые значения:-
or(По умолчанию) - Например, значение
queryравноdatabase systems, интерпретируется какdatabase OR systems. -
and - Например, значение
queryравноdatabase systems, интерпретируется какdatabase AND systems.
-
-
minimum_should_match -
(Необязательный строковый параметр) Минимальное количество подзапросов, которые должны совпадать для того, чтобы документ был возвращен. См.
minimum_should_matchпараметр для допустимых значений и дополнительной информации. -
zero_terms_query -
(Необязательный строковый параметр) Указывает, возвращаются ли какие-либо документы, если
analyzerудаляет все токены, например, при использовании фильтраstop. Допустимые значения:-
none(По умолчанию) - Если
analyzerудаляет все токены, документы не возвращаются. -
all - Возвращает все документы, аналогично запросу
match_all.
См. Запрос на нулевые термины для примера.
-
Сравнение с запросом multi_match
Запрос combined_fields предоставляет обоснованный способ сопоставления и оценки по нескольким полям типа text. Для этого требуется, чтобы все поля имели одинаковый анализатор поиска analyzer.
Если вам нужен один запрос, который обрабатывает поля разных типов, такие как ключевые слова или числа, то запрос multi_match может подойти лучше. Он поддерживает текстовые и нетекстовые поля и принимает текстовые поля, которые не используют один и тот же анализатор.
Основные режимы multi_match best_fields и most_fields принимают центральную точку зрения поля в запросе. В отличие от этого, combined_fields ориентирован на термин: operator и minimum_should_match применяются к каждому термину, а не к каждому полю. Например, запрос
GET /_search
{
"query": {
"combined_fields" : {
"query": "database systems",
"fields": [ "title", "abstract"],
"operator": "and"
}
}
} выполняется как:
+(combined("database", fields:["title" "abstract"]))
+(combined("systems", fields:["title", "abstract"])) Другими словами, каждый термин должен присутствовать хотя бы в одном поле для сопоставления с документом.
Режим cross_fields multi_match также использует подход, ориентированный на термин, и применяет operator и minimum_should_match per-term. Основное преимущество combined_fields перед cross_fields заключается в его надежном и интерпретируемом подходе к оценке на основе алгоритма BM25F.
Настраиваемые сходства
Запрос combined_fields в настоящее время поддерживает только сходство BM25, которое является по умолчанию, если не настроен настраиваемое сходство. Сходства на уровне поля также недопустимы. Использование combined_fields в любом из этих случаев приведет к ошибке.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-combined-fields-query.html