在之前《DIH——QuickStart》中,用的是full-import,也就是将数据库表中所有的数据到导入solr中,但是在数据量很大的时候这种方式导入数据就会很慢,尤其是在新增的数据相对于原来的数据来说很少的时候。Solr提供了一种增量导入数据的方式——DeltaImport,现在来学习一下怎么样实现增量导入。
在数据库表中增加一列last_modified(timestamp类型),用来记录数据添加/更新时间:
然后再在数据库中增加两条数据:
修改data-config.xml
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
user=xxxx
password=xxxx/>
<document>
<entity name="news" pk="id"
query="select * from news"
deltaImportQuery="select * from news where id='${dih.delta.id}'"
deltaQuery="select id from news where last_modified > '${dih.last_index_time}'">
</entity>
</document>
</dataConfig>
然后在solr admin界面中,执行Dataimport->delta-import就可以了,这里不要选择clean,否则之前的索引都会被删除:
执行delta-import从右边的状态可以看到成功添加了两个文档,再查询中就可以看到新加的两行内容了:
查询到新内容
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
网友评论