- 浏览: 108778 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (66)
- oracle (6)
- struts2 ftl (3)
- spring (2)
- DOS (1)
- OSCache (2)
- exception (1)
- ant javamake 增量编译 (1)
- portal (2)
- hadoop (1)
- maven (1)
- 设计模式 (1)
- httpclient (2)
- 序列化:protobuff (2)
- nio (2)
- mysql (1)
- jenkins (1)
- win7 (1)
- jquery (1)
- 数据结构 (4)
- solr (7)
- 持续集成 (1)
- solr,监控 (0)
- solr,监控,ganglia (1)
- solr,监控,ganglia,jmxtrans (2)
- DIH (1)
- 增量索引 (1)
- mmseg4j (1)
- Concurrency (5)
- cache (1)
- database (1)
- 敏捷开发 (1)
- 架构,分层 (1)
- dubbo (2)
最新评论
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 > '${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 > '${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 > '${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 这个只是在根节点起作用
未完待续。。。。。
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 > '${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 > '${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 > '${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 这个只是在根节点起作用
未完待续。。。。。
发表评论
-
solr同义词的配置
2016-03-16 14:45 1881格式编码为UTF-8 注:如下是基于solr-5.3.1进行的 ... -
solr sharding策略
2016-03-16 14:38 1491solr中含有两种sharding策略,一种是默认的compo ... -
solr的原子更新
2016-03-16 14:35 1402solr的更新,目前网上基本流传了两个版本,一个是通过solr ... -
solr UTC时区的问题
2016-03-16 14:30 3099solr中默认获取的是Timezone是UTC或者GMT时间( ... -
中文分词mmseg4j+solr 5.3.1配置
2016-01-10 14:32 2228基础环境: solr 5.3.1 mmseg4j-solr-2 ... -
solr in Action全书翻译
2015-11-23 11:49 624给自己定个计划:目前在做搜索方面的项目,但是目前市面很少有关于 ...
相关推荐
增量索引则只对新插入、更新或删除的数据进行索引,显著提高了效率和性能。 要实现Solr对MySQL的增量索引,我们需要以下步骤: 1. **安装和配置Solr**: 首先,我们需要下载并安装Solr 5,然后根据项目需求配置...
Solr提供了一个名为DataImportHandler (DIH) 的组件,可以与数据库进行交互,读取这些变更并将其转化为Solr索引的更新。 - **Update Handler**:Solr提供了多种Update Handler,例如Direct Update Handler和...
Solr 数据库插入全量和增量索引 Solr 是一个基于 Lucene 的搜索引擎,可以快速高效地对大量数据进行索引和查询。在实际应用中,我们需要将数据插入 Solr 索引库中,以便实现高效的搜索功能。本文将详细介绍 Solr ...
1. DataImportHandler(DIH):Solr6使用DIH进行数据导入,它是Solr内置的一个处理程序,可以连接到各种数据源(如数据库),并将数据导入到Solr索引中。DIH支持增量导入,通过跟踪数据库的LastModified时间戳或者...
DataImportHandler(DIH)是一个强大的工具,允许Solr与各种数据源进行交互,将这些数据转换为Solr可以理解的格式,然后索引到Solr中。它支持全量导入和增量导入,全量导入是重新导入所有数据,而增量导入则只导入自...
Solr的定时索引分为增量索引和完整索引两种方式,每种都有其特定的应用场景和优势。 增量索引:增量索引是指只对自上次索引以来发生变化的数据进行索引更新。这种方式适用于数据频繁更新但整体变化不大的情况,可以...
在本例中,我们将探讨如何使用Solr 3.6版本的DIH组件来对MySQL数据库中的数据进行全文索引。 首先,我们需要做以下准备工作: 1. **下载程序包**:确保你已经下载了Solr 3.6的安装包,这通常包括Solr服务器、配置...
在本文中,我们将深入探讨如何使用Apache Solr 3.6的数据导入处理(DataImportHandler,简称DIH)组件从MySQL数据库中创建全文索引。Solr是一个强大的、开源的企业级搜索平台,而DIH是Solr的一个核心特性,允许用户...
增量更新是Solr的一个关键特性,它允许系统仅处理自上次完整索引以来发生更改的数据,从而提高了性能并降低了资源消耗。"apache-solr-dataimportscheduler.jar" 是一个专门为Solr设计的扩展包,用于实现自动化的数据...
它扩展了Solr的数据导入处理(DataImportHandler, DIH)功能,DIH是一个强大的工具,允许Solr从各种数据源(如关系型数据库、文件系统等)导入数据并建立索引。而DataImportScheduler则在此基础上增加了定时任务的功能...
4. 提交:在处理完一批增量数据后,Solr会进行提交操作,使索引变更对搜索可见。 5. 错误处理:配置适当的错误处理机制,如重试、日志记录等,以确保系统的健壮性。 综上所述,"solr增量更新jar包及配置文件"是Solr...
在企业级应用中,数据的实时性和准确性是至关重要的,因此,Solr提供了数据导入工具(DataImportHandler, DIH)来帮助用户从关系型数据库或其他数据源进行数据导入,并支持增量更新。"solr 定时增量更新jar包"便是为了...
在Solr4.9中,DIH可以帮助开发者轻松地将大量数据导入到Solr中进行搜索,这对于需要实时或定期更新索引的应用来说尤其重要。 在开发Solr4.9时,开发者需要了解以下关键知识点: 1. **Solr核心概念**:如集合...
总的来说,"solr定时同步jar包.zip"是一个强大的工具,它整合了Solr的DIH功能,提供了定时同步和安全验证,适用于需要定期更新索引的Solr应用。无论你是Solr的新手还是经验丰富的开发者,这个jar包都能帮助你更高效...
这个jar包的核心功能是DataImportHandler(DIH),它是一个内置在Solr中的模块,用于将外部数据源(如关系型数据库)的数据导入到Solr索引中。DIH支持全量导入和增量导入,这使得Solr可以保持与数据库的实时同步,...
总之,Solr是一个强大的搜索引擎,通过上述步骤,你已成功设置了基础环境,能够对数据库进行全文检索和增量索引。这仅仅是Solr功能的冰山一角,更深入的使用包括设置复杂的查询过滤器、优化索引性能、实现多语言支持...
为了保持索引与源数据的一致性,Solr引入了DIH,这是一个内建的机制,用于从关系数据库、XML文件等外部数据源导入数据,并将其转化为Solr可以处理的索引格式。 数据导入调度器(Data Import Scheduler)是DIH的一个...
DIH支持增量更新和全量导入,确保数据库中的数据变化能实时反映到Solr索引中。 - **连接配置**:配置DIH时,需要设置MySQL的JDBC连接信息,包括URL、用户名、密码和驱动类名。 - **数据源配置**:定义要导入的...
4. **触发索引更新**:可以通过SOLR的API或Web界面来触发全量或增量数据导入,使SOLR根据MySQL中的最新数据更新索引。 接下来,我们关注到`schema.xml`文件。这是SOLR的核心配置文件,定义了索引的字段类型和字段。...