solr数据同步-自动、手动、增量、全量同步

我的solr安装目录:/home/solr/

上一篇记录了sorld安装配置:https://blog.csdn.net/Muscleheng/article/details/106126886

solr数据同步:把数据库数据同步到solr,这里使用的数据库是postgresql,如果其他的数据库,配置步骤也一样,只是驱动包不一样而已

1. 上传驱动jar包

把postgresql-42.2.5.jar包放到 /home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF/lib 目录下面

把 /home/solr/solr-8.5.1/dist目录下的solr-dataimporthandler-8.5.1.jar和solr-dataimporthandler-extras-8.5.1.jar包复制到/home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF/lib 目录下面

2. 创建data-config.xml文件

       2.1 存放到目录 /home/solr/solr-8.5.1/server/solr/new_core/conf/ 下面

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- 数据源配置 -->
    <dataSource name="source1" type="JdbcDataSource"
              driver="org.postgresql.Driver"
              url="jdbc:postgresql://10.2.230.6:5433/e_commerce"
              user="e_commerce"
              password="ggcjdss49120" />
			  
	<!-- sql 编写 -->
	<!-- 
	entity属性:
	name:实体名称
	dataSource:数据源名称
	pk:实体主键,增量导入时使用
	query:全量同步SQL
	deltaQuery:增量导入时查询需要导入的数据的主键
	deltaImportQuery:增量导入查询SQL,根据deltaQuery查询出的id查询数据
	deletedPkQuery:增量导入时会删除solr中根据该SQL查询出来的id对应的数据
	增量同步原理:首先保障数据库表里面有个记录时间的字段,每次添加或者修改后记录时间;solr每次同步数后会记录同步时间:last_index_time,
	然后SQL语句里面就可以添加查询条件 :last_modify_date >= '${dih.last_index_time}',表里面更新时间大于solr的更新时间,说明数据被更新了或者是新增的数据;
	last_modify_date:这个是表里面记录更新、插入时间的字段;
	-->
    <document>
        <entity name="product" dataSource="source1" pk="product_id" 
		query="SELECT
				pp.product_id,
				pp.product_name,
				pp.last_modify_date
			FROM
				p_product pp
			WHERE
				pp.valid_flag = '1'"
		deltaImportQuery="SELECT
				pp.product_id,
				pp.product_name,
				pp.last_modify_date
			FROM
				p_product pp
			WHERE
				pp.valid_flag = '1'
			AND pp.product_id = '${dih.delta.product_id}'"
		deltaQuery="SELECT
				pp.product_id
			FROM
				p_product pp
			WHERE
				pp.valid_flag = '1'
			AND pp.last_modify_date >= '${dih.last_index_time}'"			
		
		deletedPkQuery="select product_id from p_product where valid_flag='0'">
		
		    <!-- 字段对应关系 -->
            <field column='product_id' name='productId' />
            <field column='product_name' name='productName' />
			<field column='last_modify_date' name='last_modify_date' dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
        </entity>
    </document>
</dataConfig>

配置文件中 last_index_time 这个时间是solr同步数据的时间,可以从这里查看:

     2.2 同级目录下 /home/solr/solr-8.5.1/server/solr/new_core/conf

      managed-schema 文件配置导入数据字段的对应关系

<!-- 定义文档字段
   name:字段名称;type:分词类型;indexed:是否进行索引;stored:是否进行储存,需要进行显示一般需要储存;
   required:字段是否可为空;multiValued:是否有多个值
  -->
  <field name="productId" type="strings" indexed="true" stored="true" required="false" multiValued="false" />
  <field name="productName" type="text_ik" indexed="true" stored="true" required="false" multiValued="false" />
  <field name="last_modify_date" type="strings"/>

managed-schema文件中默认了数据的主键,如下:

<uniqueKey>id</uniqueKey>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>

也就是说,每次导入数据都必须要有字段id否则报错;在页面导入的时候如果没有id字段,solr回自动加上该字段,并且生成不重复id;

由于数据库表里面我们的主键是商品id(productId)所以这里修改为:

  <!-- 自定义唯一主键 -->
  <uniqueKey>productId</uniqueKey> 
 <field name="productId" type="strings" indexed="true" stored="true" required="false" multiValued="false" />

把默认配置注释掉。

3. 配置完成重启服务界面操作导入数据

增量更新,先往数据库添加一条数据,时间字段时间需要大于solr同步记录时间

 

4. Solr时区问题:

如果solr所在服务器的时间是正确的,会发现solr的时间是不对的,比正常时间少8小时,因为solr默认使用的是UTC时间,中国是东八区时区,比UTC国际时区多8小时

所以需要修改一下solr的时间配置

在目录/home/solr/solr-8.5.1/bin/下的solr.in.sh文件:

# By default the start script uses UTC; override the timezone if needed
# SOLR_TIMEZONE="UTC"

# solr默认使用的是UTC时间,中国是东八区时区,比UTC国际时区多8小时,所以这里加8
SOLR_TIMEZONE="UTC+8"

配置完不生效,再修改同级目录下的solr文件

# solr默认使用的是UTC时间,中国是东八区时区,比UTC国际时区多8小时,所以这里加8
if [ -z "$SOLR_TIMEZONE" ]; then
  # SOLR_TIMEZONE='UTC'
  SOLR_TIMEZONE='UTC+8'
fi

重启solr,查看,GMT+08:00说明修改成功

5. 定时自动同步数据

    5.1 下载jar包:solr-dataimportscheduler-1.2.jar 点击下载

网上的jar包功能都不全,大多数只支持增量同步,或者不支持登录验证:如果solr设置了登录验证,定时同步就访问不了了,我修改了源码,点击上面的连接可以下载,包含了jar和源码

    5.2. 把jar包放到目录 /home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF/lib下面

    5.3. 找到目录/home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF 小的web.xml ,在里面配置监听器,添加如下代码:

<!-- 定时更新数据 -->
	<listener> 
	  <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
	</listener>

    5.4. 在目录/home/solr/solr-8.5.1/server/solr/conf 下添加配置文件 dataimport.properties

注:每个core的conf目录下也有一个名字叫做dataimport.properties

的配置文件, 这个配置文件不是core下面的,不能混淆了。

文件内容:

#################################################
#                                               #
#     定时任务执行增量更新			            #
#                                               #
#################################################

# server BASIC authorization by userName and password
# format:userName:password
# if no server BASIC authorization,please set: 
#  authorizationMsg=
#authorizationMsg=userName:password

#  to sync or not to sync
#  同步执行更新
syncEnabled=1

#  
#  solr中对应得core名,可写多个,多个时用逗号“,”分隔
#  
syncCores=new_core

# 没有密码验证就不用配置
# solr服务添加了登录验证,所以这里也要配置用户名和密码
# 用户名:密码
user_pwd=solr:solr@123456

#  solr server name or IP address
#  [defaults to localhost if empty]
#   solr服务的id,定时任务服务是集成在solr服务里面的,所以都在同一台机器,所以localhost即可
# server=localhost


server=localhost

# solr服务的端口号
#  [defaults to 80 if empty]
port=8983

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
#增量更新对应的访问参数,注意/dataimport?地址不同版本sorl了能地址名不同,具体可登录solr管理后台##查看dataimport的具体访问ULR
# clean=false 表示不清空以前的数据,只有全量更新才为true
params=/dataimport?command=delta-import&clean=false&commit=true&optimize=false&wt=json&indent=true&verbose=false&debug=false

#  schedule interval
#  number of minutes between two runs
#  定时任务执行增量更新的间隔,不能为0.5这样的数,默认设置为1分钟
interval=120

########################## 默认没有全量导入功能,可以自己写定时任务调用solr全量更新的地址,地址如下reBuildIndexParams  #####################

#  重做索引的时间间隔,单位分钟,默认7200,即5天; 
#  为空,为0,或者注释掉:表示永不重做索引,即全量更新的时间间隔
reBuildIndexInterval=300

#  重做索引的参数,即全量更新
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true&optimize=true&wt=json&indent=true&verbose=false&debug=false

#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2020-05-15 16:10:00 或者  16:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=08:30:00

重启solr 服务即可,可以通过日志查看执行情况,solr日志路径:/home/solr/solr-8.5.1/server/logs/solr.log

solr登录验证配置步骤:

https://blog.csdn.net/Muscleheng/article/details/106287777  点击跳转

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章