能否在日期区间内按每日特定时间段查询Elasticsearch数据?
如何在Elasticsearch中查询日期区间内每日特定时间段的数据
完全可以实现这类需求,你只需要在原有的布尔过滤器中新增一个脚本过滤器,用来筛选每天特定小时范围内的数据。以下是修改后的完整DSL:
{ "size": 0, "query": { "bool": { "filter": [ { "term": { "status": "ok" } }, { "term": { "deviceId": "123456789" } }, { "range": { "time": { "gte": 1669852800, // 对应2022-12-01 00:00:00的时间戳 "lt": 1671062400 // 对应2022-12-16 00:00:00的时间戳,确保覆盖12.1-12.15全天 } } }, { "script": { "source": "doc['time'].value.getHour() >= 7 && doc['time'].value.getHour() < 9" } } ] } }, "aggs": { "results": { "date_histogram": { "field": "time", "fixed_interval": "60m", // 补充单位,按60分钟间隔聚合;若需按天聚合可改为"1d" "format": "yyyy-MM-dd HH:mm" // 可选:让聚合结果的时间格式更直观 } } } }
关键说明:
- 新增的
script过滤器会提取每个文档time字段的小时数,判断是否落在**7点(含)到9点(不含)**的区间内,精准筛选每日的目标时间段。 - 原DSL中的
fixed_interval参数缺少单位,这里补充为60m;如果你的聚合需求是按天统计,可改为1d。 - 时间范围的
lt值设为12月16日0点,确保覆盖12月15日全天的所有数据。
如果你的Elasticsearch版本支持,也可以用range查询结合脚本字段的写法,效果一致:
{ "range": { "script": { "source": "doc['time'].value.getHour()", "gte": 7, "lt": 9 } } }
内容的提问来源于stack exchange,提问作者James Fu
相关产品推荐
相关产品推荐

