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>
View Code

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
View Code

当为新增、更新知识时,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、修改后,重新建立索引:

 

posted @ 2014-10-14 11:19  勿妄  阅读(380)  评论(0编辑  收藏  举报