Solr 全量更新和增量更新 配置方式

一、编写目的

于2018/03/28解决了一个关于Solr更新索引[全量|增量]的问题,期间反复揣摩和尝试,最后形成一套解决思路和理解,特此将其记录下来,以方便后来进行翻阅、查看和配置。

二、功能背景

DIH(DataImportHandler-DIH) 是solr 提供的一种针对数据库、xml/HTTP、富文本对象导入到solr 索引库的工具包。

基于项目的特殊性,本项目将所有的文本类型记录的表全部读取进入Solr进行管理,但因文本记录的表比较多和复杂,导致了后面在使用solr自带功能增量更新时出现了问题。

问题情况如下:

2.1.多表之间区分唯一ID的方式与Solr所要求的必须存在的ID属性有冲突,原使用的是UUID作为SOLR识别的ID;

2.2.应数据库特点,系统使用的ORACLE,在配置增量时,筛选大于Solr时间戳的记录时,数据格式转换异常;

2.3.增量删除,删除数据标识应用问题。

三、配置内容

3.1. data-config.xml中必要属性的设置:

3.1.1. transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签;

3.1.2. query:查询数据库表符合记录数据,全量更新使用频率高;

3.1.3. deltaQuery:增量索引查询主键ID ,这个只能返回ID字段;

3.1.4. deltaImportQuery:增量索引查询导入的数据;

3.1.5. deletedPkQuery:增量索引删除主键ID查询,只能返回ID字段 ;

3.2. 执行步骤

当将所有的属性都配置之后,其执行顺序如下:

3.2.1. query 指定的SQL语句查询出当前Entity所有符合条件的记录。该配置在使用全量更新full-import显得尤为的突出;

3.2.2. deltaQuery 指定的Sql语句查询当前Entity所有需要增量导入的PK;

3.2.3. deletedPkQuery 指定的Sql语句查询当前Entity所有被删除的PK;

3.2.4. deltaImportQuery 指定的Sql语句将返回这次增量导入所有处理的数据PK。

3.3. 核心配置内容【亲测可用】

data-config.xml

<entity name="BS_TEACHERS" pk="ID"  dataSource="source" 

query="select uuid uuid,solr_uptime solr_uptime,'BS_TEACHERS'||UUID as ID,'数据' type,'BS_TEACHERS' modules,'双创导师' modulesName,'导师:'||NAME title,NAME||' '|| ADDRESS||' '||WORK||' '|| PROFESSIONAL||' '|| EDUCATION  text,'/' url from BS_TEACHERS where STATUS=1 AND DEL_FLAG='0'" 

deltaQuery="select 'BS_TEACHERS'||UUID ID from BS_TEACHERS where STATUS=1 AND DEL_FLAG='0' and solr_uptime>TO_DATE('${dih.last_index_time}', 'yyyy-mm-dd hh24:mi:ss')" 

deletedPkQuery="select 'BS_TEACHERS'||UUID ID from BS_TEACHERS where DEL_FLAG='1'"

deltaImportQuery="select uuid uuid,solr_uptime solr_uptime,'BS_TEACHERS'||UUID  ID,'数据' type,'BS_TEACHERS' modules,'双创导师' modulesName,'导师:'||NAME title,NAME||' '|| ADDRESS||' '||WORK||' '|| PROFESSIONAL||' '|| EDUCATION  text,'/' url from BS_TEACHERS where STATUS=1 AND DEL_FLAG='0' and 'BS_TEACHERS'||UUID= '${dih.delta.ID}'" 

transformer="ClobTransformer" 
>
    <field column="ID" name="ID" />
        	<field column="title" name="title" />
      	<field column="type" name="type" />
    <field column="modules" name="modules" />
		<field column="modulesName" name="modulesName" />
     	<field column="TEXT" name="TEXT" clob="true"/>  
       <field column="uuid" name="uuid"/>   
		<field column="url" name="url"/> 
		<field column="solr_uptime" name="solr_uptime"/> 
    </entity> 

3.4.配置解述

一般全量更新只需要配置query属性即可,也就是在Solr客户端中全量更新内容索引,但是使用这种方式并不环保和节约,这将使用大量数据库的资源。当文本内容数据量大时,严重将导致数据库崩溃。所以就引发我们后面的增量更新的概念,也就是当数据库增加/修改/删除记录时,只会更新该记录所对应的Solr索引。这就需要配置deltaQuery、deletedPkQuery、deltaImportQuery 属性以达到增量的目的;

deltaQuery 指定的sql要求我们将记录修改时间大于Solr时间戳记录的ID查询全部查询出来,也就构成了所有满足条件的记录;

deletedPkQuery 指定的sql要求我们将已经删除的数据记录的PK查询出来,该PK需约定;

deltaImportQuery 指定的sql要求我们将满足PK的数据进行填充,需要配置在FieId中出现的属性,其作用和query类似,只不过该作用是将前面两个deltaQuery、deletedPkQuery过滤后进行了一次封装,以更新部分需更新的记录所对应的Solr的数据库索引。

因为数据记录中是文章内容的html,所以需使用transformer,以达到过滤掉html标签的目的,除此之外,因为该属性是大文本类型,在fieId属性下也需要加上clob="true"。

四、配置测试地址

http://[solr_server:port]/solr/index.html#/rcsc_core/dataimport//dataimport

http://[solr_server:port]/solr/index.html#/rcsc_core/query

http://[solr_server:port]/solr/rcsc_core/dataimport?command=delta-import&clean=false&commit=ture

五、后期操作

自此以上部分增量配置完成,但是这些过程是需要手动执行增量的,这需要我们将其配置于web环境中,以达到自动增量的目的,无需人工插足。

5.1. 配置包

solr-dataimporthandler-6.6.3.jar

solr-dataimporthandler-extras-6.6.3.jar

apache-solr-dataimportscheduler-1.1.jar(增量导入使用)

百度云链接:https://pan.baidu.com/s/134_uhjrxVONSAub4pDGDHw 提取码:7gyw

5.2.监听配置文件

#  同步或不同步。
#  1 -活跃;别的,不活跃的
syncEnabled=1

# 核心的时间表
#  在多核环境中,您可以决定要将哪些内核同步化
#  如果使用单内核部署,则需要对其进行注释。
#game,resource 因为我的是single-core,所以注释掉了,默认就是collection1  
syncCores=rcsc_core
  
#  服务器名称或IP地址。
#  [本地主机默认为空]
server=localhost
  
#  solr 服务接口
#  [本地主机默认为80]
port=8007
  
#  工程上下文环境
#  [默认为当前ServletContextListener的上下文(app)名称]
webapp=solr
  
#  URL参数(强制)
#  URL的剩余部分
#  增量更新的请求参数  
params=/dataimport?command=delta-import&clean=false&commit=ture
  
#  安排时间间隔  
# 两次运行之间的分钟数
#  [默认为30,如果为空]
#  这里配置的是2min一次  
interval=2
  
#  重做索引的时间间隔,单位分钟,默认7200,即5天;   7200
#  为空,为0,或者注释掉:表示永不重做索引  
reBuildIndexInterval=7200
  
#  重做索引的参数  
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
  
#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期  
reBuildIndexBeginTime=03:10:00

将其配置放于solr_home/conf 中(需建立空文件夹conf保存)

5.3.添加监听配置

在web.xml中添加监听模块

org.apache.solr.handler.dataimport.scheduler.ApplicationListener

5.4.问题汇总

在配置完成之后可能会提示 已经为"entity"指定属性"transformer" 的问题,解决方案就是将之前在entity配置的 transformer="ClobTransformer" 删除。

六、参考资料

http://www.aboutyun.com/thread-10496-1-1.html 配置技巧启蒙 【老版本Solr】

https://www.solr.cc/blog/?p=260 Solr中国网【官方】

新浪博客 deletedPkQuery增量删除

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值