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