solr8学习进阶(三)定时增量导入MySql数据

本文基于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的定时增量更新配置完成


上一篇:solr8学习进阶(二)整合springboot实现空间资源搜索

发布了96 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_26356861/article/details/102972867