本文基于2019.10.25的solr最新版本solr-8.2.0
上一篇讲到了solr整合springboot实现资源搜索,但是还有缺陷,数据第一次手动导入之后,不能自动同步MySql数据库的数据,这一篇来讲一讲如何用solr实现定时增量导入MySql数据
一、启动solr的数据导入监听器
1、在D:\solr-8.2.0\server\solr-webapp\webapp\WEB-INF文件夹下,编辑web.xml文件,增加配置:
<!-- solr数据导入监听器 -->
<listener>
<listener-class>
org.apache.solr.handler.dataimport.scheduler.ApplicationListener
</listener-class>
</listener>
2、把导入数据所依赖的包放到D:\solr-8.2.0\server\solr-webapp\webapp\WEB-INF\lib文件加下
注意,solr官方的apache-solr-dataimportscheduler.jar包只能试用与solr6以前的版本,我们需要把apache-solr-dataimportscheduler.jar包下载下来,然后手动修改再二次打包。最终我这边打包改名成apache-solr-dataimportscheduler-xrw.jar,下载路径:百度网盘链接:https://pan.baidu.com/s/1RVjjtBKeL4iR15vzv1t-ig 提取码:rl91
二、配置自动更新
在D:\solr-8.2.0\server\solr路径下,新建conf文件夹,然后新建文件dataimport.properties,写入以下配置:
#################################################
# #
# dataimport scheduler properties #
# #
#################################################
# to sync or not to sync 是否同步功能
# 1 - active; anything else - inactive 1 - 开启; 否则不开启
syncEnabled=1
# which cores to schedule
# in a multi-core environment you can decide which cores you want syncronized
# leave empty or comment it out if using single-core deployment
#syncCores=game,resource 需要同步的solr core
syncCores=appDbDisasterShelter,appDbMaterialAddress,appDbProtectionobject,appDbRisk,appDbTeam
# solr server name or IP address solr server 名称或IP地址
# [defaults to localhost if empty] 默认为localhost
server=localhost
# solr server port solr server端口
# [defaults to 80 if empty] 默认为80
port=8983
# 调度区间
# 默认为30分钟
interval=1
# application name/context
# [defaults to current ServletContextListener's context (app) name]
webapp=solr
# URL params [mandatory]
# remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true
# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
# 重做索引的时间间隔,单位分钟,默认7200,即5天;
# 为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=1
# 重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=03:10:00
三、编写定时自动更新的sql语句
在你的core的\conf文件加下,例如D:\solr-8.2.0\server\solr\appDbDisasterShelter\conf,编辑data-config.xml文件,添加deltaQuery、deletedPkQuery、deltaImportQuery等语句。
其中,deltaQuery用于查询比上一次数据更新操作的时间更晚的数据的id,deltaImportQuery则根据deltaQuery取到的id去MySql数据库查询数据用以更新solr中的数据。
这里,我们在数据库中用sys_i_status是否为0来表示数据的逻辑删除,业务系统每次操作数据库时更新sys_dt_last_update字段,让solr知道哪些数据更新过了。
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- 数据库信息 -->
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.160:3306/emplus_eos"
user="emt" password="chinaemt"/>
<document>
<!-- document实体 -->
<entity name="app_db_disaster_shelter" pk="id"
query="SELECT `i_id` as id,
`vc_name` as vcName,
`d_longitude` as x,
`d_latitude` as y,
`vc_address` as vcAddress,
`vc_remark` as vcRemark,
concat( d_longitude,' ',d_latitude) as GEO
FROM app_db_disaster_shelter where sys_i_status=0"
deltaQuery="SELECT `i_id` AS `id` FROM `app_db_disaster_shelter` where sys_i_status=0 and sys_dt_last_update>'${dataimporter.last_index_time}'"
deletedPkQuery="SELECT `i_id` AS `id` FROM `app_db_disaster_shelter` where sys_i_status!='0'"
deltaImportQuery="SELECT `i_id` as id,
`vc_name` as vcName,
`d_longitude` as x,
`d_latitude` as y,
`vc_address` as vcAddress,
`vc_remark` as vcRemark,
concat( d_longitude,' ',d_latitude) as GEO
from app_db_disaster_shelter where sys_i_status=0 and i_id='${dataimporter.delta.id}'">
<!-- 数据库字段映射solr字段 -->
<field column="i_id" name="id"/>
<field column="vc_name" name="vcName"/>
<!-- <field column="i_area_id" name="iAreaId"/> -->
<!-- <field column="vc_dept" name="vcDept"/> -->
<field column="d_longitude" name="x"/>
<field column="d_latitude" name="y"/>
<field column="vc_address" name="vcAddress"/>
<!-- <field column="vc_traffic" name="vcTraffic"/> -->
<!-- <field column="vc_duty_tel" name="vcDutyTel"/> -->
<!-- <field column="vc_fax" name="vcFax"/> -->
<!-- <field column="vc_dept_address" name="vcDeptAddress"/> -->
<!-- <field column="vc_group" name="vcGroup"/> -->
<!-- <field column="dt_update_time" name="dtUpdateTime"/> -->
<field column="vc_remark" name="vcRemark"/>
<!-- <field column="dt_use_time" name="dtUseTime"/> -->
<!-- <field column="vc_basic_situation" name="vcBasicSituation"/> -->
<!-- <field column="d_area" name="dArea"/> -->
<!-- <field column="i_dept_id" name="iDeptId"/> -->
<!-- <field column="i_operate_id" name="iOperateId"/> -->
<!-- <field column="i_status" name="iStatus"/> -->
<!-- <field column="i_extend1" name="iExtend1"/> -->
<!-- <field column="i_extend2" name="iExtend2"/> -->
<!-- <field column="vc_extend1" name="vcExtend1"/> -->
<!-- <field column="vc_extend2" name="vcExtend2"/> -->
<!-- <field column="vc_extend3" name="vcExtend3"/> -->
<!-- <field column="sys_i_status" name="sysIStatus"/> -->
<!-- <field column="sys_dt_create" name="sysDtCreate"/> -->
<!-- <field column="sys_i_create_user" name="sysICreateUser"/> -->
<!-- <field column="sys_dt_last_update" name="sysDtLastUpdate"/> -->
<!-- <field column="sys_i_last_update_user" name="sysILastUpdateUser"/> -->
<!-- <field column="sys_vc_remark" name="sysVcRemark"/> -->
<!-- <field column="i_datasync_unit_id" name="iDatasyncUnitId"/> -->
<!-- <field column="dt_datasync_time" name="dtDatasyncTime"/> -->
<!-- <field column="i_datasync_id" name="iDatasyncId"/> -->
<!-- <field column="origin" name="origin"/> -->
</entity>
</document>
</dataConfig>
配置完后,不要忘记重启solr进行测试哦。至此,solr的定时增量更新配置完成