增量导入数据——DeltaImport

在之前《DIH——QuickStart》中,用的是full-import,也就是将数据库表中所有的数据到导入solr中,但是在数据量很大的时候这种方式导入数据就会很慢,尤其是在新增的数据相对于原来的数据来说很少的时候。Solr提供了一种增量导入数据的方式——DeltaImport,现在来学习一下怎么样实现增量导入。
  
  在数据库表中增加一列last_modified(timestamp类型),用来记录数据添加/更新时间:

在数据库表中新增一列

然后再在数据库中增加两条数据:
  


修改data-config.xml


  
  
    
    
  

然后在solr admin界面中,执行Dataimport->delta-import就可以了,这里不要选择clean,否则之前的索引都会被删除:

增量导入数据——DeltaImport_第1张图片
执行delta-import

从右边的状态可以看到成功添加了两个文档,再查询中就可以看到新加的两行内容了:
  


增量导入数据——DeltaImport_第2张图片
查询到新内容

Delta-import步骤:

首先按照query指定的语句查询出符合条件的记录。
  然后从这些数据中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。
  根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即本次增量导入要处理得数据。

在conf文件夹下有个dataimport.properties文件,用来记录每个表(entity)索引最后更新的时间。

person.last_index_time=2016-08-10 01:44:33
item.last_index_time=2016-08-11 05:33:11
last_index_time=2016-08-11 07:16:11
news.last_index_time=2016-08-11 07:16:11

在full-import或者delta-import之后,就会更新这个文件里面的值。执行delta-import的时候,通过内置变量${dih.last_index_time}获得这个文件中的最近一次索引的时间,与相应表中的last_modified列作比较,如果在last_index_time之后的行,就导入。

Solr时区问题:

Solr默认采用的是协调世界时UTC,而数据库中的是本地时间(UTC+8),如果这两个时间表示方式不一致的话会导致增量导入的数据错误.
  在solr.in.sh中修改solr_timezone为“Asia/Shanghai”或者"UTC+8"好像不起作用,所以只能采用下面的方法:
  因为中国时区比UTC多八个小时,所以可以在deltaQuery的时候给last_index_time加上8:

  deltaQuery="select id from news where last_modified >'${dih.last_index_time}+8'"

参考资料:
[1] https://wiki.apache.org/solr/DataImportHandler
[2] http://www.aboutyun.com/thread-10496-1-1.html

你可能感兴趣的:(增量导入数据——DeltaImport)