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接口来做索引。