Solr时间类型相差8个小时的解决办法

0、背景

在开发过程中,发现type为date类型时,导入Solr中字段会与实际时间相差8个小时。

原因是:Solr服务中默认使用的是UTC时间,而中国本地时间为东八时区,即比UTC标准时间多8小时。

1、尝试解决(面向搜索引擎)

以下方法我个人是试过了,但都没有效果(也有可能是我没有用正确的方式打开)

  • 修改solr.cmd,找到set SOLR_TIMEZONE=UTC关键字,修改为以下内容:
set SOLR_TIMEZONE=UTC+8
  • 修改solr.in.sh,关键字SOLR_TIMEZONE="UTC",修改以下内容:
SOLR_TIMEZONE="UTC+8"
  • 修改manage-schema,加上default="NOW+8HOUR"
<field name="NewsDate" type="date" indexed="true" stored="true" default="NOW+8HOUR" docValues="true"  />

2、正确打开方式

修改org\apache\solr\common\util\JavaBinCodec.class文件,来解决时间问题:

  • 下载Ant

    https://ant.apache.org/bindownload.cgi

  • 安装Ant

    1. 直接解压
    2. 配置环境变量
      • 打开【环境变量】=>【系统变量】=>【新建】,添加变量名:ANT_HOME,值:F:\dev\soft\apache-ant-1.9.16
      • 打开【环境变量】–【系统变量】–【Path】,添加到Path变量中,值:%ANT_HOME%\bin
  • 下载对应版本solr源码,根据自己的需要下载对应版本,这里下载的是8.9.0

    https://github.com/apache/lucene-solr/tree/releases/lucene-solr/8.9.0

    进入项目根目录中,用Ant编译项目为idea项目,这里我采用的命令的方式

    • 在项目根目录进入cmd依次执行以下命令:
    ant ivy-bootstrap
    

    4yTZtS.png

    ant idea
    

    4yTVk8.png

  • 使用idea打开项目,目录结构如图

    4yTnpQ.png

  • 找到JavaBinCodec.java,修改以下代码

    第一处,在readObject()方法:

    switch (tagByte) {
        case NULL:
            return null;
        case DATE:
        	// 这里
            return new Date(dis.readLong() - 28800000l);
        case INT:
            return dis.readInt();
    
    

    第二处,writePrimitive()方法:

    else if (val instanceof Date) {
                daos.writeByte(DATE);
                // 这里
                daos.writeLong((((Date) val).getTime() / 1000) * 1000 + 28800000l);
                return true;
            } else if (val instanceof Boolean) {
    
  • 找到org\apache\solr\client\solrj\StartSolrJetty.java,这个类为测试启动类,修改注释0和1处的代码:

    public class StartSolrJetty
    {
      public static void main( String[] args )
      {
        //0、第一个修改的地方,根据自己实际目录修改,这里lucene-solr-releases-lucene-solr-8.9.0为当前idea打开的solr项目,如仍不清楚,请看下图  
        System.setProperty("solr.solr.home", "F:\\dev\\code\\javaCode\\idea_workspace\\lucene-solr-releases-lucene-solr-8.9.0\\solr\\server\\solr");
    
        Server server = new Server();
        ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory());
        // Set some timeout options to make debugging easier.
        connector.setIdleTimeout(1000 * 60 * 60);
        connector.setPort(8983);
        server.setConnectors(new Connector[] { connector });
    
        WebAppContext bb = new WebAppContext();
        bb.setServer(server);
        bb.setContextPath("/solr");
        //1、第二个修改的地方  
        bb.setWar("solr/webapp/web");
    
    //    // START JMX SERVER
    //    if( true ) {
    //      MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    //      MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);
    //      server.getContainer().addEventListener(mBeanContainer);
    //      mBeanContainer.start();
    //    }
    
        server.setHandler(bb);
    
        try {
          System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY KEY TO STOP");
          server.start();
          while (System.in.available() == 0) {
            Thread.sleep(5000);
          }
          server.stop();
          server.join();
        }
        catch (Exception e) {
          e.printStackTrace();
          System.exit(100);
        }
      }
    }
    

    注释0所需要修改的路径为该目录的路径

  • 执行main()

    4yTMXn.png

    浏览器访问http://localhost:8983/solr,出现以下页面表示成功启动:

    4yTK6s.png

  • 找到项目中solr-solrj/classes下编译好的JavaBinCodec.class替换你所使用solrj包中的class文件即可。

参考文章:彻底解决Solr日期类型的时区问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值