Объединённые поля
Запрос combined_fields поддерживает поиск по нескольким текстовым полям, как если бы их содержимое было индексировано в одно объединённое поле. Запрос рассматривает входную строку с точки зрения терминов: сначала он анализирует строку запроса на отдельные термины, а затем ищет каждый термин в любом из полей. Этот запрос особенно полезен, когда совпадение может охватывать несколько текстовых полей, например, title, abstract и body статьи:
resp = client.search(
query={
"combined_fields": {
"query": "database systems",
"fields": [
"title",
"abstract",
"body"
],
"operator": "and"
}
},
)
print(resp) response = client.search(
body: {
query: {
combined_fields: {
query: 'database systems',
fields: [
'title',
'abstract',
'body'
],
operator: 'and'
}
}
}
)
puts response const response = await client.search({
query: {
combined_fields: {
query: "database systems",
fields: ["title", "abstract", "body"],
operator: "and",
},
},
});
console.log(response); 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, по умолчанию установленным на 4096. Для запросов с объединенными полями количество пунктов рассчитывается как произведение количества полей на количество терминов.
Усиление по полям
Усиления по полям интерпретируются в соответствии с моделью объединённого поля. Например, если поле title имеет усиление 2, оценка рассчитывается так, как будто каждый термин в названии встречается дважды в синтетическом объединённом поле.
resp = client.search(
query={
"combined_fields": {
"query": "distributed consensus",
"fields": [
"title^2",
"body"
]
}
},
)
print(resp) response = client.search(
body: {
query: {
combined_fields: {
query: 'distributed consensus',
fields: [
'title^2',
'body'
]
}
}
}
)
puts response const response = await client.search({
query: {
combined_fields: {
query: "distributed consensus",
fields: ["title^2", "body"],
},
},
});
console.log(response); 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 применяются к каждому термину, а не к каждому полю. Конкретно, запрос
resp = client.search(
query={
"combined_fields": {
"query": "database systems",
"fields": [
"title",
"abstract"
],
"operator": "and"
}
},
)
print(resp) response = client.search(
body: {
query: {
combined_fields: {
query: 'database systems',
fields: [
'title',
'abstract'
],
operator: 'and'
}
}
}
)
puts response const response = await client.search({
query: {
combined_fields: {
query: "database systems",
fields: ["title", "abstract"],
operator: "and",
},
},
});
console.log(response); 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/8.17/query-dsl-combined-fields-query.html