桶脚本聚合
bucket_script
聚合是一种父管道聚合,它执行脚本以对一组桶执行每个桶的数值计算。使用 bucket_script
聚合可以在桶式聚合中对多个度量进行自定义数值计算。例如,您可以
- 计算派生和复合度量。
- 使用 if/else 语句应用条件逻辑。
- 计算业务特定的 KPI,例如自定义评分度量。
参数
bucket_script
聚合接受以下参数。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
buckets_path | 必需 | 对象 | 将变量名映射到桶化度量的映射,这些度量用于脚本中。度量必须是数值类型。参见 脚本变量。 |
script(脚本) | 必需 | 字符串或对象 | 要执行的脚本。可以是内联脚本、存储脚本或脚本文件。脚本可以访问在 buckets_path 参数中定义的变量名。必须返回一个数值。 |
gap_policy | 可选 | 字符串 | 应用于缺失数据的策略。有效值为 skip 和 insert_zeros 。默认为 skip 。参见 数据间隙。 |
format | 可选 | 字符串 | 一个 DecimalFormat 格式化字符串。在聚合的 value_as_string 参数中返回格式化后的输出。 |
脚本变量
buckets_path
参数将脚本变量名映射到来自父聚合的度量。这些变量随后可以在脚本中使用。
对于 bucket_script
和 bucket_selector
聚合,buckets_path
参数是一个对象而不是字符串,因为它必须引用多个桶度量。有关 buckets_path
字符串版本的描述,请参阅 管道聚合 页面。
以下 buckets_path
将 sales_sum
度量映射到 total_sales
脚本变量,并将 item_count
度量映射到 item_count
脚本变量
"buckets_path": {
"total_sales": "sales_sum",
"item_count": "item_count"
}
映射的变量可以从 params
上下文中访问。例如
params.total_sales
params.item_count
启用内联脚本
使用 script
参数添加您的脚本。脚本可以是内联的、文件中的或索引中的。要启用内联脚本,config
文件夹中的 opensearch.yml
文件必须包含以下内容
script.inline: on
示例
以下示例使用 OpenSearch Dashboards 电子商务样本数据创建了一个月间隔的日期直方图。total_sales
子聚合计算每个月售出所有商品的含税价格总和。vendor_count
聚合计算每个月唯一供应商的总数。最后,avg_vendor_spend
聚合使用内联脚本计算每个月每个供应商的平均支出金额
GET opensearch_dashboards_sample_data_ecommerce/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "taxful_total_price"
}
},
"vendor_count": {
"cardinality": {
"field": "products.manufacturer.keyword"
}
},
"avg_vendor_spend": {
"bucket_script": {
"buckets_path": {
"sales": "total_sales",
"vendors": "vendor_count"
},
"script": "params.sales / params.vendors",
"format": "$#,###.00"
}
}
}
}
}
}
示例响应
聚合返回格式化的每月平均供应商支出
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4675,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2025-03-01T00:00:00.000Z",
"key": 1740787200000,
"doc_count": 721,
"vendor_count": {
"value": 21
},
"total_sales": {
"value": 53468.1484375
},
"avg_vendor_spend": {
"value": 2546.1023065476193,
"value_as_string": "$2,546.10"
}
},
{
"key_as_string": "2025-04-01T00:00:00.000Z",
"key": 1743465600000,
"doc_count": 3954,
"vendor_count": {
"value": 21
},
"total_sales": {
"value": 297415.98046875
},
"avg_vendor_spend": {
"value": 14162.665736607143,
"value_as_string": "$14,162.67"
}
}
]
}
}
}