Запрос Boolean
Запрос, который соответствует документам, удовлетворяющим булевым комбинациям других запросов. Запрос bool сопоставляется с Lucene BooleanQuery. Он создаётся с использованием одного или нескольких булевых условий, каждое из которых имеет тип вхождения. Типы вхождений:
| Occur | Описание |
|---|---|
| Условие (запрос) должно присутствовать в совпадающих документах и будет вносить вклад в рейтинг. |
| Условие (запрос) должно присутствовать в совпадающих документах. Однако, в отличие от |
| Условие (запрос) должно присутствовать в совпадающем документе. |
| Условие (запрос) не должно присутствовать в совпадающих документах. Условия выполняются в контексте фильтра, что означает, что рейтинг игнорируется, и условия рассматриваются для кеширования. Поскольку рейтинг игнорируется, для всех документов возвращается рейтинг |
Запрос bool использует подход чем больше совпадений, тем лучше, поэтому оценка каждого совпадающего must или should условия будет суммироваться для получения итоговой оценки _score для каждого документа.
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
} Использование minimum_should_match
Вы можете использовать параметр minimum_should_match для указания количества или процента should условий, которым документы, возвращаемые результатами, должны соответствовать.
Если запрос bool включает по крайней мере одно условие should и не содержит условий must или filter, значение по умолчанию равно 1. В противном случае значение по умолчанию равно 0.
Другие допустимые значения см. в параметре minimum_should_match.
Определение рейтинга с bool.filter
Запросы, указанные в элементе filter, не влияют на рейтинг — значения рейтинга возвращаются как 0. На рейтинг влияют только запросы, которые были указаны. Например, все три запроса ниже возвращают все документы, где поле status содержит термин active.
Этот первый запрос присваивает рейтинг 0 всем документам, так как не указан запрос для определения рейтинга:
GET _search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
} Этот запрос bool имеет запрос match_all, который присваивает рейтинг 1.0 всем документам.
GET _search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
} Этот запрос constant_score ведет себя точно так же, как второй пример выше. Запрос constant_score присваивает рейтинг 1.0 всем документам, соответствующим фильтру.
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
} Именованные запросы
Каждый запрос принимает _name в своём определении верхнего уровня. Вы можете использовать именованные запросы для отслеживания того, какие запросы соответствуют возвращаемым документам. Если используются именованные запросы, в ответе присутствует свойство matched_queries для каждого совпадения.
Использование одинаковых значений _name в одном запросе приводит к неопределённому поведению. Запросы с одинаковыми именами могут перезаписывать друг друга. Имена запросов предполагаются уникальными в одном запросе.
GET /_search
{
"query": {
"bool": {
"should": [
{ "match": { "name.first": { "query": "shay", "_name": "first" } } },
{ "match": { "name.last": { "query": "banon", "_name": "last" } } }
],
"filter": {
"terms": {
"name.last": [ "banon", "kimchy" ],
"_name": "test"
}
}
}
}
}
© 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-bool-query.html