1. 问题描述
- ES的默认时区是0区,而我们是在东八区。进行过滤时,我们采用了now函数。结果发现过滤结果不对,当天下午十点半的一条数据没有查出来。然后尝试在less than or equal的参数加了1d或者加了8h。过滤结果就是对的了。
2. 问题分析
- 我们在东八区,参数加了8h之后查询结果正确,基本可以确定是时区的配置问题。
2.1 在参数里面配置时区
- 开始先尝试加上时区的配置,结果没有起效。
2.2 过滤字段为文本时的分词对时区造成了影响
- 看到一篇博客:ElasticSearch6.X时间范围查询无效bug
- 博客里面说到是过滤字段的分词原因。但是这里说的是ES6.x。我们用的版本是7.x,并且这个字段的类型是date。
- 博客里面说到是过滤字段的分词原因。但是这里说的是ES6.x。我们用的版本是7.x,并且这个字段的类型是date。
2.3 now函数的问题
- 然后我们去看了ES的官方文档,里面提到,now的值不受time-zone影响
翻译一下就是
- 确定是now这个方法的问题
3. 问题解决思路
- 既然使用这个now会有问题,那我们就不使用他了。改为使用时间戳的形式,过滤结果也是对的。至于时区的问题,我们可以先在程序计算好时区,再把参数传进来。
4. 备注
- 一开始本来想要粗暴一点,直接在参数加上8h。但是大佬告诉我,加8h的话,在汇聚成直方图的时候,直方图的还是不对的。加1d倒是可以暂时显示正确的效果,但是很明显不要这么弄,这样的参数会把多的数据查进来。