solr全量更新和增量更新,定时增量更新详解

前言:我使用的是solr7.7.2,这篇博客的内容是我看到网上其他人的文章和自己的多次试验的总结和见解,内容都比较通俗易懂,同时也有太多不足之处,希望大佬看到可以指出

一、全量更新

(1)什么是全量更新?

将数据库的数据导入到solr,就是数据更新,有两种更新方式,一种是全量更新,一种是增量更新。全量更新,顾名思义,即对solr中缓存的数据全部进行更新,对索引全部进行删除,重新创建,重新分词。
这里就不细讲了,如果你的数据可以成功导入到solr,那么这就是全量更新。

(2)全量更新的配置

【1】核心目录下创建一个data-config.xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
	<dataSource
		type="JdbcDataSource"
		driver="com.mysql.jdbc.Driver"
		url="jdbc:mysql://127.0.0.1:3306/txws?useSSL=true"
		user= "root"
		password="1234"/> 
	<document>
		<entity name="product"
				query="select
					p.id,p.name,p.price,m.name merchant,c2.shortname province,c1.shortname city
					from 
					merchant m
					left join product p on m.id=p.merchant_id
					left join city c1 on m.city_id=c1.id
					left join city c2 on c1.pid=c2.id"
		>				
			<field column="id" name="id"/>
			<field column="name" name="name"/>
			<field column="price" name="price"/>
			<field column="merchant" name="merchant"/>
			<field column="province" name="province"/>
			<field column="city" name="city"/>			
		</entity>
	</document>
</dataConfig>

name是核心名
query里面的查询语句将查询到的数据导入到solr,只对全量更新有影响。

【2】核心的conf文件夹下的solrconfig.xml文件,在第一个requestHandler标签上面添加:

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

【3】核心的conf文件夹下的managed-schema文件,在第一个field标签上面添加:

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

【4】到solr后台管理页面,选择全量更新的选项,点击Execute

在这里插入图片描述

二、增量更新

(1)什么是增量更新?

增量更新,只更新导入solr的数据中,已经被数据库删除、修改、添加的数据,不会去动其他没有变化的数据。比如我在数据库中添加了一条数据,你在全量更新数据的时候,solr会全部替换原来的数据,而使用增量更新,solr仅仅是为一条新增的数据做了处理。

(2)为什么需要增量更新?

这个其实非常好理解,我们并非对数据库中数据全部增删改的时候,就没必要使用全量更新,这会使我们更新数据的效率变得非常低下。

(3)增量更新的配置

【1】首先要弄懂几个必要的属性,以及数据库建表事项,和dataimporter.properties 、data-config.xml里面的数据
query:查询数据库表符合记录数据
deltaQuery:增量索引查询主键ID —> 注意这个只能返回ID字段
deltaImportQuery:增量索引查询导入数据
deletedPkQuery:增量索引删除主键ID查询 —> 注意这个只能返回ID字段

【2】数据库配置注意事项
1.如果只涉及添加,与修改业务,那么数据库里只需额外有一个字段update_time
就可以了,类型为timpstamp
2.如果还涉及删除业务,那么数据里就需额外再多添加一个字段isdelete,int类型的
用0,1来标识,此条记录是否被删除
3.dataimporter.properties
这个配置文件很重要,它是用来记录当前时间与上一次修改时间的,通过它能够找出,那些,新添加的,修改的,或删除的记录标识,此条记录是否被删除的记录

在这里插入图片描述
4.这里这个文件的时间,和MySQL一样,涉及了一个时区问题,差八个小时,不懂时区问题的请自行百度。
【3】增量更新就是在全量更新的基础上加上一些配置,配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
	<dataSource
		type="JdbcDataSource"
		driver="com.mysql.jdbc.Driver"
		url="jdbc:mysql://127.0.0.1:3306/txws?useSSL=true"
		user= "root"
		password="1234"/> 
	<document>
		<entity pk="id" name="product"
				query="select
					p.id,p.name,p.price,m.name merchant,c2.shortname province,c1.shortname city
					from 
					merchant m
					left join product p on m.id=p.merchant_id
					left join city c1 on m.city_id=c1.id
					left join city c2 on c1.pid=c2.id where isdelete=0"
				deltaQuery="select id from product where update_date>'${dataimporter.last_index_time}+8' and isdelete=0"
				deletedPkQuery="select id from product where isdelete=1"
				deltaImportQuery = "select
					p.id,p.name,p.price,m.name merchant,c2.shortname province,c1.shortname city
					from 
					merchant m
					left join product p on m.id=p.merchant_id
					left join city c1 on m.city_id=c1.id
					left join city c2 on c1.pid=c2.id where p.id=${dih.delta.id}"
		>				
			<field column="id" name="id"/>
			<field column="name" name="name"/>
			<field column="price" name="price"/>
			<field column="merchant" name="merchant"/>
			<field column="province" name="province"/>
			<field column="city" name="city"/>			
		</entity>
	</document>
</dataConfig>

1、数据表不要忘记添加两个字段,这里我添加的字段是isdelete,update_date。
2、deltaQuery就是通过比较数据库和solr修改或插入数据的时间(左边update_data代表数据库的时间,右边代表solr的时间)找到你数据库的更新了的数据,+8表示加了八个小时,如果你的数据库没有更改过时区,那么你就不需要+8小时。
3、deletedPkQuery通过idelete=1的判断条件判断数据库中进行了逻辑删除的数据,拿到id。
4、deltaImportQuery 更加上面两个查询语句查到的id来更新数据,内容和query基本一致,只是多了一个id的筛选。
【4】管理界面手动增量更新
在这里插入图片描述

三、定时增量更新

(1)什么是定时增量更新?

定时增量更新就是给solr配置一个定时任务,每隔一定时间solr会通过增量的方式导入数据。

(2)定时增量更新的配置

【1】准备jar包apache-solr-dataimportscheduler.jar、solr-dataimporthandler-7.7.2.jar、solr-dataimporthandler-extras-7.7.2.jar到 solr 项目的\WEB-INF\lib 目录下
只有一个jar包需要下载,其他的在solr的dist文件夹下面,需要下载的jar我就借花献佛了:
apache-solr-dataimportscheduler 的下载地址 链接:https://pan.baidu.com/s/1h4hDmc2KWtO4VPMnDGXSCg 提取码:qi7n
【2】修改web.xml文件配置监听,在第一个servlet节点前增加:

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

【3】核心下面创建一个conf文件夹和dataimport.properties文件,注意路径、文件夹名、文件名必须是这些
在这里插入图片描述

【4】文件内容(根据自己情况配置):

#################################################
#                                              #
#      dataimport scheduler properties        #
#                                              #
#################################################
 
#  tosync or not to sync
#  1- active; anything else - inactive
# 这里的配置不用修改
syncEnabled=1
 
# which cores to schedule
#  ina 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=active
 
# solr server name or IP address
# [defaults to localhost if empty]
这个一般都是localhost不会变
server=localhost
 
# solr server port
# [defaults to 80 if empty]
#  安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了
port=8089
 
# application name/context
# [defaults to current ServletContextListener's context (app) name]
#  这里默认不改
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=1
 
#  重做索引的时间间隔,单位分钟,默认7200,即5天;
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200
 
#  重做索引的参数
reBuildIndexParams=/select?qt=/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就已经有了每分钟增量更新的效果了,可以自己数据库改条数据试试。还有要记得修改任何配置文件一定是重启solr才会生效,上面注意自己的SQL语句有没有问题,增量更新的SQL比全量更新的SQL多了一个id的判断,id不要忘记明确指定是哪张表的id。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中增量更新全量更新通常是指数据库中数据的更新增量更新是指只更新发生了改变的数据,而不是全部数据。实现方式可以通过在每个数据上添加时间戳或者版本号,当数据发生改变时,只更新时间戳或者版本号发生了改变的数据。 全量更新是指更新全部数据。实现方式可以通过将新数据和旧数据进行比较,然后将旧数据更新为新数据。 在Java中实现增量更新全量更新可以使用JDBC或者ORM框架(如Hibernate)来操作数据库。下面是一个使用JDBC实现增量更新的示例代码: ```java Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement("UPDATE table SET column = ? WHERE id = ?"); pstmt.setString(1, "new value"); pstmt.setInt(2, 1); int rows = pstmt.executeUpdate(); ``` 下面是一个使用JDBC实现全量更新的示例代码: ```java Connection conn = DriverManager.getConnection(url, username, password); PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM table WHERE id = ?"); pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { // get old data int oldColumnValue = rs.getInt("column"); // get new data int newColumnValue = 2; // update data PreparedStatement updatePstmt = conn.prepareStatement("UPDATE table SET column = ? WHERE id = ?"); updatePstmt.setInt(1, newColumnValue); updatePstmt.setInt(2, 1); int rows = updatePstmt.executeUpdate(); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值