Skip to content

Commit

Permalink
Painless Context Doc: Add min should match example (#35423)
Browse files Browse the repository at this point in the history
  • Loading branch information
mayya-sharipova committed Nov 15, 2018
1 parent 2c3597f commit ee9a271
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,52 @@ 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 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,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
@@ -1,4 +1,5 @@


/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
Expand Down Expand Up @@ -396,5 +397,34 @@ public void testFilterScript() {
params, true);
assertTrue(result);
}


// 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 ee9a271

Please sign in to comment.