Solr 按日期facet 差8小时问题解决

项目中使用solrj来操作solr,日期solr会自动转换:

1.solrj在提交到solr时,时间会因为时区问题减少八小时

2.solr接收到时间后,存为底层lucene索引时时间类型为long型,是正确的时区时间,但是使用solr web界面查询会看到时间会少八小时

3.在使用solrj查询时,solr返回给solrj的为lucene索引,是long型,solrj直接执行new Date传入该long型获得了正确的时间。

由于solr存储的时间类型少了八小时,而进行日期facet的时候根据的正是使用solr,所以导致日期区间内数据量不正确,特别是以日为区间时。

我的解决办法为将solr的存储日期也改为当前时间,不让它有八小时时差,facet时日期就不会出错。

所以需要修改solrj查询和入库时对日期的处理。

修改solrj包org.apache.solr.common.util下两个类:

入库修改DateUtil类里面181行:


      //2007-04-26T08:05:04Z
      SimpleDateFormat tmp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT);
      //设置为上海时间,时间加了8小时
      tmp.setTimeZone(TimeZone.getTimeZone("CTT"));
      proto = tmp;




这里去掉了
tmp.setTimeZone(UTC);

增加了:

tmp.setTimeZone(TimeZone.getTimeZone("CTT"));


因为设置时区后使用format会少八小时。

修改查询JavaBinCodec 类199行:

 case DATE:
                Long timeLong = dis.readLong();
                //cut 8 hours
                timeLong = timeLong - 8 * 60 * 60 * 1000;
                return new Date(timeLong);



这里将日期减去了8小时。

然后编译这两个类替换掉solrj里相应包目录下的class文件,放入项目中,然后入库和查询,发现时间不会再差八小时。当然,按日期facet时结果也不会再有错

修改后的solrj只需要放到项目中,solr源码里面的依赖solrj不需要替换。







你可能感兴趣的:(Solr,8小时,时区)