首先說一下是從mysql資料庫導入資料
這裡使用的是mysql測試。
1、先在mysql中建一個表:solr_test
2、插入幾條測試資料:
3、用記事本打solrconfig.xml檔案,在solrhome檔案夾中。e:\solrhome\mycore\conf\solrconfig.xml
加入這個節點:
4、建立一個data-config.xml檔案,與solrconfig.xml同一個目錄下。内容為
說明:這裡使用了一個${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點)。内容為:
7、打開solr web:
說明:
custom parameters填入id=1,這是在第4點中設定的參數。
clean選項,是指是否删除未比對到的資料。也就是在資料庫select結果中沒有,而solr索引庫中存在,則删除。
也可以使用這個位址直接通路:
将傳回結果:
配置好後,之後我們隻需要使用這個url位址,就可以不段的去導入資料做索引了。(就這麼簡單)
8、測試查詢:
當然,dataimport可以加入參數指令,讓其重新加載data-config.xml
下面全量索引和增量索引的配置差別,注意和上面不是同一個工程(首先全量索引會把資料庫中所有資料進行索引的更新,增量索引隻更新資料庫中增删改查過的)要使用增量索引,資料庫中要有一個辨別字段來表示資料的變化,我們可以使用時間戳來表示,資料更新時時間戳也更新,這樣,solr通過比較時間戳的變化來增量更新索引。
1.修改multicore/new_core/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>
<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檔案
<dataconfig>
<datasource name="jdbc" driver="com.mysql.jdbc.driver"
url="jdbc:mysql://192.168.0.81:3306/new_mall?zerodatetimebehavior=converttonull&amp;characterencoding=utf8&amp;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檔案
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 &gt; '${dih.last_index_time}'"
deltaquery查詢出有更改過的id
deltaimportquery根據id查詢
4.修改multicore/new_core/conf/schema.xml檔案,定義field索引配置
<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:設定建索引後是否自動優化。