上期我们探讨了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自动更新索引已成功。