lucene的索引原始碼分析

2021-04-18 12:49:40 字數 1915 閱讀 1203

lucene的索引原始碼分析

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

lucene的索引分為兩種,一種是將不同索引資訊寫到不同的檔案中,一種是使用復合檔案索引格式,該索引格式減少了索引檔案的個數,但同時會有一定效率的降低。

經常使用indexwriter來完成索引的建立,常見的**是這樣的:

document doc1=null;

..........................//make doc1 refer to a real file

indexwriter writer=new indexwriter(index_store_path, new standardanalyzer(),true);

writer.add(doc1);

writer.optimize();

writer.close();

那麼這些**實際的執行是怎樣的呢?通過對源**的分析,得到如下的uml類圖

indexwriter的建構函式會在index_store_path目錄下根據create引數建立segment_gen檔案,或是將目錄下已有的索引資訊讀進來,確定segment的名字(通過確定generation編號).

indexwriter.add()方法將document內容加到索引是通過方法buildsingledocsegment(document doc, analyzer analyzer),該方法的實際操作委託給documentwriter完成。documentwriter.adddocument()負責將doc索引資訊新增到segment中去。由於索引資訊是針對field而講的,所以實際的索引資訊包含在fieldinfos物件裡,將fieldinfo寫到segment中使用了類fieldswriter。

此外,field中的term資訊也是索引的重要內容,他們儲存在indexwriter的postingtable成員中。通過呼叫鏈documentwriter.adddocument()---------->invertdocument(document),postingtable包含了term的所有索引相關資訊。將term資訊寫到索引檔案,又使用另乙個類terminfoswriter來輔助完成的。如果field的storetermvector成員為true的話,那麼還會使用termvectorswriter類儲存termvector資訊。

以上的terminfoswriter,fieldswriter,termvectorwriter將索引資訊寫到檔案中委託給indexoutput類來完成。indexoutput類是乙個抽象類,提供了多種方便的介面函式供呼叫,最下面又是使用抽象函式writebytes(byte b, int offset, int length)函式來完成,這確保了indexoutput在不同的輸出環境中可以有不同的行為。

indexwriter.optimize()方法嘗試將小的segment歸併到大的segment中去,使用segmentmerger類的mergesegments方法來完成。

indexwriter.close()方法中也會呼叫segmentmerger.mergesegment()方法。所以感覺上indexwriter的optimize方法和close方法功能上有些重合。如果optimize與close方法連用可能體現不出optimize作用來。如果建立的索引比較大的話,可以在適當的時候直接呼叫optimize,然後再去新增新的文件,可能這時optimize()作用才體現出來。

以上便是建立索引時各個類之間相互協做的大致關係

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

倒排索引是 lucene 的核心資料結構,該系列文章將從原始碼層面 原始碼版本 lucene 7.3.0 分析。該系列文章將以如下的思路展開。什麼是倒排索引?如何定位 lucene 中的倒排索引?倒排索引是如何搜尋的?倒排索引是如何增刪改的?本文將介紹什麼是倒排索引。了解什麼是倒排索引,其實是去了解...

Glide原始碼分析索引

gilde原始碼分析,所有分析均是基於glide tag 4.7.1的 glide原始碼分析 一 基本載入 流程 glide原始碼分析 二 基本載入類圖介紹 glide原始碼分析 三 engine載入資源過程 glide原始碼分析 四 decodejob執行過程 glide原始碼分析 五 engin...

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...