Elasticsearch聚合如何为bucket各key设置阈值过滤不符合条件的结果
解决方案
在现有聚合逻辑的基础上,新增bucket_selector管道聚合,通过painless脚本为不同服务配置对应阈值判断规则,不符合条件的桶会被直接过滤,不会出现在返回结果中。
修改后的完整聚合语句
"aggs": { "group_by_service": { "terms": { "field": "ServiceName.keyword", "size": 1000 // 可根据实际服务数量调整,避免遗漏服务 }, "aggs": { "group_by_count": { "value_count": { "field": "ServiceName.keyword" } }, "group_by_success": { "filter": { "term": { "ResponseCode": "000" } }, "aggs": { "group_by_count_succ": { "value_count": { "field": "ServiceName.keyword" } } } }, "success_percent": { "bucket_script": { "buckets_path": { "numbersucess": "group_by_success>group_by_count_succ", "totalRequests": "group_by_count" }, "script": "params.numbersucess / params.totalRequests * 100", "format": "0.00" } }, // 新增阈值过滤聚合 "filter_by_threshold": { "bucket_selector": { "buckets_path": { "succ_rate": "success_percent.value" }, "script": """ // 配置每个服务对应的成功率阈值 def thresholds = [ "AAA": 80, "BBB": 90 // 新增其他服务阈值直接在此处添加键值对即可 ]; // 获取当前桶对应的服务名 def serviceName = _key; // 可自定义未配置服务的默认阈值,示例默认要求成功率≥95 def threshold = thresholds.getOrDefault(serviceName, 95); // 符合阈值条件的桶保留,不符合则移除 return params.succ_rate >= threshold; """ } } } } }
逻辑说明
bucket_selector是Elasticsearch原生提供的管道聚合能力,专门用于对聚合生成的桶做条件过滤,无需在查询后二次处理结果,直接返回符合要求的服务数据。- 脚本中的
_key是terms聚合每个桶的内置变量,对应ServiceName的值,不需要额外配置即可直接调用。 - 若需要过滤掉所有未在thresholds中配置的服务,将
getOrDefault的默认值改为101即可。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

