Solr 17 - Solr的时间为什么比本地少8小时 (附修改方法)
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) 下拉右侧的滚动条至底部, 可以看到时区属性, 如下图所示:

说明: 默认的时区为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菜单, 即可发现时区已经修改成功.
参考资料
版权声明
作者: 马瘦风
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
Solr 17 - Solr的时间为什么比本地少8小时 (附修改方法)的更多相关文章
- logstash 默认时间少8小时的修改办法
logstash 的配置文件添加 filter { ruby { code => "event.set('timestamp', event.get('@timestamp').tim ...
- Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)
目录 1 加入数据导入处理器的jar包 2 加入数据库驱动包 3 配置solrconfig.xml文件 3.1 配置lib标签 - 加入驱动jar包 3.2 配置requestHandler标签 - ...
- Solr 06 - Solr中配置使用IK分词器 (配置schema.xml)
目录 1 配置中文分词器 1.1 准备IK中文分词器 1.2 配置schema.xml文件 1.3 重启Tomcat并测试 2 配置业务域 2.1 准备商品数据 2.2 配置商品业务域 2.3 配置s ...
- Solr 05 - Solr Web管理界面的基本使用
目录 1 Dashboard - 仪表盘 2 Logging - 日志信息 3 CoreAdmin - Solr核心 4 Java Properties - Java参数 5 Thread Dump ...
- Solr 03 - Solr的模式设计与优化 - 最详细的schema.xml模式文件解读
目录 1 关于schema.xml文件 2 解读schema.xml文件 2.1 field - 配置域 2.2 fieldType - 配置域类型 2.3 copyField - 配置复制域 2.4 ...
- Solr记录-solr介绍及配置
Solr是一个开源搜索平台,用于构建搜索应用程序. 它建立在Lucene(全文搜索引擎)之上. Solr是企业级的,快速的和高度可扩展的. 使用Solr构建的应用程序非常复杂,可提供高性能. 为了在C ...
- Solr 11 - Solr集群模式的部署(基于Solr 4.10.4搭建SolrCloud)
目录 1 SolrCloud结构说明 2 环境的安装 2.1 环境说明 2.2 部署并启动ZooKeeper集群 2.3 部署Solr单机服务 2.4 添加Solr的索引库 3 部署Solr集群服务( ...
- Solr记录-solr内核与索引
Solr核心(内核) Solr核心(Core)是Lucene索引的运行实例,包含使用它所需的所有Solr配置文件.我们需要创建一个Solr Core来执行索引和分析等操作. Solr应用程序可以包含一 ...
- Solr记录-solr基础内容
Solr架构(体系结构) 在本章中,我们将讨论Apache Solr的架构. 下图显示了Apache Solr的体系结构的框图. Solr架构 - 构件块以下是Apache Solr的主要构建块(组件 ...
随机推荐
- 关于react router 4 的小实践
详细代码栗子:https://github.com/wayaha/react-dom-CY clone然后 npm install npm start 分割线 1.这个项目使用create-react ...
- 【python进阶】深入理解系统进程1
前言 之前程序执⾏都是⼀条腿⾛路,甚⾄是⽤⼀杆枪来打天下. 通过系统编程的学习,会让⼤家有“多条腿”⼀起⾛路,就好⽐有了⼀把机关枪. 此篇为深入理解进程第一篇,下面开始今天的说明~~~ 进程 多任务的 ...
- python笔记:#014#综合应用
综合应用 -- 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...
- C++ 文件流的详解
部分内容转载:http://blog.csdn.net/kingstar158/article/details/6859379 感谢追求执着,原本想自己写,却发现了这么明白的文章. C++文件流操作是 ...
- Scrapy爬虫框架补充内容三(代理及其基本原理介绍)
前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...
- MongoDB学习--安装与管理
一.简介 MongoDB是一种强大.灵活,且易于扩展的通用型数据库.他能扩展出非常多的功能.如二级索引(secondary index).范围查询(range query).排序.聚合(aggrega ...
- 关于java多线程关键字volatile的理解
volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...
- Ubuntu安装和卸载.bundle格式的VMware
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=628 前言: 本文中用于演示的.bundle文件是VMware-Workstation-Full-14.1.1-75 ...
- 关于ArrayList的5道面试题
我以面试官的身份参加过很多Java的面试,以下是五个比较有技巧的问题,我发现有些初级到中级的Java研发人员在这些问题上没有完全弄明白,似懂非懂.所以我写了一篇相关的文章,帮助初级Java研发人员弄清 ...
- Python将html转化为pdf
前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...