By now, you have probably realized that multi-word 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 2 out of the 3should
clauses must match.
Of course, we would normally write these types of queries using the match
query, but understanding how the match
query works internally lets you take
control of the process when you need to. There are some things that 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.