Painless Context Doc: Add min should match example (#35423)

This commit is contained in:
Mayya Sharipova 2018-11-15 15:10:49 -05:00 committed by GitHub
parent 501c03e529
commit a8833b097b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 79 additions and 1 deletions

View File

@ -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]

View File

@ -1,4 +1,5 @@
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
@ -396,5 +397,34 @@ public class ContextExampleTests extends ScriptTestCase {
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);
}
}