注:前提条件:solr版本:8.x
1、表结构新增字段【updateTime】用来增量更新的游标,也就是在原来的字段中增加一个更新时间戳的字段,solr利用这个字段来区分哪些数据是已经导入过的,哪些又是新的,同样在dataimport.properties配置文件里面就有对应的更新时间。
表结构:
-- solr测试表结构
CREATE TABLE solr_demo (
id int NOT NULL COMMENT '主键',
name varchar(64) NOT NULL COMMENT '学生姓名',
sex int default NULL COMMENT '性别 0=女 1=男',
address varchar(200) DEFAULT NULL COMMENT '居住地址',
updateTime timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'SOLR数据更新时间戳',
isDeleted int(1) DEFAULT 0 COMMENT '逻辑删除',
primary key (ID)
) COMMENT='solr_demo表';
-- 全量测试数据
INSERT INTO solr_demo VALUES (1, '张三', 0, '甘肃省兰州市城关区酒泉路211号', default, default);
INSERT INTO solr_demo VALUES (2, '李四', 1, '江西省泰和县中山路', default, default);
INSERT INTO solr_demo VALUES (3, '郭海藻', 0, '北京市朝阳区朝阳人民法院路355号', default, default);
INSERT INTO solr_demo VALUES (4, '唐三', 1, '斗罗大陆史莱克学院1号楼', default, default);
INSERT INTO solr_demo VALUES (5, '小舞', 1, '斗罗大陆史莱克学院22号楼', default, default);
INSERT INTO solr_demo VALUES (6, '萧炎', 1, '斗气大陆五大家族萧家门房', default, default);
INSERT INTO solr_demo VALUES (7, '哈登', 1, '美国火箭丰田球场', default, default);
-- 增量测试数据
INSERT INTO solr_demo VALUES (8, 'James', 0, '美国洛杉矶湖人队', default, default);
INSERT INTO solr_demo VALUES (9, 'McGrady', 0, '美国火箭丰田球场前排', default, default);
示例流程:首先全量导入1-7条记录,然后增量导入8-9条记录,用来模拟将来实际环境中的增量更新数据到solr,而且在实际使用过程中我们绝大部分需求会使用增量更新来减轻各方面的压力。
2、/solr-8.0.0/server/solr/demo_core/conf/data-config.xml配置增量更新
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source_demo"
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/hornet"
user="root"
password="123456"
batchSize="-1"/>
<document name="demo_doc">
<!-- 全量导入数据配置 -->
<!-- <entity name="solr_demo"
dataSource="source_demo"
pk="id"
query="select * from solr_demo">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="sex" name="sex"/>
<field column="address" name="address"/>
<field column="updateTime" name="updateTime"/>
<field column="isDeleted" name="isDeleted"/>
</entity> -->
<!-- 增量导入数据配置 -->
<!--
transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签
query:查询数据库表符合记录数据
deltaQuery:增量索引查询主键ID 注意这个只能返回ID字段
deltaImportQuery:增量索引查询导入的数据
deletedPkQuery:增量索引删除主键ID查询 注意这个只能返回ID字段
-->
<entity name="solr_demo"
dataSource="source_demo"
pk="id"
query="select * from solr_demo where 1=1 and isDeleted=0"
deltaImportQuery="select * from solr_demo where 1=1 and id='${dih.delta.id}'"
deltaQuery="select id from solr_demo where 1=1 and updateTime > '${dataimporter.last_index_time}' and isDeleted=0"
deletedPkQuery="select id from solr_demo where 1=1 and isDeleted=1">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="sex" name="sex"/>
<field column="address" name="address"/>
<field column="updateTime" name="updateTime"/>
<field column="isDeleted" name="isDeleted"/>
</entity>
</document>
</dataConfig>
isDeleted这个字段根据实际情况取舍,也就是指实际情况中数据的逻辑删除,在业务逻辑中删除,但是数据库中并未删除。
and isDeleted=?
3、/solr-8.0.0/server/solr/demo_core/conf/managed-schema更新字段的映射以及分词配置,重点是更新【updateTime】
<!-- 增量更新配置-->
<field name="updateTime" type="pdate" indexed="true" stored="true" />
<!-- <field name="isDeleted" type="string" indexed="true" stored="true" required="true" multiValued="false" /> -->
注:旧版本的type你可能在别的地方会看到设置为date,但实际上在这个版本需要设置为pdate,不然会报错。
4、正常重启solr或者reload进行验证,Dataimport导入类型需要选择delta-import
数据库1-7条数据:
solr全量导入1-7条数据:
数据库增加8-9条数据:
solr增量导入8-9条数据:
结论:1-7条是全量从mysql导入到solr中的,然后mysql新增8-9条数据,solr再使用delta-import增量导入8-9条数据。