数据的存储和表现方式有很多。利用DIH
我们可以索引RDBMS、XML/HTTP、RSS
和Email
等类型的数据源。首先查看官方例子: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
查看这些表,可以知道表ITEM和FEATURE是一对多的关系,表ITEM和CATEGORY是多对多的关系,如图所示:
2、进入UI管理界面,选择db
core做全量导入,也可以用URL命令http://localhost:8983/solr/dataimport?command=full-import
从HSQLDB里导入数据,执行成功,如图所示:
让我们先来看下【example-DIH\solr\db\conf】目录里的样例db-data-config.xml:
- <dataConfig>
- <dataSource driver=“org.hsqldb.jdbcDriver” url=“jdbc:hsqldb:${solr.install.dir}/example/example-DIH/hsqldb/ex” user=“sa” />
- <document>
- <entity name=“item” query=“select * from item”
- deltaQuery=“select id from item where last_modified > ‘${dataimporter.last_index_time}'”>
- <field column=“NAME” name=“name” />
- <entity name=“feature”
- query=“select DESCRIPTION from FEATURE where ITEM_ID=’${item.ID}'”
- deltaQuery=“select ITEM_ID from FEATURE where last_modified > ‘${dataimporter.last_index_time}'”
- parentDeltaQuery=“select ID from item where ID=${feature.ITEM_ID}”>
- <field name=“features” column=“DESCRIPTION” />
- </entity>
- <entity name=“item_category”
- query=“select CATEGORY_ID from item_category where ITEM_ID=’${item.ID}'”
- deltaQuery=“select ITEM_ID, CATEGORY_ID from item_category where last_modified > ‘${dataimporter.last_index_time}'”
- parentDeltaQuery=“select ID from item where ID=${item_category.ITEM_ID}”>
- <entity name=“category”
- query=“select DESCRIPTION from category where ID = ‘${item_category.CATEGORY_ID}'”
- deltaQuery=“select ID from category where last_modified > ‘${dataimporter.last_index_time}'”
- parentDeltaQuery=“select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}”>
- <field column=“DESCRIPTION” name=“cat” />
- </entity>
- </entity>
- </entity>
- </document>
- </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文件是有定义的
3、查看索引数据,发现已转出非结构化的数据:
整合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
- <requestHandler name=“/dataimport” class=“solr.DataImportHandler”>
- <lst name=“defaults”>
- <str name=“config”>db-data-config.xml</str>
- </lst>
- </requestHandler>
2、DIH配置文件
这里我们可以拷贝【example-DIH\solr\db\conf】目录里的样例db-data-config.xml,进行改造,放入相同目录里。配置数据源,这里配置多数据源
- <dataSource name=“jdbc1” driver=“oracle.jdbc.driver.OracleDriver” url=“jdbc:oracle:thin:@192.168.0.200:1521:develop” user=“emsys” password=“develop”/>
- <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呢?
原来给自己挖了两个大坑,没注意,Managed-schema配置文件中uniqueKey默认主键名为id,结果对应的数据表没有id这字段,在db-data-config.xml中将主键对应的name值改为id即可。再次全量导入,又悲剧了,竟然只有id值,没有其他字段,看了一下Managed-schema中filed的配置,发现stored值都是false,copy都这么不小心。。。
索引了两张表 491062 条数据,计时2分28秒
然后查询“wqy”,查出22条,耗时130ms。如图:
突然发现,这两个数据源中的表索引到了一块,这求解。。。
当然,我们也可以加入定时增量导入机制。暂时先这样吧,可以看wiki。。。
附录:
https://wiki.apache.org/solr/DataImportHandler
One thought on “Solr学习之路-3Data Import Handler”