Elasticsearch中如何仅按指定时间查询date类型timestamp字段
解决方法
你的查询报错是因为Elasticsearch无法将11:05解析为符合yyyy-MM-dd HH:mm:ss格式的日期值。要实现忽略年月日、匹配UTC时间11:05的需求,有两种高效方案:
方案一:使用Painless脚本查询
直接通过脚本提取时间的小时和分钟进行判断,无需修改索引结构:
{ "query": { "bool": { "filter": { "script": { "script": { "source": "doc['timestamp'].value.getHour() == 11 && doc['timestamp'].value.getMinute() == 5", "lang": "painless" } } } } } }
注:Elasticsearch存储date字段时默认使用UTC时区,因此getHour()和getMinute()获取的是UTC时间的时分值,符合需求。
方案二:添加Runtime字段(推荐)
如果需要频繁按时分查询,建议添加一个Runtime字段动态提取HH:mm格式的字符串,既不用重新索引数据,又能利用倒排索引提升查询性能:
1. 为索引添加Runtime字段
PUT /your_index_name/_mapping { "runtime": { "timestamp_hhmm": { "type": "keyword", "script": { "source": "emit(doc['timestamp'].value.format('HH:mm'))" } } } }
2. 使用新字段查询
{ "query": { "term": { "timestamp_hhmm": "11:05" } } }
内容的提问来源于stack exchange,提问作者Dun King
相关产品推荐
相关产品推荐

