最近在查询ES数据时使用range查询某个时间范围时,查询结果有问题,这里做一下分析总结
问题:
例如es存有数据:
{"_source":{"timestamp": "2019-05-09T18:25:01.082327+0800"}},
{"_source":{"timestamp": "2019-05-09T18:25:01.200825+0800"}}
使用es语句为
{"query":
{"bool":
{"must":
[{"range": {"timestamp": {"from": "2019-05-09T18:25:01.000"}}}
]
}
}
}
结果为:
{
"took": 26,
"timed_out": false,
"_shards": {
"total": 52,
"successful": 52,
"failed": 0
},
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
}
但是如果使用如下查询语句:
{"query":
{"bool":
{"must":
[{"range": {"timestamp": {"from": "2019-05-09T18:25:01.000+0800"}}}
]
}
}
}
结果:
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 52,
"successful": 52,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 3.751368,
"hits": [
{"_source":{"timestamp": "2019-05-09T18:25:01.082327+0800"}},
{"_source":{"timestamp": "2019-05-09T18:25:01.200825+0800"}}
]
分析
这跟ES存储时间格式的形式有关,ES默认的存储时间格式是UTC时间,但是在我的ES中存储的timestamp是UTC+8时间,所以看到的时间是2019-05-09T18:25:01.082327+0800和2019-05-09T18:25:01.200825+0800。
第一次查询时:
{"range": {"timestamp": {"from": "2019-05-09T18:25:01.000"}}}
查询的是默认的UTC时间,即是2019-05-09T18:25:01.000+0000,转化为UTC+8是:2019-05-10T04:25:01.000+0800,所以查询不到任何数据
第二次查询:
{"range": {"timestamp": {"from": "2019-05-09T18:25:01.000+0800"}}}
查询的就是UTC+8时间,所以可查到数据。
还可使用另一种查询就是把ES数据中的UTC+8的时间转化为UTC时间,即把"2019-05-09T18:25:01.082327+0800",转化成 “2019-05-09T10:25:01.082327+0000”,使用这个UTC时间进行查询,查询语句中就不需要带时区,即:
{"query":
{"bool":
{"must":
[{"range": {"timestamp": {"from": "2019-05-09T10:25:01.000"}}}
]
}
}
}
同样可以得到数据:
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 52,
"successful": 52,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 3.751368,
"hits": [
{"_source":{"timestamp": "2019-05-09T18:25:01.082327+0800"}},
{"_source":{"timestamp": "2019-05-09T18:25:01.200825+0800"}}
]