Bucket script aggregation
A parent pipeline aggregation which executes a script which can perform per bucket computations on specified metrics in the parent multi-bucket aggregation. The specified metric must be numeric and the script must return a numeric value.
Syntax
A bucket_script aggregation looks like this in isolation:
{
"bucket_script": {
"buckets_path": {
"my_var1": "the_sum",
"my_var2": "the_value_count"
},
"script": "params.my_var1 / params.my_var2"
}
} | Here, |
Table 56. bucket_script Parameters
| Parameter Name | Description | Required | Default Value |
|---|---|---|---|
| The script to run for this aggregation. The script can be inline, file or indexed. (see Scripting for more details) | Required | |
| A map of script variables and their associated path to the buckets we wish to use for the variable (see | Required | |
| The policy to apply when gaps are found in the data (see Dealing with gaps in the data for more details) | Optional |
|
| DecimalFormat pattern for the output value. If specified, the formatted value is returned in the aggregation’s | Optional |
|
The following snippet calculates the ratio percentage of t-shirt sales compared to total sales each month:
resp = client.search(
index="sales",
size=0,
aggs={
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"t-shirts": {
"filter": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
}
}
},
"t-shirt-percentage": {
"bucket_script": {
"buckets_path": {
"tShirtSales": "t-shirts>sales",
"totalSales": "total_sales"
},
"script": "params.tShirtSales / params.totalSales * 100"
}
}
}
}
},
)
print(resp) response = client.search(
index: 'sales',
body: {
size: 0,
aggregations: {
sales_per_month: {
date_histogram: {
field: 'date',
calendar_interval: 'month'
},
aggregations: {
total_sales: {
sum: {
field: 'price'
}
},
"t-shirts": {
filter: {
term: {
type: 't-shirt'
}
},
aggregations: {
sales: {
sum: {
field: 'price'
}
}
}
},
"t-shirt-percentage": {
bucket_script: {
buckets_path: {
"tShirtSales": 't-shirts>sales',
"totalSales": 'total_sales'
},
script: 'params.tShirtSales / params.totalSales * 100'
}
}
}
}
}
}
)
puts response const response = await client.search({
index: "sales",
size: 0,
aggs: {
sales_per_month: {
date_histogram: {
field: "date",
calendar_interval: "month",
},
aggs: {
total_sales: {
sum: {
field: "price",
},
},
"t-shirts": {
filter: {
term: {
type: "t-shirt",
},
},
aggs: {
sales: {
sum: {
field: "price",
},
},
},
},
"t-shirt-percentage": {
bucket_script: {
buckets_path: {
tShirtSales: "t-shirts>sales",
totalSales: "total_sales",
},
script: "params.tShirtSales / params.totalSales * 100",
},
},
},
},
},
});
console.log(response); POST /sales/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "date",
"calendar_interval": "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"t-shirts": {
"filter": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
}
}
},
"t-shirt-percentage": {
"bucket_script": {
"buckets_path": {
"tShirtSales": "t-shirts>sales",
"totalSales": "total_sales"
},
"script": "params.tShirtSales / params.totalSales * 100"
}
}
}
}
}
} And the following may be the response:
{
"took": 11,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/01/01 00:00:00",
"key": 1420070400000,
"doc_count": 3,
"total_sales": {
"value": 550.0
},
"t-shirts": {
"doc_count": 1,
"sales": {
"value": 200.0
}
},
"t-shirt-percentage": {
"value": 36.36363636363637
}
},
{
"key_as_string": "2015/02/01 00:00:00",
"key": 1422748800000,
"doc_count": 2,
"total_sales": {
"value": 60.0
},
"t-shirts": {
"doc_count": 1,
"sales": {
"value": 10.0
}
},
"t-shirt-percentage": {
"value": 16.666666666666664
}
},
{
"key_as_string": "2015/03/01 00:00:00",
"key": 1425168000000,
"doc_count": 2,
"total_sales": {
"value": 375.0
},
"t-shirts": {
"doc_count": 1,
"sales": {
"value": 175.0
}
},
"t-shirt-percentage": {
"value": 46.666666666666664
}
}
]
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/search-aggregations-pipeline-bucket-script-aggregation.html