Lucene 原始碼分析之倒排索引(一)

2022-03-21 01:57:51 字數 891 閱讀 8586

倒排索引是 lucene 的核心資料結構,該系列文章將從原始碼層面(原始碼版本:lucene-7.3.0)分析。該系列文章將以如下的思路展開。

什麼是倒排索引?

如何定位 lucene 中的倒排索引?

倒排索引是如何搜尋的?

倒排索引是如何增刪改的?

本文將介紹什麼是倒排索引。

了解什麼是倒排索引,其實是去了解為什麼要有倒排索引。考慮這樣一種場景,給你很多篇文件,現在要求找出包含指定單詞的文件。第一種解決方案,遍歷所有文件,自然能得到結果。第二種解決方案,遍歷所有文件,得到結果後記錄下來,下次再有這種請求時直接讀取結果。如果把所有單詞的結果都記錄下來,之後的任何請求都能直接從結果中讀取,這個結果的集合就叫做倒排索引。

以兩個文件為例:

1.hello world!

2.hello china!

如何找出包含 china 的文件?一眼掃過去就知道是第 2 個文件(但在文件數量很多內容很大的情況下,可能需要很多眼)。

但如果將所有結果(即倒排索引)提前記錄如下。

單詞文件

hello

1,2world

1china

2讓你找出包含 china 的文件。不需要再去掃文件,根據倒排索引可知是第 2 個文件(在文件數量很多內容很大的情況下,能極大地提公升效率)。

有些同學會問,兩種解決方案都要去遍歷文件,為什麼採用第二種解決方案?因為後者只需要遍歷一次,以後每次查詢的時候直接查詢倒排索引即可。

有些同學會問,如果採用第二種解決方案,當增刪改文件的時候,倒排索引檔案就不對了,那還是得重新遍歷一次?不需要,將增刪改文件轉換為增刪改倒排索引即可。

有些同學會問,增刪改倒排索引的效能會不會很差?這個答案會在後面的文章中給出。而這也成為 lucene 不斷優化的目標之一。

lucene的索引原始碼分析

lucene的索引原始碼分析 lucene對一系列的檔案進行索引時,首先會將物理檔案對映為document型別的檔案。document中包含有和檢索相關的field,這個過程將一些感興趣的內容提取出來,而之後所有的檢索都是基於document的。lucene的索引分為兩種,一種是將不同索引資訊寫到不...

全文搜尋Lucene 之倒排演算法

size large 背景 size 關聯式資料庫不適合做全文搜尋 list like 效率很慢,建的索引將無效,查詢的時候會像翻書一樣一頁一頁的翻 當搜尋live的時候,也想把lives living搜出來,但是資料庫很難做到 list size large 倒排演算法 size lucene在國...

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...