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實現空間資源搜索

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