Solr学习之路-3Data Import Handler

数据的存储和表现方式有很多。利用DIH我们可以索引RDBMS、XML/HTTP、RSSEmail等类型的数据源。首先查看官方例子:example/example-DIH

  • 启动DIH:solr -e dih进入UI管理界面localhost:8983/solr
  • HSQLDB为例,HSQLDB是纯Java的开源数据库,非常适用于演示和测试。

example-DIH样例

1、先启动HSQLDB查看数据库数据
启动HSQL服务

example\example-DIH\hsqldb>Java -cp ../solr/db/lib/hsqldb-1.8.0.10.jar org.hsqldb.Server -database.0 ex -dbname.0 ex

连接ex数据库

example\example-DIH\hsqldb>java -cp ../solr/db/lib/hsqldb-1.8.0.10.jar org.hsqldb.util.DatabaseManager -url jdbc:hsqldb:hsql://localhost/ex

查询ITEM表数据

select * from item

hsql manager

查看这些表,可以知道表ITEM和FEATURE是一对多的关系,表ITEM和CATEGORY是多对多的关系,如图所示:

item_feature

2、进入UI管理界面,选择db core做全量导入,也可以用URL命令http://localhost:8983/solr/dataimport?command=full-import从HSQLDB里导入数据,执行成功,如图所示:

full-import

让我们先来看下【example-DIH\solr\db\conf】目录里的样例db-data-config.xml:

  1. <dataConfig>
  2.     <dataSource driver=“org.hsqldb.jdbcDriver” url=“jdbc:hsqldb:${solr.install.dir}/example/example-DIH/hsqldb/ex” user=“sa” />
  3.     <document>
  4.         <entity name=“item” query=“select * from item”
  5.                 deltaQuery=“select id from item where last_modified > ‘${dataimporter.last_index_time}'”>
  6.             <field column=“NAME” name=“name” />
  7.             <entity name=“feature”
  8.                     query=“select DESCRIPTION from FEATURE where ITEM_ID=’${item.ID}'”
  9.                     deltaQuery=“select ITEM_ID from FEATURE where last_modified > ‘${dataimporter.last_index_time}'”
  10.                     parentDeltaQuery=“select ID from item where ID=${feature.ITEM_ID}”>
  11.                 <field name=“features” column=“DESCRIPTION” />
  12.             </entity>
  13.             <entity name=“item_category”
  14.                     query=“select CATEGORY_ID from item_category where ITEM_ID=’${item.ID}'”
  15.                     deltaQuery=“select ITEM_ID, CATEGORY_ID from item_category where last_modified > ‘${dataimporter.last_index_time}'”
  16.                     parentDeltaQuery=“select ID from item where ID=${item_category.ITEM_ID}”>
  17.                 <entity name=“category”
  18.                         query=“select DESCRIPTION from category where ID = ‘${item_category.CATEGORY_ID}'”
  19.                         deltaQuery=“select ID from category where last_modified > ‘${dataimporter.last_index_time}'”
  20.                         parentDeltaQuery=“select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}”>
  21.                     <field column=“DESCRIPTION” name=“cat” />
  22.                 </entity>
  23.             </entity>
  24.         </entity>
  25.     </document>
  26. </dataConfig>

db-config配置文件有所限制和注意的地方:

  • 子Entity的query必须引用父Entity的pk
  • 子Entity的parentDeltaQuery必须引用自己的pk
  • 子Entity的parentDeltaQuery必须返回父Entity的pk
  • deltaImportQuery引用的必须是自己的pk
  • 对于query语句返回的每一行,子实体的query都将被执行一次
  • 对于deltaQuery返回的每一行,parentDeltaQuery都将被执行
  • 一旦根实体或者子实体中的行发生改变,将重新生成包含该行的solr文档

我们可以通过访问URL  http://localhost:8983/solr/dataimport?command=delta-import 来使用增量导入。操作将会新起一个线程,response中的属性statue也将显示busy now。操作执行的时间取决于你的数据集的大小。在任何时候,你都可以通过访问   http://localhost:8983/solr/dataimport 来查看状态。当 增量导入被执行的时候,它读取存储在【conf/dataimport.properties】中的“last_index_time”。它使用这个时间戳来执行增量查询,完成之后,会更新这个放在【conf/dataimport.properties】中的时间戳。

当然还要注意:SQL语句中查询的字段在【example\example-DIH\solr\db\conf\】Managed-schema文件是有定义的

manage-schema-field

3、查看索引数据,发现已转出非结构化的数据:

feature-cats

整合Tomcat Web

我们可以利用Solr学习之路–1环境集成搭建,搭建的Tomcat Web应用,放到solrhome的core中,将【solr-6.2.1\dist】目录下的solr-dataimporthandler-6.2.1.jar 和 solr-dataimporthandler-extras-6.2.1.jar 包放入【tomcat8.0.24\webapps\solr\WEB-INF\lib】目录下,还有连接Oracle数据库的jdbc jar包也放入其中。

1、配置solrconfig.xml

在【tomcat8.0.24\webapps\solr\solrhome\code1\conf\solrconfig.xml】注册Data Import handler

  1. <requestHandler name=“/dataimport” class=“solr.DataImportHandler”>
  2.     <lst name=“defaults”>
  3.       <str name=“config”>db-data-config.xml</str>
  4.     </lst>
  5.   </requestHandler>

2、DIH配置文件

这里我们可以拷贝【example-DIH\solr\db\conf】目录里的样例db-data-config.xml,进行改造,放入相同目录里。配置数据源,这里配置多数据源

  1. <dataSource name=“jdbc1” driver=“oracle.jdbc.driver.OracleDriver” url=“jdbc:oracle:thin:@192.168.0.200:1521:develop” user=“emsys” password=“develop”/>
  2. <dataSource name=“jdbc2” driver=“oracle.jdbc.driver.OracleDriver” url=“jdbc:oracle:thin:@192.168.0.200:1521:develop” user=“emszh” password=“develop”/>

运行URL命令:http://solr-host:port/solr/dataimport?command=full-import,或者直接用UI管理界面执行。

乍一看抓取49万多的数据,怎么索引量就是0呢?

index is 0

原来给自己挖了两个大坑,没注意,Managed-schema配置文件中uniqueKey默认主键名为id,结果对应的数据表没有id这字段,在db-data-config.xml中将主键对应的name值改为id即可。再次全量导入,又悲剧了,竟然只有id值,没有其他字段,看了一下Managed-schema中filed的配置,发现stored值都是false,copy都这么不小心。。。

DIH test field

索引了两张表 491062 条数据,计时2分28秒

index_size

然后查询“wqy”,查出22条,耗时130ms。如图:

wqy_search_query

突然发现,这两个数据源中的表索引到了一块,这求解。。。

当然,我们也可以加入定时增量导入机制。暂时先这样吧,可以看wiki。。。

附录:

https://wiki.apache.org/solr/DataImportHandler

One thought on “Solr学习之路-3Data Import Handler

发表评论

电子邮件地址不会被公开。 必填项已用*标注

8 + 25 = ?