Solr DIH就是Data Import Handler.由于很多時候我們的資料在資料庫裡面,需要将資料庫裡面的資料導出進行索引.Solr提供了一個很友善的接口來從資料庫生成索引。DIH支援從單表和多表管理來導入資料,可以跨資料庫來讀取資料,還可以增量索引資料,應該說滿足很多一般的需求。
以下以solr-5.3.0為例,下面來說說一個簡單的從Mysql資料庫導入資料的配置,更多複雜的配置,需要參考文檔多實際摸索。
1. 基本配置
在Slor的安裝{solr_home}目錄下面建立一個目錄,例如dbindex,這樣我的路徑是D:\app\apache-solr-5.3.0\dbindex
将{solr_home}\example\example-DIH\solr\目錄裡面的db,solr.xml一個目錄和一個檔案copy到dbindex下面。這個目錄db的名字可以改,後面可以看到就是core的名字。
進入db\lib目錄,把mysql的驅動copy到這個目錄裡面,很明顯需要用到JDBC驅動,我的版本是mysql-connector-java-5.0.7-bin.jar(solr會自動讀取這個目錄的jar包)
進入db\conf目錄,這裡面的檔案很多,我們隻需要修改幾個檔案就可以了。(為什麼這樣配置,後面可以很明顯看出來)
db-data-config.xml
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf-8" user="root" password="root" batchSize="-1" />
<document>
<entity name="item" pk="id" query="select * from item"
deltaImportQuery="select * from item where ID='${dih.delta.id}'"
deltaQuery="select id from item where last_modified > '${dataimporter.last_index_time}'">
</entity>
</document>
</dataConfig>
schema.xml field部分的配置如下,裡面很多多餘的字段可以不要,尤其是很多copyField.
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="name" type="text_general" indexed="true" stored="true"/>
<field name="manu" type="text_general" indexed="true" stored="true" omitNorms="true"/>
<field name="includes" type="text_general" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
<field name="weight" type="float" indexed="true" stored="true"/>
<field name="price" type="float" indexed="true" stored="true"/>
<field name="popularity" type="int" indexed="true" stored="true" />
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
<dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/>
其實這些dynamicField可以不要
2. 建立一個資料庫mydb,建立一個表,插入幾條記錄
CREATE CACHED TABLE ITEM(ID CHAR(8),NAME VARCHAR(100),MANU VARCHAR(50),WEIGHT REAL,PRICE REAL,POPULARITY INTEGER,INCLUDES VARCHAR(200),LAST_MODIFIED TIMESTAMP );
INSERT INTO `item` VALUES (1,'a','',100,12,3,'',NOW());
INSERT INTO `item` VALUES (2,'b','',200,22,3,'',NOW());
INSERT INTO `item` VALUES (3,'c','',300,13,5,'',NOW());
INSERT INTO `item` VALUES (4,'d','',400,14,4,'',NOW());
使用其他的資料庫,可以自己稍作修改(包括上面的配置檔案,修改成自己的資料庫,使用者名,密碼)
3.啟動Solr
啟動一個cmd,在cd 至bin目錄
solr start -p 8983 -s "D:\app\apache-solr-5.3.0\dbindex"
浏覽器打開http://localhost:8983/solr/#/
可以看看Core Admin,下面選擇db這個core.點選Dataimport選擇full-import, Entity 為item 執行下則可以看到(或者Refresh Status)
想看看有沒有資料,到Query裡面看看,可以看到資料有了,4條記錄
說好的增量索引呢?這個可以有
4.增量索引
執行下面兩條語句來修改資料
INSERT INTO `item` VALUES (5,'中華人民共和國','',500,15,5,'',NOW());
UPDATE `item` SET NAME='ddd', LAST_MODIFIED=NOW() WHERE id=4;
點選Dataimport選擇delta-import, Entity 為item 執行下則可以看到
在查詢資料看看
我選擇的CSV格式,這樣可以看到資料确實修改了。而且中文也支援,隻不過中文的分詞沒有配置,索引搜尋的結果不好,可以試試搜尋name:華人
如果是delete的資料,怎麼辦呢?現在可以删除一條記錄看看,
DELETE FROM `item` WHERE id>4
可以重新重複上面的過程,做下delta import,可以看到索引删除了一條記錄。
過程中如果有錯誤,可以到D:\app\apache-solr-5.3.0\server\logs目錄下面看看,裡面有出錯的日
如果覺得上面的增量的過程有些繁瑣或者不友善內建到自己的系統中,可以自己調用API或者rest接口來做索引。