Elasticsearch中bucket_script聚合无返回,如何修改请求计算成功率
问题原因
- 你在
bucket_script中指定的buckets_path路径错误:total和success都是terms聚合类型,返回结构是包含多个桶的buckets数组,没有顶层的doc_count字段,ES无法读取到对应数值,因此没有输出成功率字段。 - 现有聚合存在冗余设计:不需要嵌套多层terms聚合统计总数和成功数,可大幅简化。
修复后的搜索请求
{ "size": 0, "_source": false, "query": { "bool": { "filter": [ { "term": { "action": "login" } } ] } }, "aggs": { "action_bucket": { "terms": { "field": "action", "show_term_doc_count_error": true }, "aggs": { "success_count": { "filter": { "term": { "success": true } } }, "action_success_rate": { "bucket_script": { "buckets_path": { "no_total": "_count", "no_success": "success_count._count" }, "script": "params.no_total == 0 ? 0 : 100 * params.no_success / params.no_total", "gap_policy": "skip" } } } } } }
修改说明
- 去掉了冗余的
totalterms聚合:terms桶本身的_count就是当前action的总请求数,直接通过_count即可读取 - 简化了成功数统计逻辑:仅保留
filter聚合success_count,其本身的_count就是成功请求的数量,不需要再嵌套terms聚合 - 修正了
buckets_path路径,直接读取聚合返回的count数值 - 脚本中增加了分母为0的判断,避免总请求数为0时出现算术异常
- 增加
gap_policy配置,遇到空值时直接跳过避免报错
内容的提问来源于stack exchange,提问作者JalalJaberi
相关产品推荐
相关产品推荐

