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