三、Solr 导入Sql Server 数据(增量导入)

关于数据导入,这些概念确实不好理解,需要大量的自测与理解,目前没有发现讲解的比较全面的视频或教程,以下内容是自己收集摸索出来的

测试数据

       如果要使用增量导入,前提是你的表必需有两个字段,一个是删除标志字段即逻辑删除标志:is_del,另一个则是数据创建时间字段:create_time,字段名称不一定非得是is_del和create_time,但必须要包含两个表示该含义的字段。根据数据创建时间跟上一次增量导入操作时间一对比,就可以通过SQL语句查询出需要增量导入的数据,根据is_del字段可以查询出被标记为删除的数据,这些数据的ID主键需要传递给solr,这样solr就能同步删除索引中相关Document,实现数据增量更新。如果你数据表里的数据都是物理删除,没有逻辑标志字段的话,那么找出已删除的数据显得比较困难,所以这就是需要逻辑删除标志字段的原因。

CREATE TABLE [dbo].[product](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[product_name] [varchar](50) NULL,
	[product_price] [numeric](18, 2) NULL,
	[product_spec] [varchar](50) NULL,
	[is_del] [int] NULL,
	[create_time] [varchar](19) NULL,
	[update_time] [varchar](19) NULL,
 CONSTRAINT [PK_product] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]





insert into product(product_name,product_price,product_spec,is_del,create_time) values('黄瓜',3.27,'公斤',0,CONVERT(varchar(19),GETDATE(),120));
insert into product(product_name,product_price,product_spec,is_del,create_time) values('茄子',1.36,'公斤',0,CONVERT(varchar(19),GETDATE(),120));
insert into product(product_name,product_price,product_spec,is_del,create_time) values('豆角',0.59,'公斤',0,CONVERT(varchar(19),GETDATE(),120));

 

一、导入类型

 full-import  全量导入数据

delta-import 增量导入数据

二、配置文件说明

 配置 data-config.xml 的 entity 中的的SQL语句,实现增量更新。

query : 查询数据库符合记录的数据
        用于指定全量导入时需要的sql语句,比如select * from xxx where is_dek=0,查询返回的是未被删除的所有有效数据,这个query参数只对全量导入(full-import)有效,对增量导入无效.

deltaQuery : 增量索引查询主键ID(注意这个只返回 PK 字段)
             查询需要增量导入的记录的主键id所需的sql语句。
			 可能是update,insert,delete等操作,比如:deltaQuery="select id from xxx where update_time > '${dataimporter.last_index_time}'",此参数值对增量导入有效
			 ${dataimporter.last_index_time}取自于dataimport.properties文件和data-config.xml,每次执行完更新后,自动更新此文件

deltaImportQuery: 增量按索引查询(deltaQuery的结果)导入数据
             select * from xxx where id='${dataimporter.delta.id}'",利用deltaQuery参数返回的所有需要增量导入的数据主键id,
			 遍历每个主键id,然后循环执行deltaImportQuery参数表示的sql语句返回所有需要增量导入的数据。
			 其中变量${dataimporter.delta.id}用于获取deltaQuery返回的每个主键id

deletedPkQuery: 增量索引删除主键ID(注意这个只返回 PK 字段)
                查询已经被逻辑删除了的数据所需的SQL语句,所以这里你需要一个类似is_del的逻辑删除标志位字段。
				solr通过此参数表示的sql语句执行后返回的结果集(pk)来删除索引里面对应的数据。
				使用示例:select id from xxx where is_del=1,此参数对增量导入有效。


parentDeltaQuery:  获取父Entity的pk的SQL,一般只有Entity嵌套时使用(建议通过上面query SQL的联合查询,一般可以不用使用嵌套)

三、全量更新 

先测试个全量更新,在data-config.xml中增加了一个实体,修改完成后,要重启
    <entity name="product" pk="id"
        query="select * from product where id = 0" >
        <field column="id" name="id"/>
        <field column="product_name" name="productName"/>
        <field column="product_price" name="productPrice"/>
        <field column="product_spec" name="productSpec"/>
        <field column="is_del" name="isDel"/>
        <field column="create_time" name="createTime"/>
        <field column="update_time" name="updateTime"/>
    </entity>



managed-schema 增加字段映射 create_time update_time id 字段,都有了,所以就不用添加了,要是加重了会报错
 <field name="productName" type="string" indexed="true" stored="true"/>
 <field name="productPrice" type="pdouble" indexed="true" stored="true"/>
 <field name="productSpec" type="string" indexed="true" stored="true"/>
 <field name="isDel" type="pint" indexed="true" stored="true"/>

选择product这个实体,结果没有数据是因为product query的条件问题。可以改下where id = 30 这个条件看效果

全量导入时,Clean选项要注意下,

1.条件改为 where id = 0 ,那么全量就导入了3条  

2.条件改为 where id = 30 ,就没有符合的数据了,如果不选择Clean那么执行后,虽然没有导入数据,但是旧数据是在的,要是选择了Clean那么会把查询记录集结果中不存在的数据给删除掉。

四、增量更新

 4.1.数据库配置注意事项
      4.1.1如果只涉及添加,与修改业务,那么数据库里只需额外有一个timpstamp字段就可以了,默认值为当前系统时间,CURRENT_TIMESTAMP
      4.1.2.如果还涉及删除业务,那么数据里就需额外再多添加一个字段isdelete,int类型的用0,1来标识,此条记录是否被删除

4.2.dataimporter.properties 配置文件
      4.2.1 这个配置文件很重要,它是用来记录当前时间与上一次修改时间的,通过它能够找出,那些,新添加的,修改的,或删除的记录标识,此条记录是否被删除的记录

     4.2.2这里要注意时区的问题,需要修改bin下的solr.in.sh文件,在最后增加 SOLR_TIMEZONE="Asia/Shanghai" 否则,会差8个小时,这里使用的是默认的jetty,如果用tomcat修改的地方不一样。

     4.2.3发现linux的时间和实际时间差几分钟,那么我们可以先同步下时间

          yum install ntpdate -y   安装ntpdate

          ntpdate 0.asia.pool.ntp.org   手动同步时间

     4.2.3增量更新就是在全量更新的基础上加上一些配置,配置如下

<entity name="product" pk="id"
        query="select * from product where is_del = 0"
        deltaQuery = "SELECT id FROM product where update_time> '${dataimporter.last_index_time}' and is_del = '0'"
        deltaImportQuery = "SELECT * FROM product where id = '${dataimporter.delta.id}'"
        deletedPkQuery = "SELECT id FROM product  where is_del  = 1" >

        <field column="id" name="id"/>
        <field column="product_name" name="productName"/>
        <field column="product_price" name="productPrice"/>
        <field column="product_spec" name="productSpec"/>
        <field column="is_del" name="isDel"/>
        <field column="create_time" name="createTime"/>
        <field column="update_time" name="updateTime"/>
    </entity>

通过修改数据库的update_time字段,就可以实现手动同步了

 

 最后在推荐一篇博文,写的也是比较详细的:https://www.cnblogs.com/lin-mumu/p/11015028.html

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值