Elasticsearch聚合查询如何将无匹配数据的日期桶默认返回0?
解决方案
你需要给date_histogram聚合添加两个配置参数,即可实现无匹配数据的日期默认返回命中数0:
min_doc_count: 0:强制返回文档数为0的时间桶,而非直接忽略无数据的时段extended_bounds:显式指定统计覆盖的时间范围,确保你需要的整个查询周期内所有日期都会生成对应的统计桶
修改后完整查询代码
GET index/_search { "size": 0, "query": { "bool": { "must": [ { "match_phrase": { "message": "Cannot login" } }, { "range": { "@timestamp":{ "gte":"2021-07-01", "lte":"2021-07-07" } } } ] } }, "aggs": { "hit_count_per_day": { "date_histogram": { "field": "@timestamp", "calendar_interval": "day", "min_doc_count": 0, "extended_bounds": { "gte": "2021-07-01", "lte": "2021-07-07" } } } } }
原理解释
你原来的查询逻辑是先过滤出同时满足「message匹配、时间在指定范围」的所有文档,再基于这些文档做日粒度聚合。如果某一天完全没有匹配的文档,聚合时就不会生成对应日期的桶。添加上述两个参数后,即便没有匹配文档,聚合也会按你指定的时间范围生成所有日期的桶,无数据的桶doc_count会默认返回0。
内容的提问来源于stack exchange,提问作者HC LW
相关产品推荐
相关产品推荐

