solr之mysql全量同步與增量同步
一、solr管理員命令
二、案例實戰說明(全量同步與增量同步)
一、solr管理員命令
我們在生產環境時,需要管理員維護solr伺服器的資料資訊,,那麼這裡有3種主要手段:
1.curl方式
curl http://localhost:8080/solr/update --data-binary "<delete><query>title:abc</query></delete>" -H 'Content-type:text/xml; charset=utf-8'
#刪除完後,要提交
curl http://localhost:8080/solr/update --data-binary "<commit/>" -H 'Content-type:text/xml; charset=utf-8'
2、用自帶的 post.jar,在 /usr/local/solr/solr-5.3.2/example/exampledocs 目錄下:
java -Ddata=args -jar post.jar "<delete><id>42</id></delete>"
#怎麼使用 post.jar 檢視幫助
java -jar post.jar -help
3、在solr客戶端,訪問你的索引庫(我認為最方便的方法)
1)documents type 選擇 XML
2)documents 輸入下面語句
<delete><query>*:*</query></delete> <commit/>
二、案例實戰說明
2.1全量同步
我們已經對solr又來一個初步的認知,那麼我們非同步在真實的專案中如何去對solr進行使用呢?
一般來說我們會從資料庫中把相關資訊載入到solr中,然後定時去於後臺數據庫進行同步
solr有2種同步手段:1、增量同步 2、全量同步
舉個例子:
第一步:建立資料庫solr,然後建立一張表solr_test,插入幾條資料即可
第二步:編輯/usr/local/solr/solr-5.3.2/example/example-DIH/solr/solr/conf/solrconfig.xml
新增一下內容
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
第三步在solrconfig.xml 同級的目錄下新增data-config.xml並且加入如下內容
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.19.100:3306/solrtest" user="root" password="123456"/>
<document>
<entity name="solr_test" transformer="DateFormatTransformer" query="SELECT id, subject, content, update_at FROM solr_test WHERE id >= '${dataimporter.request.id}'">
<field column="id" name="id"/>
<field column="subject" name="subject"/>
<field column="content" name="content"/>
<field column="update_at" name="update_at" dateTimeFormat="yyyy-MM-dd HH:mm:ss" />
</entity>
</document>
</dataConfig>
說明:這裡使用了一個${dataimporter.request.id},這個是引數,後面在做資料匯入時,會使用到,以此條件為基準讀資料。
第四步:新增jar包到tomcat目錄中。
將/usr/local/solr/solr-5.3.2/dist目錄下的solr-dataimporthandler-5.3.2.jar、solr-dataimporthandler-extras-5.3.2.jar複製到tomcat的/usr/local/tomcat/apache-tomcat-7.0.29/webapps/solr/WEB-INF/lib資料夾中,當然,也包括mysql的jdbc jar包:mysql-connector-java-5.1.44-bin.jar
cp /usr/local/solr/solr-5.3.2/dist/solr-dataimporthandler-extras-5.3.2.jar /usr/local/tomcat/apache-tomcat-7.0.29/webapps/solr/WEB-INF/lib
cp /usr/local/solr/solr-5.3.2/dist/solr-dataimporthandler-5.3.2.jar /usr/local/tomcat/apache-tomcat-7.0.29/webapps/solr/WEB-INF/lib
第五步:編輯/usr/local/solr/solr-5.3.2/example/example-DIH/solr/solr/conf/schema.xml
配置檔案,去把資料庫裡面有的欄位,新增到schema.xml中,如果有則無需配置。
第六步:進行資料庫訪問授權操作,本地的mysql需要得到授權:
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
使用命令:telnet IP 埠 試著連線資料庫
這樣就表示已經連線上mysql了
第七步:統一linux伺服器時間與windows伺服器時間
由於我這邊的mysql是在windows系統中,solr在虛擬機器內,因此為了同步功能,需要將linux的系統時間與Windows的系統時間保持一致
使用命令:date -s
date -s "2018-11-02 15:58:33"
現在我們開始匯入資料
我們再次查詢資料已經匯入
在/usr/local/solr/solr-5.3.2/example/example-DIH/solr/solr/conf資料夾下有一個dataimport.properties。該檔案記錄了最後一次匯入的時間,這裡的時間用的是linux的時間
所以我們在需要將solr伺服器的時間和mysql伺服器的時間相對應
假如我在資料庫新增了一條資料
PS:
我們這個時候可以不通過管控臺直接使用命令,這樣的方式和通過管控臺點選按鈕的產生的結果是一樣的
http://192.168.46.143:8080/solr/solr/dataimport?command=full-import&clean=
true&commit=true&wt=json&indent=true&verbose=false&optimize=false&debug=false&id=1
我們再次檢視dataimport.properties。我們的更新時間變了,資料也多了一條
二、增量同步
我們實際工作中,我們第一次匯入資料需要全量匯入,那麼全量以後,我們則需要進行增量匯入,增量匯入的標準就是資料庫中的最後更新時間update_at欄位,這個時間需要和我們看到的dataimport.properties裡面的last_index_time進行對比來進行增量同步
在這裡,我們需要去修改我的data-config.xml檔案,修改之前先了解幾個概念
query:查詢資料庫符合條件的記錄
deltaQuery:增量索引查詢主鍵ID
deltaImportQuery:增量索引查詢匯入的資料
deletedPkQuery:增量縮影刪除主鍵ID
然後我修改data-config.xml檔案
<dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://192.168.0.102:3306/solrtest" user="root" password="123456"/>
<document>
<entity name="solr_test" pk="id" transformer="DateFormatTransformer" query="SELECT id, subject, content, update_at FROM solr_test WHERE id >= '${dataimporter.request.id}'"
deltaImportQuery="select * from solr_test where id='${dih.delta.id}'"
deltaQuery="select id from solr_test where update_at > '${dih.last_index_time}'"
>
<field column="id" name="id"/>
<field column="subject" name="subject"/>
<field column="content" name="content"/>
<field column="update_at" name="update_at" dateTimeFormat="yyyy-MM-dd HH:mm:ss" />
</entity>
</document>
</dataConfig>
並在資料庫中新增1條資料,他的最後更新時間大於dataimport.properties的last_index_time時間
下面我們進行增量同步
這裡就多了一條記錄了
那在平時工作過程中,我們不可能定時地來控制檯進行點選按鈕進行增量同步的操作,那麼我們可以通過程式定時訪問URL的方式來進行增量操作,或者在linux裡面使用crontab定時執行呼叫增量地址(這裡注意command=delta-import而不是full-import),訪問地址
http://192.168.46.143:8080/solr/solr/dataimport?command=delta-import&clean=
false&commit=true&wt=json&indent=true&verbose=false&optimize=false&debug=false