sphinx增量索引教程(3)


本節說增量索引,

   首先我們要先做一個實時索引更新的功能,然后要把實時索引合並到主索引上面。

1.實時索引更新

  

有這么一種常見的情況:整個數據集非常大,以至於難於經常性的重建索引,但是每次新增的記錄卻相當地少。一個典型的例子是:一個論壇有1000000個已經歸檔的帖子,但每天只有1000個新帖子。

在這種情況下可以用所謂的“主索引+增量索引”(main+delta)模式來實現“近實時”的索引更新。

這種方法的基本思路是設置兩個數據源和兩個索引,對很少更新或根本不更新的數據建立主索引,而對新增文檔建立增量索引。在上述例子中,那1000000個已經歸檔的帖子放在主索引中,而每天新增的1000個帖子則放在增量索引中。增量索引更新的頻率可以非常快,而文檔可以在出現幾分種內就可以被檢索到。

確定具體某一文檔的分屬那個索引的分類工作可以自動完成。一個可選的方案是,建立一個計數表,記錄將文檔集分成兩部分的那個文檔ID,而每次重新構建主索引時,這個表都會被更新。

sphinx.conf 配置

# in MySQL
CREATE TABLE sph_counter
(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);

# in sphinx.conf
source main
{
# ...
sql_query_pre = SET NAMES utf8
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
sql_query = SELECT id, title, body FROM documents \
WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}

source delta : main
{
sql_query_pre = SET NAMES utf8
sql_query = SELECT id, title, body FROM documents \
WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )
}

index main
{
source = main
path = /path/to/main
# ... all the other settings
}

# note how all other settings are copied from main,
# but source and path are overridden (they MUST be)
index delta : main
{
source = delta
path = /path/to/delta
}

  請注意,上例中我們顯示設置了數據源delta的sql_query_pre選項,覆蓋了全局設置。必須顯示地覆蓋這個選項,否則對delta做索引的時候也會運行那條REPLACE查詢,那樣會導致delta源中選出的數據為空。可是簡單地將delta的sql_query_pre設置成空也不行,因為在繼承來的數據源上第一次運行這個指令的時候,繼承來的所有值都會被清空,這樣編碼設置的部分也會丟失。因此需要再次顯式調用編碼設置查詢。

2.索引合並

合並兩個已有的索引比重新對所有數據做索引更有效率,而且有時候必須這樣做(例如在“主索引+增量索引”分區模式中應合並主索引和增量索引,而不是簡單地重新索引“主索引對應的數據)。因此indexer有這個選項。合並索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合並的兩個索引都會被讀入內存一次,而合並后的內容需要寫入磁盤一次。例如,合並100GB和1GB的兩個索引將導致202GB的IO操作(但很可能還是比重新索引少)

基本的命令語法如下:

indexer --merge main delta

當searchd服務開啟的時候 使用上面的命令是會報錯的、所以在后面加上 --rotate 

indexer --merge main delta --rotate

  delta的內容被合並到main中,因此只有main索引會被改變。最初設計的使用模式是,將小量的更新從SRCINDEX合並到DSTINDEX中。 因此,當屬性被合並時,一旦出現了重復的文檔ID,SRCINDEX中的屬性值更優先(會覆蓋DSTINDEX中的值)。 不過要注意,“舊的”關鍵字在這個過程中並不會被自動刪除。 例如,在DSTINDEX中有一個叫做“old”的關鍵字與文檔123相關聯,而在SRCINDEX中則有關鍵字“new”與同一個文檔相關,那么在合並后用這兩個關鍵字都能找到文檔123。 您可以給出一個顯式條件來將文檔從DSTINDEX中移除,以便應對這種情況,相關的開關是–merge-dst-range:

indexer --merge main delta --merge-dst-range deleted 0 0

  這個開關允許您在合並過程中對目標索引實施過濾。過濾器可以有多個,只有滿足全部過濾條件的文檔才會在最終合並后的索引中出現。在上述例子中,過濾器只允許“deleted”為0的那些條件通過,而去除所有標記為已刪除(“deleted”)的記錄

去舊(強行更新): 情景描述:假設有一舊關鍵字“去釣魚”,與論壇貼子“周末的活動”相關聯,用“去釣魚”可以搜索到這篇帖子。之后樓主把貼子關鍵字部分改成了“去河邊釣魚”。如果用sphinx的indexer生成增量索引delta,然后用
indexer --merge main delta --rotate 

 合成到主索引main后。用“去河邊釣魚”搜不到結果,用“去釣魚”可以搜到“去河邊釣魚”的結果。

解決辦法:加--merge-killists option(選項)
indexer --merge main delta --rotate --merge-killists   

  


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com