[[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.

To achieve this result, use a `terms_set` query with
`minimum_should_match_script`. 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_terms` 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[setup:seats]
