Skip to content

Commit 71a1066

Browse files
Painless Context Doc: Add filter context example (#35305)
1 parent a134a76 commit 71a1066

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

docs/painless/painless-contexts/painless-filter-context.asciidoc

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,43 @@ query to include and exclude documents.
2323

2424
*API*
2525

26-
The standard <<painless-api-reference, Painless API>> is available.
26+
The standard <<painless-api-reference, Painless API>> is available.
27+
28+
*Example*
29+
30+
To run this example, first follow the steps in
31+
<<painless-context-examples, context examples>>.
32+
33+
This script finds all unsold documents that cost less than $18.
34+
35+
[source,Painless]
36+
----
37+
doc['sold'].value == false && doc['cost'].value < 18
38+
----
39+
40+
Defining cost as a script parameter enables the cost to be configured
41+
in the script query request. For example, the following request finds
42+
all available theatre seats for evening performances that are under $18.
43+
44+
[source,js]
45+
----
46+
GET evening/_search
47+
{
48+
"query": {
49+
"bool" : {
50+
"filter" : {
51+
"script" : {
52+
"script" : {
53+
"source" : "doc['sold'].value == false && doc['cost'].value < params.cost",
54+
"params" : {
55+
"cost" : 18
56+
}
57+
}
58+
}
59+
}
60+
}
61+
}
62+
}
63+
----
64+
// CONSOLE
65+
// TEST[skip: requires setup from other pages]

modules/lang-painless/src/test/java/org/elasticsearch/painless/ContextExampleTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
/*
23
* Licensed to Elasticsearch under one or more contributor
34
* license agreements. See the NOTICE file distributed with
@@ -359,5 +360,41 @@ public void testScriptFieldsScript() {
359360
singletonMap("_source", source), true)
360361
);
361362
}
363+
364+
// Use script query request to filter documents
365+
/*
366+
GET localhost:9200/evening/_search
367+
{
368+
"query": {
369+
"bool" : {
370+
"filter" : {
371+
"script" : {
372+
"script" : {
373+
"source" : "doc['sold'].value == false && doc['cost'].value < params.cost",
374+
"params" : {
375+
"cost" : 18
376+
}
377+
}
378+
}
379+
}
380+
}
381+
}
382+
}
383+
*/
384+
385+
public void testFilterScript() {
386+
Map<String, Object> source = new HashMap<>();
387+
source.put("sold", false);
388+
source.put("cost", 15);
389+
390+
Map<String, Object> params = new HashMap<>();
391+
params.put("_source", source);
392+
params.put("cost", 18);
393+
394+
boolean result = (boolean) exec(
395+
" params['_source']['sold'] == false && params['_source']['cost'] < params.cost;",
396+
params, true);
397+
assertTrue(result);
398+
}
362399
}
363400

0 commit comments

Comments
 (0)