zoukankan      html  css  js  c++  java
  • Solr DIH query 工作流

    本文地址 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:

     1 <dataConfig>
     2     <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver"
     3                 url="jdbc:mysql://dbhost/dbname?zeroDateTimeBehavior=convertToNull" user="dbuser"
     4                 password="dbpassword"/>
     5     <document>
     6         <entity name="student" transformer="RegexTransformer" pk="id"
     7             query="select * from Student where deleted=0;"
     8             deltaImportQuery="select * from Student where deleted=0 and id='${dih.delta.id}';"
     9             deltaQuery="select id from Student where convert_tz(updatedAt, '+00:00', '+08:00') &gt; '${dih.last_index_time}');"
    10             deletedPkQuery="select id from Student where deleted=1;">
    11 
    12             <field column="id" name="id"/>
    13             <field column="name" name="name"/>
    14             <field column="age" name="age"/>
    15             <field column="classId" name="classId"/>
    16             <field column="deleted" name="deleted"/>
    17             <field column="createdAt" name="createdAt"/>
    18             <field column="updatedAt" name="updatedAt"/>
    19 
    20             <entity name="class" transformer="RegexTransformer" pk="classId"
    21                 query="select * from Class where deleted=0 and id='${student.classId}'"
    22                     deltaQuery="select id from Class where convert_tz(updatedAt, '+00:00', '+08:00') &gt; '${dih.last_index_time}'"
    23                     parentDeltaQuery="select id from Student where classId=${class.id}">
    24                 <field column="image" name="image"/>
    25                 <field column="banner" name="banner"/>
    26             </entity>
    27         </entity>
    28     </document>
    29 </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> 
  • 相关阅读:
    NOIP 2012 文化之旅
    史上最全的各种C++ STL容器全解析
    详解C++ STL map 容器
    详解C++ STL priority_queue 容器
    浅谈C++ STL stack 容器
    浅谈C++ STL queue 容器
    浅谈C++ STL vector 容器
    CF1185F Two Pizzas
    浅谈C++ STL deque 容器
    详解C++ STL multiset 容器
  • 原文地址:https://www.cnblogs.com/jasonxuli/p/6491270.html
Copyright © 2011-2022 走看看