By now, you have probably realized that multiword match
queries simply wrap the generated term
queries in a bool
query. With the
default or
operator, each term
query is added as a should
clause, so
at least one clause must match. These two queries are equivalent:
{
"match": { "title": "brown fox"}
}
{
"bool": {
"should": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }}
]
}
}
With the and
operator, all the term
queries are added as must
clauses,
so all clauses must match. These two queries are equivalent:
{
"match": {
"title": {
"query": "brown fox",
"operator": "and"
}
}
}
{
"bool": {
"must": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }}
]
}
}
And if the minimum_should_match
parameter is specified, it is passed
directly through to the bool
query, making these two queries equivalent:
{
"match": {
"title": {
"query": "quick brown fox",
"minimum_should_match": "75%"
}
}
}
{
"bool": {
"should": [
{ "term": { "title": "brown" }},
{ "term": { "title": "fox" }},
{ "term": { "title": "quick" }}
],
"minimum_should_match": 2 (1)
}
}
-
Because there are only three clauses, the
minimum_should_match
value of75%
in thematch
query is rounded down to2
. At least two out of the threeshould
clauses must match.
Of course, we would normally write these types of queries by using the match
query, but understanding how the match
query works internally lets you take
control of the process when you need to. Some things can’t be
done with a single match
query, such as give more weight to some query terms
than to others. We will look at an example of this in the next section.