首页 > 代码库 > DIH中添加不同的数据源
DIH中添加不同的数据源
需求:从mysql数据库中读取一个知识记录,从记录表中的字段值中获取一个文件路径,读取xml文件,xml文件中可能包含多个文档内容。建立索引。
xml文件样例:
<?xml version="1.0" encoding="utf-8"?><docs> <data> <id>1</id> <title>测试数据</title> <content>测试内容</content> <crtime>2014-10-13 16:10:33</crtime> <templateid>201</templateid> <price>12.11</price> </data> <data> <id>2</id> <title>测试数据1</title> <content>测试内容1</content> <crtime>2014-10-12 16:10:33</crtime> <templateid>202</templateid> <price>20.11</price> </data></docs>
mysql数据格式样例:
CREATE TABLE `gx_kmsindex` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键ID‘, `docid` BIGINT(20) COMMENT ‘知识ID‘, `path` VARCHAR(200) DEFAULT NULL COMMENT ‘知识xml文件路径‘, `templateid` VARCHAR(20) NOT NULL COMMENT ‘知识模板id‘, `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘创建时间‘, `type` VARCHAR(20) NOT NULL COMMENT ‘知识操作类型,add/update/delete‘, PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
当为新增、更新知识时,docid可以为空,当为删除知识时,docid为必填项。
处理方案:
1、schema.xml中配置field:
<field name="id" type="string" indexed="true" stored="true" required="true"/><field name="_version_" type="long" indexed="true" stored="true"/> <field name="title" type="text_ik" indexed="true" stored="true" termVectors="true"/><field name="content" type="text_ik" indexed="true" stored="true" termVectors="true"/><field name="crtime" type="date" indexed="true" stored="true" /><field name="templateid" type="string" indexed="true" stored="true" /><field name="price" type="double" indexed="true" stored="true" />
2、solrconfig.xml中配置handler:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">mysql-data-config.xml</str> </lst></requestHandler>
3、配置mysql-data-config.xml
<dataConfig> <dataSource name="jdbc" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" batchSize="-1" url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8" user="root" password="root" /> <dataSource name="file" type="FileDataSource" encoding="utf-8" /> <document> <entity name="kms" dataSource="jdbc" query="SELECT path FROM gx_kmsindex ORDER BY TIME ASC" transformer="DateFormatTransformer"> <entity dataSource="file" name="xml" url="${kms.path}" processor="XPathEntityProcessor" forEach="/docs/data/" transformer="DateFormatTransformer"> <field column="id" xpath="/docs/data/id" /> <field column="title" xpath="/docs/data/title" /> <field column="content" xpath="/docs/data/content" /> <field column="crtime" xpath="/docs/data/crtime" dateTimeFormat="yyyy-MM-dd HH:mm:ss" /> <field column="templateid" xpath="/docs/data/templateid" /> <field column="price" xpath="/docs/data/price" /> </entity> </entity> </document></dataConfig>
4、在后台建立索引,发现只抽取了一条数据记录。
按照道理,应该两条数据都能抽取。经过排查,是rootEntity属性的问题。在kms实体中,没有设置rootEntity属性,默认为true的。这样就把gx_kmsindex当作了根实体,
rootEntity="true" 表示它的文档会被Solr索引。如果rootEntity属性被显式地设置为false,那么DIH会反向查找,直到找到一个实体配置没有设置为false的。可以有子实体(sub-entities),它通常为每个父文档执行一次,并通常由父文档引用来缩小查找范围。子实体的文档会合并到根实体的文档中,如果多个子实体对相同的域产生了多个文档,那么根实体会产生一个多值域。
这里kms实体的rootEntity属性应该设置为“false”。xml实体才是用于索引的数据实体。所以xml实体rootEntity属性为true。这里采用默认属性值即可。修改后的mysql-data-config.xml:
<dataConfig><dataSource name="jdbc" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" batchSize="-1" url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8" user="root" password="root"/><dataSource name="file" type="FileDataSource" encoding="utf-8" /> <document> <entity name="kms" dataSource="jdbc" query="SELECT path FROM gx_kmsindex ORDER BY TIME ASC" transformer="DateFormatTransformer" rootEntity="false"> <entity dataSource="file" name="xml" url="${kms.path}" processor="XPathEntityProcessor" forEach="/docs/data/" transformer="DateFormatTransformer" > <field column="id" xpath="/docs/data/id" /> <field column="title" xpath="/docs/data/title" /> <field column="content" xpath="/docs/data/content" /> <field column="crtime" xpath="/docs/data/crtime" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/> <field column="templateid" xpath="/docs/data/templateid" /> <field column="price" xpath="/docs/data/price" /> </entity> </entity> </document></dataConfig>
5、修改后,重新建立索引:
DIH中添加不同的数据源
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。