一、编写目的
于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增量删除