OpenSearch/docs/painless/painless-contexts/painless-min-should-match-c...

80 lines
2.1 KiB
Plaintext

[[painless-min-should-match-context]]
=== Minimum should match context
Use a Painless script to specify the
{ref}/query-dsl-terms-set-query.html[minimum] number of terms that a
specified field needs to match with for a document to be part of the query
results.
*Variables*
`params` (`Map`, read-only)::
User-defined parameters passed in as part of the query.
`params['num_terms']` (`int`, read-only)::
The number of terms specified to match with.
`doc` (`Map`, read-only)::
Contains the fields of the current document where each field is a
`List` of values.
*Return*
`int`::
The minimum number of terms required to match the current document.
*API*
The standard <<painless-api-reference, Painless API>> is available.
*Example*
To run this example, first follow the steps in
<<painless-context-examples, context examples>>.
Imagine that you want to find seats to performances by your favorite
actors. You have a list of favorite actors in mind, and you want
to find performances where the cast includes at least a certain
number of them. `terms_set` query with `minimum_should_match_script`
is a way to accomplish this. To make the query request more configurable,
you can define `min_actors_to_see` as a script parameter.
To ensure that the parameter `min_actors_to_see` doesn't exceed
the number of favorite actors, you can use `num_term`s to get
the number of actors in the list and `Math.min` to get the lesser
of the two.
[source,Painless]
----
Math.min(params['num_terms'], params['min_actors_to_see'])
----
The following request finds seats to performances with at least
two of the three specified actors.
[source,console]
----
GET seats/_search
{
"query": {
"terms_set": {
"actors": {
"terms": [
"smith",
"earns",
"black"
],
"minimum_should_match_script": {
"source": "Math.min(params['num_terms'], params['min_actors_to_see'])",
"params": {
"min_actors_to_see": 2
}
}
}
}
}
}
----
// TEST[skip: requires setup from other pages]