天天看點

solr 從資料庫導入資料,全量索引和增量索引

首先說一下是從mysql資料庫導入資料

這裡使用的是mysql測試。

1、先在mysql中建一個表:solr_test

solr 從資料庫導入資料,全量索引和增量索引

2、插入幾條測試資料:

solr 從資料庫導入資料,全量索引和增量索引

3、用記事本打solrconfig.xml檔案,在solrhome檔案夾中。e:\solrhome\mycore\conf\solrconfig.xml

加入這個節點:

4、建立一個data-config.xml檔案,與solrconfig.xml同一個目錄下。内容為

solr 從資料庫導入資料,全量索引和增量索引
solr 從資料庫導入資料,全量索引和增量索引

說明:這裡使用了一個${dataimporter.request.id},這個是參數,後面在做資料導入時,會使用到,以此條件為基準讀資料。

5、複制解壓出的solr jar包solr-dataimporthandler-4.10.0.jar和solr-dataimporthandler-extras-4.10.0.jar到tomcat solr webapp的web-inf\lib目錄下。

當然,也包括mysql的jdbc jar包:mysql-connector-java-5.1.7-bin.jar

(還有一種方法是在solrconfig.xml中加入lib節點,然後把jar包放到solrhome下,這樣可以不在web-inf\lib中加入jar包)

6、用記事本打開schema.xml,在在solrhome檔案夾中(同第3點)。内容為:

solr 從資料庫導入資料,全量索引和增量索引
solr 從資料庫導入資料,全量索引和增量索引

7、打開solr web:

solr 從資料庫導入資料,全量索引和增量索引

說明:

custom parameters填入id=1,這是在第4點中設定的參數。

clean選項,是指是否删除未比對到的資料。也就是在資料庫select結果中沒有,而solr索引庫中存在,則删除。

也可以使用這個位址直接通路:

将傳回結果:

solr 從資料庫導入資料,全量索引和增量索引

配置好後,之後我們隻需要使用這個url位址,就可以不段的去導入資料做索引了。(就這麼簡單)

8、測試查詢:

solr 從資料庫導入資料,全量索引和增量索引

當然,dataimport可以加入參數指令,讓其重新加載data-config.xml

下面全量索引和增量索引的配置差別,注意和上面不是同一個工程(首先全量索引會把資料庫中所有資料進行索引的更新,增量索引隻更新資料庫中增删改查過的)要使用增量索引,資料庫中要有一個辨別字段來表示資料的變化,我們可以使用時間戳來表示,資料更新時時間戳也更新,這樣,solr通過比較時間戳的變化來增量更新索引。

1.修改multicore/new_core/conf/solrconfig.xml檔案(上篇提到過的),在裡面新增

solr 從資料庫導入資料,全量索引和增量索引

<requesthandler name="/dataimport" class="org.apache.solr.handler.dataimport.dataimporthandler">  

     <lst name="defaults">  

     <str name="config">data-config.xml</str>  

     </lst>   

</requesthandler>   

<requesthandler name="/deltaimport" class="org.apache.solr.handler.dataimport.dataimporthandler">  

    <lst name="defaults">  

        <str name="config">delta-data-config.xml</str>  

    </lst>  

</requesthandler>  

 其中第一段是專門做全量索引的,第二段做增量索引(主要是靠dataimporthandler類實作)

2.新增multicore/new_core/conf/data-config.xml檔案

solr 從資料庫導入資料,全量索引和增量索引

<dataconfig>  

    <datasource name="jdbc" driver="com.mysql.jdbc.driver"  

        url="jdbc:mysql://192.168.0.81:3306/new_mall?zerodatetimebehavior=converttonull&characterencoding=utf8&useunicode=true"  

        user="root" password="hys_db@2014"/>  

    <document name="mall_goods">  

        <entity name="mallgoods" pk="id"  

                query="select * from mall_goods limit ${dataimporter.request.length} offset ${dataimporter.request.offset}"  

                transformer="regextransformer">  

            <field column="goods_id" name="id" />  

            <field column="title" name="title" />  

            <field column="subtitle" name="subtitle" />  

            <field column="cover_img_path" name="coverimgpath" />  

            <field column="description" name="description" />  

            <field column="update_date" name="updatedate" />  

        </entity>  

    </document>  

</dataconfig>  

datasource不用說了,資料源配置來的 

entity文檔中的實體配置(注意pk="id" 不能随便改 ,需要和schema.xml中的<uniquekey>id</uniquekey>比對,否則會報“ org.apache.solr.common.solrexception: document is missing mandatory uniquekey field: id”)

query 查詢語句(可分頁)

transformer 暫時不清楚幹啥

field定義列名

3.新增multicore/new_core/conf/delta-data-config.xml檔案

solr 從資料庫導入資料,全量索引和增量索引

                query="select * from mall_goods"  

                deltaimportquery="select * from mall_goods where goods_id='${dih.delta.id}'"  

                deltaquery="select goods_id as id from mall_goods where update_date > '${dih.last_index_time}'"  

deltaquery查詢出有更改過的id

deltaimportquery根據id查詢 

4.修改multicore/new_core/conf/schema.xml檔案,定義field索引配置

solr 從資料庫導入資料,全量索引和增量索引

<field name="id" type="string" indexed="true" stored="true" required="true" multivalued="false" />   

<field name="title" type="text_ansj" indexed="true" stored="true" required="true" multivalued="false"/>  

<field name="subtitle" type="text_ansj" indexed="true" stored="true" required="false" multivalued="false"/>  

<field name="coverimgpath" type="string" indexed="false" stored="true" required="true" multivalued="false" />  

<field name="description" type="text_ansj" indexed="true" stored="true" required="false" multivalued="false"/>  

<field name="updatedate" type="text_ansj" indexed="true" stored="true" required="false" multivalued="false"/>  

 注意上面選擇一下text_ansj

5.solr的war包可能還缺少部分jar包,需要把mysql的jar,以及solr項目中dist目錄下的jar包都放到solr的web站點中

6.開始運作

全量:http://solr.xxxx.com:8082/new_core/dataimport?command=full-import&commit=true&clean=false&offset=0&length=100000(其中0到100000的資料建立索引)

增量:http://solr.ehaoyao.com:8082/new_core/deltaimport?command=delta-import&entity=mallgoods 

entity:是document下面的标簽(data-config.xml)。使用這個參數可以有選擇的執行一個或多個entity   。使用多個entity參數可以使得多個entity同時運作。如果不選擇此參數那麼所有的都會被運作。

clean:選擇是否要在索引開始建構之前删除之前的索引,預設為true

commit:選擇是否在索引完成之後送出。預設為true

optimize:是否在索引完成之後對索引進行優化。預設為true

debug:是否以調試模式運作,适用于互動式開發(interactive development mode)之中。

請注意,如果以調試模式運作,那麼預設不會自動送出,請加參數“commit=true” 

注意:在做增量索引的時候

很容易出現deltaquery has no column to resolve to declared primary key pk='id'這種異常

主要是因為id" must be used as it is in 'deltaquery' select statement as "select id from ..."

(if you different name for id column in database, then use 'as' keyword in select statement. in my case i had 'studentid' as primary key in student table. so i used it as "select studentid as id from ..."

--> the same applies to 'deletedpkquery'

at present its working fine for me. any updation in database is reflected in solr as well.

是以,delta-data-config.xml檔案需要注意一下pk的值

參考連接配接:

http://shiyanjun.cn/archives/444.html

http://blog.duteba.com/technology/article/70.htm

http://www.devnote.cn/article/89.html

http://qiaqia26.iteye.com/blog/1004996

http://zzstudy.offcn.com/archives/8104

http://blog.csdn.net/duck_genuine/article/details/5426897 

------------------------------------------------------------------------------------------------------------------------------

最後補充:

有時候需要删除索引資料,可以這樣删除

http://xxxx/new_core/update/?stream.body=<delete><query>*:*</query></delete>&stream.contenttype=text/xml;charset=utf-8&commit=true

new_core 表示你要删除哪個核下面的索引

java代碼調用增量和全量索引

相關說明:

主要原理:是使用率每次我們進行import的時候在solr.home的conf下面生成的dataimport.properties檔案,此檔案裡面有最近一次導入的相關資訊,如:

我的檔案位置為

我的檔案内容為

last_index_time是最近一次增量或全量索引的時間,通過比較這個時間和我們資料庫表中的update_time列即可得出哪些是之後修改或者添加的。

data-config.xml說明:

query是擷取全部資料的sql

deltaimportquery是擷取增量資料時使用的sql

deltaquery是擷取主鍵的sql

參數說明:

clean:設定建索引前是否删除之前的索引;

commit:設定建索引後是否自動送出;

entity:mysql-data-config.xml entity name中配置的名稱,如果配有多個,且這裡不指定,所有entity都會被執行;

optimize:設定建索引後是否自動優化。