Skip to content

Commit

Permalink
Painless Context Doc: Add min should match example
Browse files Browse the repository at this point in the history
relates to elastic#34829
  • Loading branch information
mayya-sharipova committed Nov 9, 2018
1 parent ba47882 commit 01e8616
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,53 @@ results.

*API*

The standard <<painless-api-reference, Painless API>> is available.
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 where your favorite
actors play. You have a list of favorite actors in mind, and you want
to find performances that have at least certain minimum number of actors
from your favorite list. `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 `min_actors_to_see` parameter doesn't exceed the number
your favorite actors, use the script below. This script
selects the minimum value between the parameter `min_actors_to_see` and
the parameter `num_terms`, which represents the length of the list of
your favorite actors.

[source,Painless]
----
Math.min(params['num_terms'], params['min_actors_to_see'])
----

Submit the following request to find seats to performances with your favorite actors:

[source,js]
----
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
}
}
}
}
}
}
----
// CONSOLE
// TEST[skip: requires setup from other pages]

Original file line number Diff line number Diff line change
Expand Up @@ -359,5 +359,35 @@ public void testScriptFieldsScript() {
singletonMap("_source", source), true)
);
}


// Use script_fields API to add two extra fields to the hits
/*
curl -X GET localhost:9200/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
}
}
}
}
}
}
*/
public void testMinShouldMatchScript() {
Map<String, Object> params = new HashMap<>();
params.put("num_terms", 3);
params.put("min_actors_to_see", 2);

double result = (double) exec("Math.min(params['num_terms'], params['min_actors_to_see']);", params, true);
assertEquals(2, result, 0);
}

}

0 comments on commit 01e8616

Please sign in to comment.