solr的全量,增量导入。以及嵌套的增量导入

427 阅读1分钟

笔者是一个写文章较少的人且不喜欢废话的人,如果表述不对,还请见谅

正文

与全量、增量相关的关键属性 query deltaQuery deltaImportQuery

query 全量查询
deltaQuery 与 deltaImportQuery 配合用于增量查询

先说一下场景,我想要导入订单以及订单明细(这里的表字段都是虚构的,只是为了让大家能够看的更清楚),那么此时,我就会使用嵌套实体来进行导入,这里我就不写出具体的数据库配置了,实体配置如下:

<entity name="order" pk="id" dataSource="这里写自己的数据源名称" transformer="ClobTransformer" processor="SqlEntityProcessor"
query="select orderSerialNumber AS 'id', * from T_order"
deltaQuery="select orderSerialNumber AS 'id' from T_order where last_date &gt; '${dataimporter.last_index_time}'"
deltaImportQuery="select orderSerialNumber AS 'id',* from T_order where orderSerialNumber = '${dataimporter.delta.id}'">
   <field column="id" name="id" />
   <field column="name" name="name" /> <!-- 订单名称 -->
   <field column="code" name="code" /> <!-- 订单编号 -->
   <field column="last_date" name="last_date" /> <!-- 最后一次更新时间 -->
   
   <entity name="orderInfo" child="true" pk="id" 
   query="select 'Info'+orderSerialNumber AS 'id',* from T_order_info where orderSerialNumber = '${order.id}'">
   </entity>
</entity>

以上配置就可以实现全量与增量导入,下面来解释一些字段的含义:

- query 
查询。作用是全量导入时执行

- deltaQuery 
增量查询。作用是在增量查询时查询该表的id字段,注意,一定是id字段,因为在增量查询时会使用这个id字段来进行查询。

- deltaImportQuery 
增量导入查询。在增量查询时,如果我们没有配置这个字段,那么solr会在内部使用deltaQuery字段来拼接一个sql来查询,我们这里写了这个字段是因为solr自动拼接的Sql会有问题。按照order实体的deltaQuery,solr会拼接一个SQL为:select orderSerialNumber AS 'id' from T_order where id = 【id】,这里的【id】solr会自动替换成查询出来的id,那么我们表里是不存在id字段的,此时就会报错。为了解决这个情况,就是使用deltaImportQuery来覆盖solr自动生成的SQL查询。

- &gt; 
这是表示大于符号,跟mybatis里一样,在xml中使用><(大于小于)可能会出问题,为了避免就是用转义符

- ${dataimporter.last_index_time} 
这个表示上一次导入的时间,solr会在导入数据之后,把导入时间存入到conf/dataimport.properties里。

- ${dataimporter.delta.id}
这个是增量导入时,获取查询出来的id值,这个在[solr官方文档](https://solr.apache.org/guide/6_6/uploading-structured-data-store-data-with-the-data-import-handler.html#the-sql-entity-processor)上有提及,主要内容是 
There is a namespace `${dataimporter.delta.<column-name>}which can be used in this query. For example, `select * from tbl where id=${dataimporter.delta.id}`
也就是说使用这个语法可以获取到对应字段的值

- child="true"
使用这个在子实体,会使查询的数据变成嵌套数据。
子实体的配置只需要配置一个query就可以了

后台java类导入是不能使用增量导入的,solr官方文档上说明了增量导入只支持SQL导入

以上就是所有分享,如果有疑问和意见可以在评论区给笔者提出