如何统计date_histogram聚合中summary.severity的1、2级总数?
如何在Elasticsearch中按天、资产分组后统计指定Severity的数量?
我需要基于group_by_asset的summary.severity字段做聚合统计,具体要跟踪每个桶内severity值为1和2的数量(命名为how_many_ones、how_many_twos)。以下是我当前的Elasticsearch查询:
{ "runtime_mappings": { // 自定义运行时字段 }, "aggs": { "histogram_data": { "date_histogram": { "field": "timestamp", "calendar_interval": "day", "extended_bounds": { "min": "2023-06-12T07:00:00.000Z", "max": "2024-06-11T19:11:32.532Z" } }, "aggs": { "group_by_asset": { "multi_terms": { "terms": [ { "field": "asset.id" }, { "field": "summary.severity" }, // 目标统计字段 { "field": "asset.name", "missing": "N/A" } ] } } } } }, "query": { ... } }
当前查询返回的结果按天拆分,示例如下:
{ "group_by_asset": { "buckets": [ { "key_as_string": "...", "key": ["123", 2, "BLT"], // 包含severity值的分组键 "doc_count": 1 } ], "sum_other_doc_count": 0, "doc_count_error_upper_bound": 0 }, "key_as_string": "2024-04-18T00:00:00.000Z", "key": 1713398400000, "doc_count": 1 }, { "group_by_asset": { ... } }
尝试调整聚合结构但未成功,请问如何修改查询实现需求?
解决方案
你需要调整聚合层级:先按资产(asset.id+asset.name)分组,再在每个资产桶内用filters聚合分别统计severity=1和severity=2的文档数量。修改后的查询如下:
{ "runtime_mappings": { // 自定义运行时字段 }, "aggs": { "histogram_data": { "date_histogram": { "field": "timestamp", "calendar_interval": "day", "extended_bounds": { "min": "2023-06-12T07:00:00.000Z", "max": "2024-06-11T19:11:32.532Z" } }, "aggs": { "group_by_asset": { "multi_terms": { "terms": [ { "field": "asset.id" }, { "field": "asset.name", "missing": "N/A" } ] }, "aggs": { "severity_stats": { "filters": { "filters": { "how_many_ones": { "term": { "summary.severity": 1 } }, "how_many_twos": { "term": { "summary.severity": 2 } } } } } } } } } }, "query": { ... } }
调整说明
- 修改
group_by_asset的multi_terms分组,去掉summary.severity,只保留资产维度(asset.id+asset.name),确保每个资产作为独立桶。 - 在资产桶内新增
severity_stats的filters聚合,分别匹配summary.severity=1和summary.severity=2,直接统计对应数量。 - 返回结果中,每个天桶下的资产桶会包含
severity_stats字段,其中how_many_ones和how_many_twos就是对应severity的文档数。
示例返回结构如下:
{ "key_as_string": "2024-04-18T00:00:00.000Z", "key": 1713398400000, "doc_count": 5, "group_by_asset": { "buckets": [ { "key_as_string": "123|BLT", "key": ["123", "BLT"], "doc_count": 3, "severity_stats": { "buckets": { "how_many_ones": { "doc_count": 1 }, "how_many_twos": { "doc_count": 2 } } } } ] } }
内容的提问来源于stack exchange,提问作者GustaMan9000
相关产品推荐
相关产品推荐

