ElasticSearch:基于聚合二次聚合统计各项目最新状态数量
解决方案:管道聚合实现状态统计
你当前的查询已经完成了按项目分组并获取最新状态的第一步,接下来通过管道聚合对这些状态做统计即可。用bucket_script提取每个项目的最新状态,再用terms管道聚合完成最终统计:
GET journaling*/_search { "query": { "bool": { "filter": [ { "range": { "DATETIME": { "gte": "2024/12/07 00:00:00.000", "lte": "2024/12/07 23:59:59.000" } } }, { "match": { "ACCOUNT": "12345" } } ] } }, "size": 0, "aggs": { "ProjectGroups": { "terms": { "field": "PROJECTID", "size": 10000 // 设置为足够大的值覆盖所有项目,避免遗漏 }, "aggs": { "LatestStatus": { "top_hits": { "size": 1, "_source": ["EVENTDESCRIPTION"], "sort": { "DATETIME": { "order": "desc" } } } }, // 从top_hits结果中提取最新状态字段 "CurrentStatus": { "bucket_script": { "buckets_path": { "status": "LatestStatus.hits.hits.0._source.EVENTDESCRIPTION" }, "script": "params.status" } } } }, // 统计各状态对应的项目数量 "StatusCount": { "terms": { "field": "CurrentStatus", "size": 10 // 根据实际状态类型数量调整 } } } }
关键注意点
ProjectGroups的size必须大于等于项目总数,否则会因项目遗漏导致统计结果不准- 确保
EVENTDESCRIPTION是keyword类型,若为text类型,需改用EVENTDESCRIPTION.keyword作为聚合字段 - 日期范围已调整为匹配示例数据,实际使用时按需修改
后续按天聚合的实现思路
如果要生成跨日期的状态统计图表,只需在现有聚合外层嵌套date_histogram按天分组,再在每个日期分组内执行相同的项目状态统计逻辑:
GET journaling*/_search { "query": { "bool": { "filter": [ { "range": { "DATETIME": { "gte": "2024/12/01 00:00:00.000", "lte": "2024/12/07 23:59:59.000" } } }, { "match": { "ACCOUNT": "12345" } } ] } }, "size": 0, "aggs": { "DailyGroups": { "date_histogram": { "field": "DATETIME", "calendar_interval": "day", "format": "yyyy-MM-dd" }, "aggs": { "ProjectGroups": { "terms": { "field": "PROJECTID", "size": 10000 }, "aggs": { "LatestStatus": { "top_hits": { "size": 1, "_source": ["EVENTDESCRIPTION"], "sort": { "DATETIME": { "order": "desc" } } } }, "CurrentStatus": { "bucket_script": { "buckets_path": { "status": "LatestStatus.hits.hits.0._source.EVENTDESCRIPTION" }, "script": "params.status" } } } }, "DailyStatusCount": { "terms": { "field": "CurrentStatus", "size": 10 } } } } } }
内容的提问来源于stack exchange,提问作者Scott Lynn
相关产品推荐
相关产品推荐

