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、修改后,重新建立索引:

时间: 2024-08-02 04:50:42

DIH中添加不同的数据源的相关文章

[Asp.net MVC]Asp.net MVC5系列——在模型中添加验证规则

目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 [Asp.net MVC]Asp.net MVC5系列——添加模型 [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据 [Asp.net MVC]Asp.net MVC5系列——添加数据 概述 上篇文章中介绍了添加数据,在提交表单的数据的时候,我们需

Asp.net MVC]Asp.net MVC5系列——在模型中添加

目录 概述 在模型中添加验证规则 自定义验证规则 伙伴类的使用 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列--第一个项目 [Asp.net MVC]Asp.net MVC5系列--添加视图 [Asp.net MVC]Asp.net MVC5系列--添加模型 [Asp.net MVC]Asp.net MVC5系列--从控制器访问模型中的数据 [Asp.net MVC]Asp.net MVC5系列--添加数据 概述 上篇文章中介绍了添加数据,在提交表单的数据的时候,我们需

093向选择器中添加UIView子类

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate> 4 @property (strong, nonatomic) UIPickerView *pikVCustom; 5 @property (strong, nonatomic) NSArray *

DataGridView 中添加CheckBox和常用处理方式 .

DataGridView 中添加CheckBox和常用处理方式 文章1 转载:http://blog.csdn.net/pinkey1987/article/details/5267934 DataGridView中添加CheckBox控件主要采用两种方法 1.  通过在DataGridView的Columns中添加System.Windows.Forms.DataGridViewCheckBoxColumn类型的列.并可以设置该列相关的属性信息. 2. 在程序代码中直接添加相应的代码 Syst

应用DataAdapter对象向数据库中添加数据--有问题

private void Form1_Load(object sender, EventArgs e) { string strCon = "Server=localhost;User Id=sa;Pwd=;DataBase=my";//定义数据库连接字符串 SqlConnection sqlcon = new SqlConnection(strCon);//实例化数据库连接对象 SqlDataAdapter sqlda_1 = new SqlDataAdapter("sel

Transformer中引用iqd作为数据源报错TR1907的一种解决办法

好久没和transform接触了,初次接触就给我送了个大礼,在选择好iqd文件执行最后一步导入的时候,要求我对数据源输入用户名密码,我连续输入了三次用户名和密码,在我十分肯定用户名和密码没错的情况下,它还是报错了,具体错误如下图 接下来,当然首先要检查一下iqd文件,再确保了iqd文件没有问题的情况下,我多多少少有些迷茫,于是就再看看报错的详情,点开Details看到下面的文字 需要修改D:\Program Files (x86)\ibm\cognos\c10\CS7Gateways\bin目录

Hibernate5-多对一双向关联-fetch=&quot;select&quot;,lazy=&quot;proxy&quot;,在一的一方的class标签中添加

1.创建项目,项目名称hibernatedemo28,目录结构如图所示 2.在项目中创建lib目录存储jar文件,目录结构如图所示 3.在src目录中创建实体类Forum,包名(com.mycompany.demo.bean),如图所示 4.实体类Forum的内容如下 package com.mycompany.demo.bean; import java.util.Set; public class Forum { private int fid; private String name; p

怎样在UICollectionView中添加Header和footer

---恢复内容开始--- 怎样在UICollectionView中添加Header和footer 转载于http://my.oschina.net/zboy/blog/221525 摘要 来自-http://www.appcoda.com/supplementary-view-uicollectionview-flow-layout/ iOS UICollectionViewController 目录[-] Tweak the Margin of Your Content using Secti

007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Changing views and layout pages 修改视图和布局页 2.Change the title and menu link in the layout file 在布局文件中修改标题与菜单 3.Passing Data from the Controller to the View 从控制器向视图