`

solr的自带的DIH进行增量索引

 
阅读更多
solr自带了DIH(DataImportHandler),提供了一站式的全量和增量方案,所以本着简单方便的理念,所以就是通过DIH来解决问题
http://wiki.apache.org/solr/DataImportHandler,DIH的官方文档,里面很多都已经讲的很到位,依据其中的说明,很多就配置完成了全量索引的文件,顺利完成了全量索引的方案,不久需要进行增量索引,忽然发现其中有好多配置比较蛊惑人心,所以就决定依着源码进行细致的研究
下面是对官方文档的一部分翻译,以及自己的研究的一点心得
目标:
读取属于数据库的数据
根据配置,聚合多列和多表的数据
用documents去更新solr
进行full imports,根据配置
通过最后的修改时间,侦测插入和更新,进行delta import
定时进行full imports和delta imports
读取和索引数据,从xml/(http/file)

设计概述
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">/home/username/data-config.xml</str>
    </lst>
  </requestHandler>

提供了full-import和delta-import
<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/dbname" user="db_username" password="db_password"/>

使用RDBMS
使用full-import和delta-import(get new inserts/updates)
name:如果有多个datasources
<dataSource name="jdbc" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@//hostname:port/SID" user="db_username" password="db_password"/>

多个数据源
<dataSource type="JdbcDataSource" name="ds-1" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db1-host/dbname" user="db_username" password="db_password"/>
<dataSource type="JdbcDataSource" name="ds-2" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://db2-host/dbname" user="db_username" password="db_password"/>

配置JdbcDataSource
driver:
url
user
password
jndiName
batchSize:
convertType:默认为false,自动的读取数据,用目标solr data-type
autoCommit:If set to 'false' it sets setAutoCommit(false)
readOnly : If this is set to 'true' , it sets setReadOnly(true), setAutoCommit(true), setTransactionIsolation(TRANSACTION_READ_UNCOMMITTED),setHoldability(CLOSE_CURSORS_AT_COMMIT) on the connection <!> Solr1.4
transactionIsolation : The possible values are [TRANSACTION_READ_UNCOMMITTED, TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ,TRANSACTION_SERIALIZABLE,TRANSACTION_NONE]

配置data-config.xml
schema的配置
name:
processor:当datasource不是RDBMS时,需要,默认为SqlEntityProcessor
transformer:
dataSource:
threads:必须放置在根目录(现在已被移除,从solr 4.0)
pk:entity的主键,这是可选的,紧紧在使用delta-imports时,才需要,但是它和定义在schema.xml中的uniqueKey没有什么关系,但是它们两个可以是一致的
rootEntity:位于document下面的entities,将会作为根实体,如果它被设置为false,位于它下面的实体将会被当做根实体,对于返回的每一个根实体都将在solr中进行创建
onError:abort|skip|continue.默认为abort,skip:忽略掉当前的文档,continue:如果这个错误没有出现,将会继续
preImportDeleteQuery:在全部导入之前,这将会被清除索引
postImportDeleteQuery:在全部导入之后,这将会被用来清除索引

对于SqlEntityProcessor:
query
deltaQuery:
parentDeltaQuery:
deletePkQuery:
deltaImportQuery

commands:
full-import:全量导入
entity:under document tag,
clean: true 在索引数据之前是否先清除已有的索引,
commit:true 在索引之后是否进行提交,
optimize: 3.6之前为true,之后为false,在对数据进行索引之后,是否进行索引的优化,
debug:默认为false,使用在交互开发模式,在这种模式下面,文档永远不会被自动提交,如果你想要在进行debug模式的时候,并且也自动提交,添加commit=true,作为一个请求的参数

delta-import:clean,commit,optimize,debug
status:created, deleted,queries run, rows fetched, status
reload-config:在data-config改变时,可以不启动solr直接加载配置文件
abort:遗弃一个操作

注:clean:

Delta-Import Example
<dataConfig>
    <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />
    <document name="products">
        <entity name="item" pk="ID"
                query="select * from item"
                deltaImportQuery="select * from item where ID='${dih.delta.id}'"
                deltaQuery="select id from item where last_modified &gt; '${dih.last_index_time}'">
            <entity name="feature" pk="ITEM_ID"
                    query="select description as features from feature where item_id='${item.ID}'">
            </entity>
            <entity name="item_category" pk="ITEM_ID, CATEGORY_ID"
                    query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'">
                <entity name="category" pk="ID"
                       query="select description as cat from category where id = '${item_category.CATEGORY_ID}'">
                </entity>
            </entity>
        </entity>
    </document>
</dataConfig>

<dataConfig>
    <dataSource driver="org.hsqldb.jdbcDriver" url="jdbc:hsqldb:/temp/example/ex" user="sa" />
    <document>
            <entity name="item" pk="ID" query="select * from item"
                deltaImportQuery="select * from item where ID=='${dih.delta.id}'"
                deltaQuery="select id from item where last_modified &gt; '${dih.last_index_time}'">
                <entity name="feature" pk="ITEM_ID"
                    query="select DESCRIPTION as features from FEATURE where ITEM_ID='${item.ID}'"
                    deltaQuery="select ITEM_ID from FEATURE where last_modified > '${dih.last_index_time}'"
                    parentDeltaQuery="select ID from item where ID=${feature.ITEM_ID}"/>
            <entity name="item_category" pk="ITEM_ID, CATEGORY_ID"
                    query="select CATEGORY_ID from item_category where ITEM_ID='${item.ID}'"
                    deltaQuery="select ITEM_ID, CATEGORY_ID from item_category where last_modified > '${dih.last_index_time}'"
                    parentDeltaQuery="select ID from item where ID=${item_category.ITEM_ID}">
                <entity name="category" pk="ID"
                        query="select DESCRIPTION as cat from category where ID = '${item_category.CATEGORY_ID}'"
                        deltaQuery="select ID from category where last_modified &gt; '${dih.last_index_time}'"
                        parentDeltaQuery="select ITEM_ID, CATEGORY_ID from item_category where CATEGORY_ID=${category.ID}"/>
            </entity>
        </entity>
    </document>
</dataConfig>

query:在full-import中,获取需要的
deltaImportQuery:当跑delta-import时,deltaImportQuery将获取到的数据填充到字段中
deltaQuery:自从上一次索引时间以来,给出改变的主键
parentDeltaQuery:parentDeltaQuery使用当前表的改变的行,(通过deltaQuery来获取),给出在父表中变化的行,这个是需要的,因为无论何时,在子表中的数据的改变,我们需要重新生成有这些
字段的文档。
query查询给出的每一行,子查询都会被执行
deltaQuery查询给出的每一行,parentDeltaQuery父级查询被执行
在root/child中的任一行发生改变,我们将重新产生这个彻底的solr document

这个"deltaImportQuery"是一个solr 1.4特性,

Solr3.1
这个handler检查确定你声明的主键域,是在所有查询的结果中,在一个实例中,这个要求使用SQL别称,当从1.4更新到3.1时,

配置property writer
在dataConfig tag下面增加一个tag "propertyWriter"
<propertyWriter dateFormat="yyyy-MM-dd HH:mm:ss" type="SimplePropertiesWriter" directory="data" filename="my_dih.properties" locale="en_US" />

type:这个实现的class
filename:simplePropertiesWriter
directory:simplePropertiesWriter
dateFormat:指定了格式化时间
locale:SimplePropertiesWriter/ZKPropertiesWriter,

Interactive Development Mode交互开发模式
点击"Debug Mode"按钮,将会启用这个功能,它将展示你的当前的DIH
注意点:你需要配置需要debug文档的行数,start和rows参数,
选择"verbose"选项。获取中间步骤的详细信息。查询到的,和传给transformter的,以及输出的
如果在跑的过程中有异常出现,这个堆栈将会被正确展示
这个域将会被实体产生,如果这个字段没有在schema.xml中明确声明,transformers就不会对此做出处理。



dataimportHandler:
对于根目录(root)的entity,如果不提供PK,则可以通过dataimporter.delta.id,进行数据的获取
如果提供了PK,也不能通过



也不能通过这种方式指定ID,

但是对于child,则不能通过dataimporter.delta,来指定,必须通过entity.name.Id,来指定,且增量导入的时候,pk必须有,且,pk的值的定义必须和deltaQuery,中的一致

parentDeltaQuery 这个在子节点中是查询的父节点中deltaImportQuery中需要的条件,通过parentDeltaQuery 查询出来的条件,将会和父节点中的deltaQuery组合起来,变成一起的条件,供父节点的deltaImportQuery中的条件去查询
deltaImportQuery 这个只是在根节点起作用


未完待续。。。。。
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    跟益达学Solr5之增量索引MySQL数据库表数据

    增量索引则只对新插入、更新或删除的数据进行索引,显著提高了效率和性能。 要实现Solr对MySQL的增量索引,我们需要以下步骤: 1. **安装和配置Solr**: 首先,我们需要下载并安装Solr 5,然后根据项目需求配置...

    solr增量导入更新索引包

    Solr提供了一个名为DataImportHandler (DIH) 的组件,可以与数据库进行交互,读取这些变更并将其转化为Solr索引的更新。 - **Update Handler**:Solr提供了多种Update Handler,例如Direct Update Handler和...

    Solr数据库插入(全量和增量)索引

    Solr 数据库插入全量和增量索引 Solr 是一个基于 Lucene 的搜索引擎,可以快速高效地对大量数据进行索引和查询。在实际应用中,我们需要将数据插入 Solr 索引库中,以便实现高效的搜索功能。本文将详细介绍 Solr ...

    solr6 增量导入demo

    1. DataImportHandler(DIH):Solr6使用DIH进行数据导入,它是Solr内置的一个处理程序,可以连接到各种数据源(如数据库),并将数据导入到Solr索引中。DIH支持增量导入,通过跟踪数据库的LastModified时间戳或者...

    solr6.5.1定时增量apache-solr-dataimportscheduler

    DataImportHandler(DIH)是一个强大的工具,允许Solr与各种数据源进行交互,将这些数据转换为Solr可以理解的格式,然后索引到Solr中。它支持全量导入和增量导入,全量导入是重新导入所有数据,而增量导入则只导入自...

    solr定时索引

    Solr的定时索引分为增量索引和完整索引两种方式,每种都有其特定的应用场景和优势。 增量索引:增量索引是指只对自上次索引以来发生变化的数据进行索引更新。这种方式适用于数据频繁更新但整体变化不大的情况,可以...

    Solr3.6用DIH组件进行MySQL数据库全文索引[参照].pdf

    在本例中,我们将探讨如何使用Solr 3.6版本的DIH组件来对MySQL数据库中的数据进行全文索引。 首先,我们需要做以下准备工作: 1. **下载程序包**:确保你已经下载了Solr 3.6的安装包,这通常包括Solr服务器、配置...

    Solr3.6用DIH组件进行MySQL数据库全文索引[归纳].pdf

    在本文中,我们将深入探讨如何使用Apache Solr 3.6的数据导入处理(DataImportHandler,简称DIH)组件从MySQL数据库中创建全文索引。Solr是一个强大的、开源的企业级搜索平台,而DIH是Solr的一个核心特性,允许用户...

    solr增量更新架包apache-solr-dataimportscheduler.jar

    增量更新是Solr的一个关键特性,它允许系统仅处理自上次完整索引以来发生更改的数据,从而提高了性能并降低了资源消耗。"apache-solr-dataimportscheduler.jar" 是一个专门为Solr设计的扩展包,用于实现自动化的数据...

    solr定时增量更新jar包1.4

    它扩展了Solr的数据导入处理(DataImportHandler, DIH)功能,DIH是一个强大的工具,允许Solr从各种数据源(如关系型数据库、文件系统等)导入数据并建立索引。而DataImportScheduler则在此基础上增加了定时任务的功能...

    solr增量更新jar包及配置文件

    4. 提交:在处理完一批增量数据后,Solr会进行提交操作,使索引变更对搜索可见。 5. 错误处理:配置适当的错误处理机制,如重试、日志记录等,以确保系统的健壮性。 综上所述,"solr增量更新jar包及配置文件"是Solr...

    solr 定时增量更新jar包

    在企业级应用中,数据的实时性和准确性是至关重要的,因此,Solr提供了数据导入工具(DataImportHandler, DIH)来帮助用户从关系型数据库或其他数据源进行数据导入,并支持增量更新。"solr 定时增量更新jar包"便是为了...

    solr4.9开发所需jar包

    在Solr4.9中,DIH可以帮助开发者轻松地将大量数据导入到Solr中进行搜索,这对于需要实时或定期更新索引的应用来说尤其重要。 在开发Solr4.9时,开发者需要了解以下关键知识点: 1. **Solr核心概念**:如集合...

    solr定时同步jar包.zip

    总的来说,"solr定时同步jar包.zip"是一个强大的工具,它整合了Solr的DIH功能,提供了定时同步和安全验证,适用于需要定期更新索引的Solr应用。无论你是Solr的新手还是经验丰富的开发者,这个jar包都能帮助你更高效...

    solr-dataimportscheduler-1.4.jar 增量定时同步数据到solr.rar

    这个jar包的核心功能是DataImportHandler(DIH),它是一个内置在Solr中的模块,用于将外部数据源(如关系型数据库)的数据导入到Solr索引中。DIH支持全量导入和增量导入,这使得Solr可以保持与数据库的实时同步,...

    solr入门教程

    总之,Solr是一个强大的搜索引擎,通过上述步骤,你已成功设置了基础环境,能够对数据库进行全文检索和增量索引。这仅仅是Solr功能的冰山一角,更深入的使用包括设置复杂的查询过滤器、优化索引性能、实现多语言支持...

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将其转化为Solr可以处理的索引格式。 数据导入调度器(Data Import Scheduler)是DIH的一个...

    跟益达学Solr5之从MySQL数据库导入数据并索引

    DIH支持增量更新和全量导入,确保数据库中的数据变化能实时反映到Solr索引中。 - **连接配置**:配置DIH时,需要设置MySQL的JDBC连接信息,包括URL、用户名、密码和驱动类名。 - **数据源配置**:定义要导入的...

    使用MySQL作为SOLR的索引源

    4. **触发索引更新**:可以通过SOLR的API或Web界面来触发全量或增量数据导入,使SOLR根据MySQL中的最新数据更新索引。 接下来,我们关注到`schema.xml`文件。这是SOLR的核心配置文件,定义了索引的字段类型和字段。...

Global site tag (gtag.js) - Google Analytics