sphinx中的索引合併merge二則問題 增量索引中去除舊文檔或合併過程中的過濾

通常我們需要做的合併sphinx索引時,需要考慮到使用‘過濾’和‘去舊’的方法,這二個方法在我們使用inderer索引命令時,通過--merge合併索引時,需要單獨增加其他參數來處理,具體可以看以下介紹:
 
過濾:
合併兩個已有的索引比重新對所有數據做索引更有效率,而且有時候必須這樣做(例如在“主索引+增量索引”分區模式中應合併主索引和增量索引,而不是簡單地重新索引“主索引對應的數據)。因此indexer有這個選項。合併索引一般比重新索引快,但在大型索引上仍然不是一蹴而就。基本上,待合併的兩個索引都會被讀入內存一次,而合併後的內容需要寫入磁盤一次。例如,合併100GB和1GB的兩個索引將導致202GB的IO操作(但很可能還是比重新索引少)
 
基本的命令語法如下:
indexer --merge DSTINDEX SRCINDEX [--rotate]
SRCINDEX的內容被合併到DSTINDEX中,因此只有DSTINDEX索引會被改變。若DSTINDEX已經被searchd用於提供服務,則--rotate參數是必須的。最初設計的使用模式是,將小量的更新從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”)的記錄(可以通過調用UpdateAttributes() 設置文檔的屬性)。
 
去舊(強行更新):
情景描述:假設有一舊關鍵字“去釣魚”,與論壇貼子“週末的活動”相關聯,用“去釣魚”可以搜索到這篇帖子。之後樓主把貼子關鍵字部分改成了“去河邊釣魚”。如果用sphinx的indexer生成增量索引bbsattend,然後用
indexer --merge bbs bbsattend --rotate
合成到主索引bbs後。用“去河邊釣魚”搜不到結果,用“去釣魚”可以搜到“去河邊釣魚”的結果。
解決辦法:加--merge-killists option(選項)
indexer --merge bbs bbsattend --rotate --merge-killists 


 
發佈了137 篇原創文章 · 獲贊 34 · 訪問量 175萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章