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  點擊跳轉

 

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