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
-
安装Ant
- 直接解压
- 配置环境变量
- 打开【环境变量】=>【系统变量】=>【新建】,添加变量名: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
ant idea
-
使用idea打开项目,目录结构如图
-
找到
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); } } }
-
执行main()
浏览器访问http://localhost:8983/solr,出现以下页面表示成功启动:
-
找到项目中
solr-solrj/classes下
编译好的JavaBinCodec.class
替换你所使用solrj包中的class文件即可。
参考文章:彻底解决Solr日期类型的时区问题