Elasticsearch按日时段查询遇运行时错误的解决方法
修复Elasticsearch按小时过滤时间字段的运行时错误
场景说明
文档中的timestamp字段采用ISO 8601格式,示例值如下:
2022-11-17T17:16:26.397Z
需要查询2022-11-01至2022-11-30期间,每天11:05到15:05的所有文档。
初始查询语句
最初使用的Elasticsearch查询DSL为:
"query": { "bool": { "filter": { "bool": { "must": [ { "range": { "timestamp": { "gte": "2022-11-01", "lte": "2022-11-30" } } }, { "script": { "script": { "source": "doc.timestamp.getHourOfDay() >= params.min && doc.timestamp.getHourOfDay() <= params.max", "params": { "min": 11, "max": 15 } } } } ] } } } }
问题现象
当timestamp字段的小时部分以0开头时(例如"timestamp": "2022-11-07T01:04:39.357551"),执行上述查询会触发运行时错误。
解决方法
修改脚本中获取小时的逻辑,从直接调用字段的getHourOfDay()方法,改为通过字段值对象调用getHour()方法:
原脚本核心片段:
"source": "doc.timestamp.getHourOfDay() >= params.min && doc.timestamp.getHourOfDay() <= params.max",
修改后的脚本核心片段:
"source": "doc['timestamp'].value.getHour() >= params.min && doc['timestamp'].value.getHour() <= params.max",
修改后即可正常执行查询,不再触发运行时错误。
内容的提问来源于stack exchange,提问作者Dun King
相关产品推荐
相关产品推荐

