文档章节

Solr 17 - Solr的时间为什么比本地少8小时 (附修改方法)

o
 osc_w9s1w4o0
发布于 2019/03/28 23:30
字数 1248
阅读 12
收藏 0

精选30+云产品,助力企业轻松上云!>>>

[TOC]

1 为什么少8小时

(1) 原因:

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

(2) 示例:

① 中国内地服务器时间为2018-10-10 20:00:00, 系统将当前时间添加到Solr索引中时, Solr底层发现此时间的格式为UTC + 8, 它将对该时间减去8小时处理, 然后建立相关索引. ② 在查询上述添加的时间时, Solr直接将索引信息返回, 变为: 2018-10-10T12:00:00Z ==> 时间少了8小时.

(3) 不同的时间格式:

  • UT, Universal Time, 世界时: 是基于天体观察计算出来的时间, 是指英国格林尼治所在地的标准时间. 由于天体运行的一些不确定性(比如地球的自转并不是匀速的, 而且正在缓慢减速), 所以UT时间并不均匀.
  • UTC, Universal Time Coordinate: 协调世界时, 是基于原子时钟的时间, 是均匀的时间. 为了与UT时间保持较小的差距, UTC体系中增加了闰秒, 即某些年份的最后1分钟有61秒.
  • GMT, Greenwish Mean Time, 格林尼治标准时间: 是人们对UTC的另一种称法. 本初子午线被定义为英国伦敦郊区的皇家格林尼治天文台所在的经线, 此前人们将此地的时间当做标准时间, 但后来发现基于地球的时间并不准确, 在提出UTC概念后, 人们仍然自然地使用GMT来表达时间, 而此时的GMT == UTC.

2 如何查看Solr的时区

通过Solr Admin (Solr Web界面)查看:

(1) 进入Solr Admin, 点击左侧的Java Properties菜单, 进入Java属性设置页面;

(2) 下拉右侧的滚动条至底部, 可以看到时区属性, 如下图所示:

<img src="https://img2018.cnblogs.com/blog/1438655/201903/1438655-20190328233102998-1808924987.jpg" width="80%" alt="Solr用户本地系统的时区">

说明: 默认的时区为UTC, 上图是已经修改后的东八区(GMT+8).

3 修改Solr的时区

3.1 Solr从数据库中同步数据的原理

① 我们知道, Solr中的数据源有很多是类似于MySQL的关系型数据库, 也就是Solr通过其DIH(Data Import Handler)处理;

② Solr在更新数据时, 会记录这些数据的最后更新时间戳, 保存在Collection/conf目录下, 与db-data-config.xml文件同级, 文件内容类似于:

#Thu Jan 24 15:03:58 CST 2019
_delta.last_index_time=2019-01-08T05\:48\:21Z
_full.last_index_time=2019-01-24T07\:03\:37Z
last_index_time=2019-01-24T07\:03\:37Z

③ 在向MySQL、MongoDB等数据库中写入数据时, 添加类似于CreateTime的字段, 用于记录数据的入库时间戳;

④ 通过比较Solr和数据库的更新时间戳, 完成对数据是否需要增量同步的判断, 从而实现数据更新. 对比方式类似于:

<!-- MySQL中增量同步数据的配置类似于 -->
<entity name="BookShop_delta" 
     query="SELECT ID, Name, CreateTime FROM BookShop 
            WHERE CreateTime >= '${dataimporter.last_index_time}'" pk="ID">
<field column="ID" name="ID" />
<!-- ... -->
</entity>

<!-- MongoDB中增量导入数据的配置类似于 -->
<entity name="_delta" processor="MongoEntityProcessor"
		    query="{'CreateTime': {'$gte': ISODate('${dih.last_index_time}')}}"
     collection="BookShop" project="{_id:0, ID:1, Name:1, CreateTime:1}"
     datasource="ShopMongo" transformer="MongoMapperTransformer" >	
<field column="ID" name="ID" />
<!-- ... -->
</entity>

3.2 为什么要修改时区

由上述分析可知, 修改时区的原因主要是: 方便与数据库中数据的自动同步.

一般情况下, MySQL等数据库服务器的时区都与实际时区一致, 也就是东八区(GMT+8), 而Solr默认的时区是UTC, 与东八区(GMT+8)相差8个小时.

这种差距导致我们无法直接根据Solr的更新时间戳和MySQL等数据库的更新时间戳进行比较, 从而使得数据的导入出现问题.

==> 所以需要修改Solr的时区.

3.3 如何修改时区

Solr的时区属性所在配置文件, 在${SOLR_HOME}/bin下:

solr.in.sh是Linux系统下的启动脚本, solr.in.cmd是Windows系统下的启动脚本.

以Linux系统为例, 编辑solr.in.sh文件:

vim /data/solr-cloud/solr-4.10.4/bin/solr.in.sh

找到SOLR_TIMEZONE的相关配置: SOLR_TIMEZONE="UTC", 可以看出默认的时区是UTC, 而且被注释掉了. 可将其修改为:

SOLR_TIMEZONE="UTC+8"

保存退出后, 重启Solr服务, 然后再次进入Solr Admin管理界面, 查看Java Properties菜单, 即可发现时区已经修改成功.

参考资料

UT,UTC,GMT时间区别

Linux+Solr+Zookeeper-04:修改Solr的时区TIMEZONE

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Solr 按日期facet 差8小时问题解决

项目中使用solrj来操作solr,日期solr会自动转换: 1.solrj在提交到solr时,时间会因为时区问题减少八小时 2.solr接收到时间后,存为底层lucene索引时时间类型为long型,是正确的时区时间,但...

zachary124
2014/06/24
726
4
solr 常见的问题整理 -费元星

本文是我在开发过程中遇到的一些问题的整理,有些摘自网上别人的方法。 1. org.apache.solr.client.solrj.SolrServerException: Timeout occured while waiting response from server at: ht...

未来星狒狒
2016/02/29
0
0
solr date 时区 8小时时差问题

初学solr在schema 里面配置并使用sorl的date或者tdate类型,具体类型与使用如下: <field name="tdate_field"type="tdate"indexed="true"stored="true"/><field name="date_field"type="date......

java梦想家01
2015/06/03
349
0
CDH5 Solr性能调优

Solr性能调优 Solr性能调优是个复杂的过程,本文旨在描述Solr在使用过程中对性能优化的注意事项。 在安装完成之后的调优 有些配置最好在安装之后立马修改,这样可以避免修改配置之后需要重复...

小叮当_加V
2016/04/19
585
0
JavaEE进阶——全文检索之Solr7.4服务器

I. Solr Solr简介 Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对Lucene的性能进行了优化。...

osc_dl1ft2rd
2018/09/03
26
0

没有更多内容

加载失败,请刷新页面

加载更多

Buffer的创建及使用源码分析——ByteBuffer为例

目录 Buffer概述 Buffer的创建 Buffer的使用 总结 参考资料 Buffer概述 注:全文以ByteBuffer类为例说明 在Java中提供了7种类型的Buffer,每一种类型的Buffer根据分配内存的方式不同又可以分为...

osc_zoa046qb
25分钟前
21
0
《 ZooKeeper : Wait-free coordination for Internet-scale systems 》论文研读

Zookeeper 研读 说明:本文为论文 《 ZooKeeper : Wait-free coordination for Internet-scale systems 》 的个人理解,难免有理解不到位之处,欢迎交流与指正 。 论文地址:Zookeeper Paper...

osc_4isxawz4
26分钟前
19
0
利用__new__实现单例模式

26 利用__new__实现单例模式 python当中有很多方法都可以实现单例模式, 但利用__new__无疑是最推荐的方式. 代码如下: class Demo:is_instance = Nonedef __new__(cls, *args, **kwargs...

_Change_
28分钟前
11
0
如何白嫖微软Azure12个月及避坑指南

Azure是微软提供的一个云服务平台。是全球除了AWS外最大的云服务提供商。Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务。这里的Azure是Azure国际不是Azure中...

osc_dwuu5jqk
28分钟前
21
0
Mybatis源码初探——优雅精良的骨架

@ 目录 前言 精良的Mybatis骨架 宏观设计 基础支撑 日志 日志的加载 日志的使用 数据源 数据源的创建 池化技术原理 数据结构 获取连接 回收连接 缓存 缓存的实现 CacheKey 反射 总结 前言 My...

osc_r9wwwi0j
29分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部