1. 程式人生 > >solr之mysql全量同步與增量同步

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