本文地址 http://www.cnblogs.com/jasonxuli/p/6491270.html

DataImportHandler (DIH) 支持全量数据导入和增量数据导入,主要有四个query:query,deltaQuery,parentDeltaQuery,deltaImportQuery。

大体概括就是:

query :(必须),用于全量导入,查询表记录;或在没有 deltaImportQuery 的时候用于增量导入;
deltaQuery :用于增量导入,查找上次导入后发生变化的表记录,获取其主键(pk);
parentDeltaQuery:用于增量导入,根据deltaQuery获取到的子实体的主键来查找到父实体的主键;
deltaImportQuery:用于增量导入,根据子实体的parentDeltaQuery获取到的父实体的主键查询父实体内容;
                            以及,根据 deltaQuery 获取到的子实体的主键执行各个子实体的 deltaImportQuery 或 query。
 
举个栗子,假设有两个表:
table Student (id, name, age, classId, deleted, createdAt, updatedAt)
table Class (id, name, grade, deleted, createdAt, updatedAt)

想要以 Student 表为 document 的主体,Class表通过 Student.classId 于 Student 表关联,配置如下:

solr-data-config.xml:

 <dataConfig>
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://dbhost/dbname?zeroDateTimeBehavior=convertToNull" user="dbuser"
password="dbpassword"/>
<document>
<entity name="student" transformer="RegexTransformer" pk="id"
query="select * from Student where deleted=0;"
deltaImportQuery="select * from Student where deleted=0 and id='${dih.delta.id}';"
deltaQuery="select id from Student where convert_tz(updatedAt, '+00:00', '+08:00') &gt; '${dih.last_index_time}');"
deletedPkQuery="select id from Student where deleted=1;"> <field column="id" name="id"/>
<field column="name" name="name"/>
<field column="age" name="age"/>
<field column="classId" name="classId"/>
<field column="deleted" name="deleted"/>
<field column="createdAt" name="createdAt"/>
<field column="updatedAt" name="updatedAt"/> <entity name="class" transformer="RegexTransformer" pk="classId"
query="select * from Class where deleted=0 and id='${student.classId}'"
deltaQuery="select id from Class where convert_tz(updatedAt, '+00:00', '+08:00') &gt; '${dih.last_index_time}'"
parentDeltaQuery="select id from Student where classId=${class.id}">
<field column="image" name="image"/>
<field column="banner" name="banner"/>
</entity>
</entity>
</document>
</dataConfig>

在上面配置中,student有四个SQL语句,class有三个SQL语句,其中只有 student.query 没有输入(参数)。

全量导入时:

1,从父实体 student 开始,执行 query 语句,获取到 student.id 等字段;

2,用这些 student.id 去组成 class.query 语句,获取 class。

增量导入时:

只要有任何父/子数据变化,就重新生成相关文档

1,从子实体 class 开始,执行 deltaQuery 语句,获取到 class.id;

2,用 class.id 组装 class parentDeltaQuery 语句,获取到 student.id;

3.1,用 student.id 组装 student deltaImportQuery 语句,获取到需要更新的 student;

3.2,用 class.id 组装 class deltaImportQuery 或者 class query,获取需要更新的 class ;

参考:https://wiki.apache.org/solr/DataImportHandler#Configuring_DataSources

----------------

备注:

在 solrconfig.xml 中定义 DIH :
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">solr-data-config.xml</str>
</lst>
<lst name="datasource">
<str name="driver">com.mysql.jdbc.Driver</str>
<str name="url">jdbc:mysql://localhost/test</str>
<str name="user">root</str>
<str name="password">root</str>
</lst>
</requestHandler>

Solr DIH query 工作流的更多相关文章

  1. Solr DIH JDBC 源码解析

    Solr DIH 源码解析 DataImportHandler.handleRequestBody()中的importer.runCmd(requestParams, sw) if (DataImpo ...

  2. solr DIH 知识梳理

    solr DIH 知识梳理 web.xml中listener配置 <listener> <listener-class>org.apache.solr.handler.data ...

  3. Solrj和Solr DIH索引效率对比分析

    测试软件环境: 1.16G windows7 x64  32core cpu . 2.jdk 1.7  tomcat 6.x  solr 4.8 数据库软件环境: 1.16G windows7 x64 ...

  4. Solr DIH dataconfig配置

    1. 配置文件data-config.xml定义了数据库的基本配置,以及导出数据的映射规则,即导出数据库表中对应哪些字段的值,以及对特定字段的值做如何处理 </pre><p>& ...

  5. Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)

    目录 1 加入数据导入处理器的jar包 2 加入数据库驱动包 3 配置solrconfig.xml文件 3.1 配置lib标签 - 加入驱动jar包 3.2 配置requestHandler标签 - ...

  6. Solr DIH导入出现 Data Config problem: 前言中不允许有内容 异常

    Solr配置DIH导入时出现 “Data Config problem: 前言中不允许有内容.” 异常. <response> <lst name="responseHea ...

  7. Solr DIH以Mysql为数据源批量创建索引

    演示使用solr管理后台,以mysql为数据源,批量建索引的方法 测试于:Solr 4.5.1, mmseg4j 1.9.1, Jdk 1.6.0_45, Tomcat 6.0.37 | CentOS ...

  8. solr系统query检索词特殊字符的处理

    solr是基于 lucence开发的应用,如果query中带有非法字符串,结果很可能是检索出所有内容或者直接报错,所以你对用户的输入必须要先做处理.输入星号,能够检索出所有内容:输入加号,则会报错. ...

  9. [转]solr系统query检索词特殊字符的处理

    原文地址:http://blog.csdn.net/wgw335363240/article/details/39889979 solr是基于 lucence开发的应用,如果query中带有非法字符串 ...

随机推荐

  1. 【IOS6.0 自学瞎折腾】(五)应用程序的启动过程和Application生命周期

    一 :main函数入口 看下项目资源结构,其实程序的入口也是在main.m里面. #import <UIKit/UIKit.h> #import "BvinAppDelegate ...

  2. java高级---->Thread之CompletionService的使用

    CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...

  3. redis基础----->redis的基本使用(一)

    这里我们就在虚拟机中安装redis,并且使用java和python实现简单的操作.深情是我承担不起的重担,情话只是偶尔兑现的谎言. redis的使用 下载地址:https://redis.io/.安装 ...

  4. JS-匀速运动-运动停止

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. LeetCode——Basic Calculator

    Description: Implement a basic calculator to evaluate a simple expression string. The expression str ...

  6. executeQuery、executeUpdate 和 execute

    Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.executeUpdate 和 execute.使用哪一个方法由 SQL 语句所产生的内容决定. 1. Resul ...

  7. 关于OS命令注入的闭合问题

    1.在Windows下 windows下非常好办,只需要&肯定可以执行: C:\Users\xxx\Desktop>aaaa | 127.0.0.1 'aaaa' 不是内部或外部命令,也 ...

  8. 《IT项目经理成长手记》

    下载地址: https://download.csdn.net/download/h623691640/9109265 读后感: 曾担任过试用期3个月项目经理,遇到的问题确实如书中所说,几乎有一些是一 ...

  9. Egret3D初步学习笔记三 (角色使用)

    一 Unity中编辑角色 仍然使用unity4.7.1_Egret3D_Dll.unitypackage. 里面含有一个角色. 二 查看人物的动画 选中lingtong 属性面板里有个Animator ...

  10. ios UITableView默认选中第一行

    NSIndexPath *ip = [NSIndexPath indexPathForRow:0inSection:0]; [titleTableViewselectRowAtIndexPath:ip ...