可能大家都知道,lucene採用了傳統搜尋引擎中倒排表的資料結構.在搜尋時,假設我們要查詢"+(a:test)+(b:test1)"的話,首先要先查詢得到a欄位中包含 test關鍵字的倒排表,然後查詢得到b欄位中包含test1關鍵字的倒排表,然後對兩個倒排表結構進行merge操作:計算兩者間的交集就是我們的查詢結果.
當然這只是其中乙個例子罷了.實際情況中,因為查詢條件不同和複雜性,我們可能會遇到更 多對倒排表的操作:交集,並集,差集等.本文主要講述lucene如何對交集進行處理:合併倒排表,生成sumscorer結果.
第一步:過濾篩選:
先對每個倒排表進行檢查:每個倒排表都是乙個docidsetiterator,如果其中乙個倒排表中list為空,則說明交集肯定為空,不需要進行接下來的工作:
時間複雜度為o(n)常量級別
第二步:對倒排表陣列進行排序:效果是倒排表陣列按照每個倒排表第乙個docid進行公升級排序:
第三步:刪減無用docid:因為是對多個倒排表求交集,所以需要先篩選去掉倒排表中那些比較小的docid:
多個MUST的倒排表合併
skiplist本質上是在有序的鍊錶上實現實現二分查詢,它能有效的提公升鍊錶的查詢效率,其時間複雜度為o logn 其中n為鍊錶長度 簡單說skiplist優化了postings的隨機查詢的效能問題。skiplist的節點儲存了三部分資料,分別是當前節點指向block的資訊,是關於block本身的資...
全文搜尋Lucene 之倒排演算法
size large 背景 size 關聯式資料庫不適合做全文搜尋 list like 效率很慢,建的索引將無效,查詢的時候會像翻書一樣一頁一頁的翻 當搜尋live的時候,也想把lives living搜出來,但是資料庫很難做到 list size large 倒排演算法 size lucene在國...
資訊檢索 倒排記錄表合併演算法實現(python)
倒排記錄表合併演算法偽 如下所示 執行程式,看到提示 請輸入詞項word1 輸入某個倒排記錄表的詞項。執行程式,看到提示 請輸入word1的倒排記錄表 輸入 1,停止輸入倒排記錄表 時,輸入 步驟詞項的倒排記錄表,當輸入 1時停止輸入此倒排記錄表。執行程式,看到提示 請輸入詞項word2 輸入某個倒...