2013-08-28 19:24:34 -04:00
|
|
|
[[query-dsl-bool-query]]
|
2019-07-18 10:18:11 -04:00
|
|
|
=== Boolean query
|
|
|
|
++++
|
|
|
|
<titleabbrev>Boolean</titleabbrev>
|
|
|
|
++++
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
A query that matches documents matching boolean combinations of other
|
|
|
|
queries. The bool query maps to Lucene `BooleanQuery`. It is built using
|
|
|
|
one or more boolean clauses, each clause with a typed occurrence. The
|
|
|
|
occurrence types are:
|
|
|
|
|
|
|
|
[cols="<,<",options="header",]
|
|
|
|
|=======================================================================
|
|
|
|
|Occur |Description
|
2015-05-13 06:04:56 -04:00
|
|
|
|`must` |The clause (query) must appear in matching documents and will
|
|
|
|
contribute to the score.
|
|
|
|
|
|
|
|
|`filter` |The clause (query) must appear in matching documents. However unlike
|
2016-12-29 05:05:28 -05:00
|
|
|
`must` the score of the query will be ignored. Filter clauses are executed
|
|
|
|
in <<query-filter-context,filter context>>, meaning that scoring is ignored
|
|
|
|
and clauses are considered for caching.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
2018-12-03 05:49:11 -05:00
|
|
|
|`should` |The clause (query) should appear in the matching document.
|
2013-08-28 19:24:34 -04:00
|
|
|
|
|
|
|
|`must_not` |The clause (query) must not appear in the matching
|
2017-01-10 11:26:14 -05:00
|
|
|
documents. Clauses are executed in <<query-filter-context,filter context>> meaning
|
|
|
|
that scoring is ignored and clauses are considered for caching. Because scoring is
|
|
|
|
ignored, a score of `0` for all documents is returned.
|
2013-08-28 19:24:34 -04:00
|
|
|
|=======================================================================
|
|
|
|
|
2014-11-24 10:07:18 -05:00
|
|
|
The `bool` query takes a _more-matches-is-better_ approach, so the score from
|
2016-04-29 10:42:03 -04:00
|
|
|
each matching `must` or `should` clause will be added together to provide the
|
2014-11-24 10:07:18 -05:00
|
|
|
final `_score` for each document.
|
|
|
|
|
2019-09-09 12:35:50 -04:00
|
|
|
[source,console]
|
2013-08-28 19:24:34 -04:00
|
|
|
--------------------------------------------------
|
2016-04-29 10:42:03 -04:00
|
|
|
POST _search
|
2013-08-28 19:24:34 -04:00
|
|
|
{
|
2016-04-29 10:42:03 -04:00
|
|
|
"query": {
|
2013-08-28 19:24:34 -04:00
|
|
|
"bool" : {
|
2016-04-29 10:42:03 -04:00
|
|
|
"must" : {
|
2020-08-03 13:31:19 -04:00
|
|
|
"term" : { "user.id" : "kimchy" }
|
2016-04-29 10:42:03 -04:00
|
|
|
},
|
|
|
|
"filter": {
|
2020-08-03 13:31:19 -04:00
|
|
|
"term" : { "tags" : "production" }
|
2016-04-29 10:42:03 -04:00
|
|
|
},
|
|
|
|
"must_not" : {
|
|
|
|
"range" : {
|
2017-01-23 11:27:42 -05:00
|
|
|
"age" : { "gte" : 10, "lte" : 20 }
|
2016-04-29 10:42:03 -04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
"should" : [
|
2020-08-03 13:31:19 -04:00
|
|
|
{ "term" : { "tags" : "env1" } },
|
|
|
|
{ "term" : { "tags" : "deployed" } }
|
2016-04-29 10:42:03 -04:00
|
|
|
],
|
|
|
|
"minimum_should_match" : 1,
|
|
|
|
"boost" : 1.0
|
2013-08-28 19:24:34 -04:00
|
|
|
}
|
2016-04-29 10:42:03 -04:00
|
|
|
}
|
2013-08-28 19:24:34 -04:00
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2016-01-13 05:55:56 -05:00
|
|
|
|
2019-12-04 12:44:13 -05:00
|
|
|
[[bool-min-should-match]]
|
|
|
|
==== Using `minimum_should_match`
|
|
|
|
|
|
|
|
You can use the `minimum_should_match` parameter to specify the number or
|
|
|
|
percentage of `should` clauses returned documents _must_ match.
|
|
|
|
|
|
|
|
If the `bool` query includes at least one `should` clause and no `must` or
|
|
|
|
`filter` clauses, the default value is `1`.
|
|
|
|
Otherwise, the default value is `0`.
|
|
|
|
|
|
|
|
For other valid values, see the
|
|
|
|
<<query-dsl-minimum-should-match, `minimum_should_match` parameter>>.
|
|
|
|
|
2019-04-30 10:19:09 -04:00
|
|
|
[[score-bool-filter]]
|
2016-04-29 10:42:03 -04:00
|
|
|
==== Scoring with `bool.filter`
|
2016-01-13 05:55:56 -05:00
|
|
|
|
|
|
|
Queries specified under the `filter` element have no effect on scoring --
|
|
|
|
scores are returned as `0`. Scores are only affected by the query that has
|
2016-04-29 10:42:03 -04:00
|
|
|
been specified. For instance, all three of the following queries return
|
|
|
|
all documents where the `status` field contains the term `active`.
|
2016-01-13 05:55:56 -05:00
|
|
|
|
|
|
|
This first query assigns a score of `0` to all documents, as no scoring
|
2016-04-29 10:42:03 -04:00
|
|
|
query has been specified:
|
2016-01-13 05:55:56 -05:00
|
|
|
|
2019-09-09 12:35:50 -04:00
|
|
|
[source,console]
|
2016-01-13 05:55:56 -05:00
|
|
|
---------------------------------
|
|
|
|
GET _search
|
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"bool": {
|
|
|
|
"filter": {
|
|
|
|
"term": {
|
|
|
|
"status": "active"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
---------------------------------
|
|
|
|
|
2016-04-29 10:42:03 -04:00
|
|
|
This `bool` query has a `match_all` query, which assigns a score of `1.0` to
|
2016-01-13 05:55:56 -05:00
|
|
|
all documents.
|
|
|
|
|
2019-09-09 12:35:50 -04:00
|
|
|
[source,console]
|
2016-01-13 05:55:56 -05:00
|
|
|
---------------------------------
|
|
|
|
GET _search
|
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"bool": {
|
2016-04-29 10:42:03 -04:00
|
|
|
"must": {
|
2016-01-13 05:55:56 -05:00
|
|
|
"match_all": {}
|
|
|
|
},
|
|
|
|
"filter": {
|
|
|
|
"term": {
|
|
|
|
"status": "active"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
---------------------------------
|
|
|
|
|
2016-04-29 10:42:03 -04:00
|
|
|
This `constant_score` query behaves in exactly the same way as the second example above.
|
2016-01-13 05:55:56 -05:00
|
|
|
The `constant_score` query assigns a score of `1.0` to all documents matched
|
2016-04-29 10:42:03 -04:00
|
|
|
by the filter.
|
2016-01-13 05:55:56 -05:00
|
|
|
|
2019-09-09 12:35:50 -04:00
|
|
|
[source,console]
|
2016-01-13 05:55:56 -05:00
|
|
|
---------------------------------
|
|
|
|
GET _search
|
|
|
|
{
|
|
|
|
"query": {
|
|
|
|
"constant_score": {
|
|
|
|
"filter": {
|
|
|
|
"term": {
|
|
|
|
"status": "active"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
---------------------------------
|
2016-03-22 15:07:57 -04:00
|
|
|
|
2020-08-05 13:42:13 -04:00
|
|
|
[[named-queries]]
|
|
|
|
==== Named queries
|
2016-03-22 15:07:57 -04:00
|
|
|
|
2020-08-05 13:42:13 -04:00
|
|
|
Each query accepts a `_name` in its top level definition. You can use named
|
|
|
|
queries to track which queries matched returned documents. If named queries are
|
|
|
|
used, the response includes a `matched_queries` property for each hit.
|
|
|
|
|
|
|
|
[source,console]
|
|
|
|
----
|
|
|
|
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"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
----
|