场景描述:
上一篇分面查询文章中,我们提到了时间区间分面,但是在使用的过程中,遇到了很坑的事情,那就是时区。
如果忽视时区,直接设置时间,时间分面查询的结果。很自然的你会设置起始时间都为该月1号00:00:00,但是因为时区的问题,在Solrj处理之后发送给服务器查询时,你可以通过debug看到他的查询条件处理成减了8小时。也就变成了上个月最后一天的16:00:00,如果是31天的月还好,只要到2月就会很复杂。如果是闰年的2月,更会让你头大,导致后面的所有月份分割都会受到影响,就比如3月会因为闰年2月的28号的影响导致分面结果在3月28号就切割,那问题来了,3月29号就算在了下一个区间里,这显然是错误的。
然而网上大部分的文章遇到该问题并没有人注意到,而只是告诉你们有这个东西,那有什么用,错误的东西拿过来用有意义吗?下面是设置错误的示例,也就是大部分的网友发的样式:
这种结果是错误,一般是没有意义的!
"facet_counts":{
"facet_queries":{},
"facet_fields":{},
"facet_dates":{
"birthday":{
"2013-12-31T09:15:00Z":0,
"2014-01-31T09:15:00Z":0,
"2014-02-28T09:15:00Z":0,
"2014-03-28T09:15:00Z":0,
"2014-04-28T09:15:00Z":0,
"2014-05-28T09:15:00Z":0,
"2014-06-28T09:15:00Z":0,
"2014-07-28T09:15:00Z":0,
"2014-08-28T09:15:00Z":0,
"2014-09-28T09:15:00Z":1,
"2014-10-28T09:15:00Z":5,
"2014-11-28T09:15:00Z":3,
"gap":"+1MONTH",
"start":"2013-12-31T09:15:00Z",
"end":"2014-12-28T09:15:00Z"}},
"facet_ranges":{}}}
这样才是正确的结果:
<lst name="facet_ranges">
<lst name="CREATE_TIME">
<lst name="counts">
<int name="2017-02-01T00:00:00Z">4</int>
<int name="2017-03-01T00:00:00Z">6</int>
<int name="2017-04-01T00:00:00Z">3</int>
<int name="2017-05-01T00:00:00Z">4</int>
<int name="2017-06-01T00:00:00Z">2</int>
<int name="2017-07-01T00:00:00Z">3</int>
<int name="2017-08-01T00:00:00Z">11</int>
<int name="2017-09-01T00:00:00Z">2</int>
</lst>
<str name="gap">+1MONTH</str>
<date name="start">2010-01-01T00:00:00Z</date>
<date name="end">2018-07-01T00:00:00Z</date>
</lst>
</lst>
解决办法:
这是因为时区的问题,我们的时间在处理之后少了8小时,当然也可以去设置配置的时区,也可以去源码中修改时区,我的办法是在给他参数的时候给他加上8小时。