OpenSearch/docs/reference/query-dsl/bool-query.asciidoc

144 lines
3.8 KiB
Plaintext
Raw Normal View History

[[query-dsl-bool-query]]
=== Bool Query
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
|`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
`must` the score of the query will be ignored.
|`should` |The clause (query) should appear in the matching document. In
a boolean query with no `must` clauses, one or more `should` clauses
must match a document. The minimum number of should clauses to match can
be set using the
<<query-dsl-minimum-should-match,`minimum_should_match`>>
parameter.
|`must_not` |The clause (query) must not appear in the matching
documents.
|=======================================================================
[IMPORTANT]
.Bool query in filter context
========================================================================
If this query is used in a filter context and it has `should`
clauses then at least one `should` clause is required to match.
========================================================================
The bool query also supports `disable_coord` parameter (defaults to
`false`). Basically the coord similarity computes a score factor based
on the fraction of all query terms that a document contains. See Lucene
`BooleanQuery` for more details.
The `bool` query takes a _more-matches-is-better_ approach, so the score from
each matching `must` or `should` clause will be added together to provide the
final `_score` for each document.
[source,js]
--------------------------------------------------
{
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
2015-11-17 19:02:52 -05:00
},
"must_not" : {
"range" : {
"age" : { "from" : 10, "to" : 20 }
}
},
"should" : [
{
"term" : { "tag" : "wow" }
},
{
"term" : { "tag" : "elasticsearch" }
}
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
--------------------------------------------------
==== Scoring with `bool.filter`
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
been specified. For instance, all three of the following queries return
all documents where the `status` field contains the term `active`.
This first query assigns a score of `0` to all documents, as no scoring
query has been specified:
[source,json]
---------------------------------
GET _search
{
"query": {
"bool": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
---------------------------------
// AUTOSENSE
This `bool` query has a `match_all` query, which assigns a score of `1.0` to
all documents.
[source,json]
---------------------------------
GET _search
{
"query": {
"bool": {
"query": {
"match_all": {}
},
"filter": {
"term": {
"status": "active"
}
}
}
}
}
---------------------------------
// AUTOSENSE
This `constant_score` query behaves in exactly the same way as the second example above.
The `constant_score` query assigns a score of `1.0` to all documents matched
by the filter.
[source,json]
---------------------------------
GET _search
{
"query": {
"constant_score": {
"filter": {
"term": {
"status": "active"
}
}
}
}
}
---------------------------------
// AUTOSENSE