Python调用Elasticsearch用内置date math实现自定义时分的时间范围查询
答案
可以实现,完全不需要依赖Python的datetime模块,仅通过Elasticsearch原生支持的date math语法就能满足所有需求。
1. 当日0点到23:59全天查询实现
Elasticsearch的date math支持对时间做取整、偏移计算:now/d表示将当前时间向下取整到当日零点,要获取当日最后一刻可以用now+1d/d-1ms(先将当前时间加1天再取整到下一日零点,再减1毫秒,刚好是当日23:59:59.999,覆盖全天所有时间)。
对应查询代码示例:
query = { 'query': { 'bool': { 'filter': [ {'range': {'@timestamp': { 'gte': 'now/d', 'lte': 'now+1d/d-1ms' }}} ] } } }
2. 精确时分间隔查询实现
针对你需要的固定时分区间(比如30分钟间隔),只需要在当日零点的基础上叠加对应的小时、分钟偏移量即可,不需要硬编码日期。
比如查询当日11:30到12:00的区间,代码如下:
query = { 'query': { 'bool': { 'filter': [ {'range': {'@timestamp': { 'gte': 'now/d+11h+30m', 'lt': 'now/d+12h' }}} ] } } }
如果要调整时间区间,只需要修改后面的小时(h)、分钟(m)的偏移数值即可,比如要查14:00到14:30,就改成gte: now/d+14h,lt: now/d+14h+30m。
注意事项
- 如果你使用的时区不是UTC,需要在时间表达式后追加时区参数避免时差问题,比如东八区(北京时间)就写成
now/d||tz=Asia/Shanghai,示例:{'range': {'@timestamp':{'gte': 'now/d||tz=Asia/Shanghai', 'lte': 'now+1d/d-1ms||tz=Asia/Shanghai'}}} - 用
lt(小于)代替lte(小于等于)定义区间结束时间,可以避免边界时间戳重复命中的问题,更适合分时段查询的场景。
内容的提问来源于stack exchange,提问作者norivotset
相关产品推荐
相关产品推荐

