diff --git a/docs/build.gradle b/docs/build.gradle index 377ee7af0c5..90848e3cdfb 100644 --- a/docs/build.gradle +++ b/docs/build.gradle @@ -1157,4 +1157,4 @@ buildRestTests.setups['seats'] = ''' {"index":{}} {"theatre": "Graye", "cost": 8} {"index":{}} - {"theatre": "Skyline", "cost": 10}''' \ No newline at end of file + {"theatre": "Skyline", "cost": 10}''' diff --git a/docs/painless/painless-contexts.asciidoc b/docs/painless/painless-contexts.asciidoc index d3f598525a8..7c342a3da7a 100644 --- a/docs/painless/painless-contexts.asciidoc +++ b/docs/painless/painless-contexts.asciidoc @@ -46,6 +46,8 @@ specialized code may define new ways to use a Painless script. | {ref}/search-aggregations-metrics-scripted-metric-aggregation.html[Elasticsearch Documentation] | Bucket script aggregation | <> | {ref}/search-aggregations-pipeline-bucket-script-aggregation.html[Elasticsearch Documentation] +| Bucket selector aggregation | <> + | {ref}/search-aggregations-pipeline-bucket-selector-aggregation.html[Elasticsearch Documentation] | Watcher condition | <> | {xpack-ref}/condition-script.html[Elasticsearch Documentation] | Watcher transform | <> diff --git a/docs/painless/painless-contexts/index.asciidoc b/docs/painless/painless-contexts/index.asciidoc index df0c6f71e77..0c8c21c06a9 100644 --- a/docs/painless/painless-contexts/index.asciidoc +++ b/docs/painless/painless-contexts/index.asciidoc @@ -30,6 +30,8 @@ include::painless-metric-agg-reduce-context.asciidoc[] include::painless-bucket-script-agg-context.asciidoc[] +include::painless-bucket-selector-agg-context.asciidoc[] + include::painless-analysis-predicate-context.asciidoc[] include::painless-watcher-condition-context.asciidoc[] diff --git a/docs/painless/painless-contexts/painless-bucket-selector-agg-context.asciidoc b/docs/painless/painless-contexts/painless-bucket-selector-agg-context.asciidoc new file mode 100644 index 00000000000..8e20cf77c35 --- /dev/null +++ b/docs/painless/painless-contexts/painless-bucket-selector-agg-context.asciidoc @@ -0,0 +1,81 @@ + +[[painless-bucket-selector-agg-context]] +=== Bucket selector aggregation context + +Use a Painless script in an +{ref}/search-aggregations-pipeline-bucket-selector-aggregation.html[`bucket_selector` aggregation] +to determine if a bucket should be retained or filtered out. + +==== Variables + +`params` (`Map`, read-only):: + User-defined parameters passed in as part of the query. The parameters + include values defined as part of the `buckets_path`. + +==== Return + +boolean:: + True if the the bucket should be retained, false if the bucket should be filtered out. + +==== API + + +To run this example, first follow the steps in <>. + +The painless context in a `bucket_selector` aggregation provides a `params` map. This map contains both +user-specified custom values, as well as the values from other aggregations specified in the `buckets_path` +property. + +Unlike some other aggregation contexts, the `bucket_selector` context must return a boolean `true` or `false`. + +This example finds the max of each bucket, adds a user-specified base_cost, and retains all of the +buckets that are greater than `10`. + +[source,Painless] +-------------------------------------------------- +params.max + params.base_cost > 10 +-------------------------------------------------- + +Note that the values are extracted from the `params` map. The script is in the form of an expression +that returns `true` or `false`. In context, the aggregation looks like this: + +[source,js] +-------------------------------------------------- +GET /seats/_search +{ + "size": 0, + "aggs": { + "theatres": { + "terms": { + "field": "theatre", + "size": 10 + }, + "aggs": { + "max_cost": { + "max": { + "field": "cost" + } + }, + "filtering_agg": { + "bucket_selector": { + "buckets_path": { <1> + "max": "max_cost" + }, + "script": { + "params": { + "base_cost": 5 <2> + }, + "source": "params.max + params.base_cost > 10" + } + } + } + } + } + } +} +-------------------------------------------------- +// CONSOLE +// TEST[setup:seats] +<1> The `buckets_path` points to the max aggregations (`max_cost`) and adds `max` variables +to the `params` map +<2> The user-specified `base_cost` is also added to the `params` map \ No newline at end of file