在之前《DIH——QuickStart》中褐荷,用的是full-import勾效,也就是將數(shù)據(jù)庫表中所有的數(shù)據(jù)到導(dǎo)入solr中,但是在數(shù)據(jù)量很大的時候這種方式導(dǎo)入數(shù)據(jù)就會很慢叛甫,尤其是在新增的數(shù)據(jù)相對于原來的數(shù)據(jù)來說很少的時候层宫。Solr提供了一種增量導(dǎo)入數(shù)據(jù)的方式——DeltaImport,現(xiàn)在來學(xué)習(xí)一下怎么樣實(shí)現(xiàn)增量導(dǎo)入合溺。
在數(shù)據(jù)庫表中增加一列l(wèi)ast_modified(timestamp類型)卒密,用來記錄數(shù)據(jù)添加/更新時間:
然后再在數(shù)據(jù)庫中增加兩條數(shù)據(jù):
修改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界面中缀台,執(zhí)行Dataimport->delta-import就可以了棠赛,這里不要選擇clean,否則之前的索引都會被刪除:
從右邊的狀態(tài)可以看到成功添加了兩個文檔膛腐,再查詢中就可以看到新加的兩行內(nèi)容了:
Delta-import步驟:
首先按照query指定的語句查詢出符合條件的記錄睛约。
然后從這些數(shù)據(jù)中根據(jù)deltaQuery指定的SQL語句查詢出所有需要增量導(dǎo)入的數(shù)據(jù)的ID號。
根據(jù)deltaImportQuery指定的SQL語句返回所有這些ID的數(shù)據(jù)哲身,即本次增量導(dǎo)入要處理得數(shù)據(jù)辩涝。
在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之后怔揩,就會更新這個文件里面的值。執(zhí)行delta-import的時候脯丝,通過內(nèi)置變量${dih.last_index_time}
獲得這個文件中的最近一次索引的時間商膊,與相應(yīng)表中的last_modified
列作比較,如果在last_index_time之后的行宠进,就導(dǎo)入晕拆。
Solr時區(qū)問題:
Solr默認(rèn)采用的是協(xié)調(diào)世界時UTC,而數(shù)據(jù)庫中的是本地時間(UTC+8)材蹬,如果這兩個時間表示方式不一致的話會導(dǎo)致增量導(dǎo)入的數(shù)據(jù)錯誤.
在solr.in.sh中修改solr_timezone為“Asia/Shanghai”或者"UTC+8"好像不起作用实幕,所以只能采用下面的方法:
因?yàn)橹袊鴷r區(qū)比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