1. 程式人生 > >Lucene 合併倒排表演算法之交集

Lucene 合併倒排表演算法之交集

      可能大家都知道,lucene採用了傳統搜尋引擎中倒排表的資料結構.在搜尋時,假設我們要查詢"+(a:test)+(b:test1)"的話,首先要先查詢得到a欄位中包含 test關鍵字的倒排表,然後查詢得到b欄位中包含test1關鍵字的倒排表,然後對兩個倒排表結構進行merge操作:計算兩者間的交集就是我們的查詢結果.

      當然這只是其中一個例子罷了.實際情況中,因為查詢條件不同和複雜性,我們可能會遇到更 多對倒排表的操作:交集,並集,差集等.本文主要講述lucene如何對交集進行處理:合併倒排表,生成SumScorer結果.

     第一步:過濾篩選:

     先對每個倒排表進行檢查:每個倒排表都是一個DocIdSetIterator,如果其中一個倒排表中list為空,則說明交集肯定為空,不需要進行接下來的工作:

 時間複雜度為O(N)常量級別

      第二步:對倒排表陣列進行排序:效果是倒排表陣列按照每個倒排表第一個docid進行升級排序:

 

     第三步:刪減無用docid:因為是對多個倒排表求交集,所以需要先篩選去掉倒排表中那些比較小的docid: