solr 连接mysql库 自动更新索引

上期我们探讨了solr的入门,以及使用solr可视化界面进行索引操作的流程,可视化界面上对索引的操作其实就是通过接口,但是日常项目应用中不会一条条的通过接口插入索引。这期我们来探讨下solr连接mysql数据库,通过配置文件来实现批量导入索引,导入索引以后通过solr自带的定时任务自动更新索引。

数据准备

新建数据库表

mysql库中新建一个student表做为solr数据来源,除了正常的数据字段以外,还需要有2个特殊字段,用来做为solr自动更新索引时的标识使用。
在这里插入图片描述

  • isdelete 逻辑删除字段,默认0,0 否 1 是
  • updatetime 数据更新时间,默认CURRENT_TIMESTAMP,根据当前时间戳更新。

插入表数据

通过创建存储过程来给新表插入数据。存储过程如下:

#删除已有同名存储过程
DROP PROCEDURE IF EXISTS zqtest;
#创建存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `zqtest`()
begin
declare i int default 0;
set i=0;
start transaction;
while i<20 do
 INSERT INTO `student`(`id`, `name`, `age`,`isdelete`) VALUES (uuid(),CONCAT('name',i),20+i,0); 
set i=i+1;
end while;
commit;
end
#执行存储过程
call zqtest();
#去除uuid生成数据中的-
update student set id = replace(id,'-','');
commit;

批量插入

放入相关架包

架包下载地址:https://pan.baidu.com/s/1E6I963HtoKF4oUrJOCdxLw提取码bjps

批量导入相关架包

  • solr-dataimporthandler-7.5.0.jar
  • solr-dataimporthandler-extras-7.5.0.jar

mysql驱动架包

  • mysql-connector-java-5.1.13.jar

把架包放到solr-7.7.3\server\solr-webapp\webapp\WEB-INF\lib中。

设置批量插入配置文件调用

solr-7.7.3\server\solr\new_core\conf\solrconfig.xml中新增批量插入配置文件data-config.xml的调用

<requestHandler name="/dataimport" class="solr.DataImportHandler">
  <lst name="defaults">
    <str name="config">data-config.xml</str>
  </lst>
</requestHandler>

新增批量插入配置文件

solr-7.7.3\server\solr\new_core\conf中新增批量插入配置文件data-config.xml,配置信息如下:

<dataConfig> 
	<dataSource type="JdbcDataSource" 
              driver="com.mysql.jdbc.Driver"
              url="jdbc:mysql://ip:端口/数据库别名?characterEncoding=UTF-8" 
              user="用户名" 
              password="密码"/>
	<document> <!--指定需要导入的数据库表名,以及数据 --> 
		<entity name="demo_sql" pk="id"
            query="select s.id,s.name,s.age from student s"
            >
		<field column="id" name="id"/>
		<field column="name" name="name"/>
		<field column="age" name="age"/>
		</entity> 
	</document> 
</dataConfig>
  • dataSource 数据库连接信息
  • document 批量插入语句以及字段对应关系配置
  • document entity name 批量插入语句别名
  • document entity pk 主键字段,同managed-schema中设置的主键
  • document entity query 批量插入语句
  • field column 批量插入语句中的字段别名
  • field name managed-schema中字段别名

批量插入数据

配置完成以后,重启solr,进入solr可视化界面。
在这里插入图片描述
进入Dataimport菜单,选择批量插入语句别名,点击Execute执行批量导入操作。Auto-Refresh Status为是否自动更新状态,如果勾选后,会在右侧页面中实时显示语句执行情况。如果不勾选,需要手动点击Refresh Status刷新执行情况。执行完成后,数据导入成功,会有如下提示:
在这里插入图片描述

自动更新索引

放入相关架包

自动更新索引相关架包

  • solr-dataimportscheduler-1.1.jar

设置自动更新索引的监听

solr-7.7.3\server\solr-webapp\webapp\WEB-INF\web.xml中新增如下监听:

<listener>
  <listener-class>
    org.apache.solr.handler.dataimport.scheduler.ApplicationListener
  </listener-class>
</listener>

设置自动更新索引相关的语句

在配置批量导入索引的配置文件中(solr-7.7.3\server\solr\new_core\conf\data-config.xml),新增如下设置:

deltaQuery="select s.id from student s where s.updateTime > '${dataimporter.last_index_time}'"
deletedPkQuery="select s.id from student s where s.isdelete = '1'"
deltaImportQuery="select s.id,s.name,s.age from student s where s.id='${dih.delta.uuid}'"

整体配置如下:

<dataConfig> 
	<dataSource type="JdbcDataSource" 
		      driver="com.mysql.jdbc.Driver"
		      url="jdbc:mysql://ip:端口/数据库别名?characterEncoding=UTF-8" 
		      user="用户名" 
		      password="密码"/>
	<document> <!--指定需要导入的数据库表名,以及数据 --> 
		<entity name="demo_sql" pk="id"
            query="select s.id,s.name,s.age from student s"
			deltaQuery="select s.id from student s where s.updateTime > '${dataimporter.last_index_time}'"
            deletedPkQuery="select s.id from student s where s.isdelete = '1'"
            deltaImportQuery="select s.id,s.name,s.age from student s where s.id='${dih.delta.id}'"
            >
		<field column="id" name="id"/>
		<field column="name" name="name"/>
		<field column="age" name="age"/>
		</entity> 
	</document> 
</dataConfig>
  • deltaQuery 通过更新时间查询在上次更新后出现数据更新的数据id,${dataimporter.last_index_time}为固定获取上次执行更新操作的时间。
  • deletedPkQuery 通过删除标识查询删除的数据
  • deltaImportQuery 通过deltaQuery查询出的id来查询出更新数据,${dih.delta.id}dih.delta为固定信息,后面的id是索引主键。

添加自动更新索引相关配置

solr-7.7.3\server\solr中新增conf文件夹,在conf文件夹中新建dataimport.properties配置文件。配置文件信息如下:

#################################################

#                                               #

#       dataimport scheduler properties         #

#                                               #

#################################################

 

#  to sync or not to sync

#  1 - active; anything else - inactive

# 这里的配置不用修改

syncEnabled=1

 

#  which cores to schedule

#  in a multi-core environment you can decide which cores you want syncronized

#  leave empty or comment it out if using single-core deployment

#  修改成你所使用的core,我这里是我自定义的core:simple

syncCores=new_core

 

#  solr server name or IP address

#  [defaults to localhost if empty]

#这个一般都是localhost不会变

server=localhost

 

#  solr server port

#  [defaults to 80 if empty]

#  安装solr的tomcat端口 或 solr访问端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了

port=8983

 

#  application name/context

#  [defaults to current ServletContextListener's context (app) name]

#  安装solr的tomcat项目名 或 solr访问项目名

webapp=solr

 

#  URL params [mandatory]

#  remainder of URL

#  这里改成下面的形式,solr同步数据时请求的链接

params=/dataimport?command=delta-import&clean=false&commit=true

 

#  schedule interval

#  number of minutes between two runs

#  [defaults to 30 if empty]

#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改

#  开始测试的时候为了方便看到效果,时间可以设置短一点

interval=3

 

#  重做索引的时间间隔,单位分钟,默认7200,即5天; 

#  为空,为0,或者注释掉:表示永不重做索引

reBuildIndexInterval=1440

 

#  重做索引的参数

reBuildIndexParams=/dataimport?&core=sx&indent=on&commit=true&name=dataimport&clean=true&wt=json&command=full-import

 

#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;

#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期

reBuildIndexBeginTime=02:10:00

自动更新索引测试

配置完成后,重启solr,按照配置文件我们稍等3分钟以后,在solr-7.7.3\server\solr\new_core\conf中会出现一个dataimport.properties配置文件,里面保存的就是自动更新执行的时间信息。

#Tue Jun 01 16:05:20 GMT+08:00 2021
demo_sql.last_index_time=2021-06-01 16\:05\:20
last_index_time=2021-06-01 16\:05\:20

插入索引

INSERT INTO `student`(`id`, `name`, `age`,`isdelete`) VALUES (uuid(),CONCAT('name30'),30,0); 
update student set id = replace(id,'-','');
commit;

在这里插入图片描述
插入一条新数据,等待下次自动更新,自动更新执行完成后,会发现索引已经自动新增。这是因为新插入的数据中updatetime在配置文件时间之前,触发了deltaQuery中的更新语句。
在这里插入图片描述

更新索引

update student s set s.name = 'name00' where s.id = '2f0f8c18c2b011ebaba2000c29c0dab7';

在这里插入图片描述
更新刚刚新增的数据,等待下次自动更新,自动更新执行完成后,会发现索引已经自动更新。这是因为新插入的数据中updatetime在配置文件时间之前,触发了deltaQuery中的更新语句。
在这里插入图片描述

删除索引

update student s set s.isdelete = '1' where s.id='2f0f8c18c2b011ebaba2000c29c0dab7';

在这里插入图片描述
更新刚刚新增的数据中的删除标识,等待下次自动更新,自动更新执行完成后,会发现索引已经自动删除。这是因为触发了deletedPkQuery中的更新语句。在这里插入图片描述
至此,solr自动更新索引已成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值