Lucene建立索引的過程學習

2021-09-03 10:47:58 字數 3463 閱讀 2183

version: lucene_3.5

version: lucene_3.5

了解lucene

的核心,我是從源**對比

lucene

的檔案格式(

file formats

)入手的。最核心的參考資料為《

lucene

原理與源**分析完整版》,儘管其版本為

3.0,但是對於

3.5的版本仍具有非常重要的參考價值。

分析建立硬碟索引的過程:

1、write.lock

檔案的生成及作用

在lucene_test

目錄下生成的第乙個檔案就是

write.lock

檔案。這個檔案在

indexwriter

的構造器中執行

writelock

= directory

.makelock(

write_lock_name

);語句時生成。

這個檔案是個臨時檔案,在索引建立結束後會被刪除。如果我們在lucene_test

的目錄中看到這個檔案,表明此時有

writer

正在修改索引資料(新增或者刪除

document

)。這個鎖檔案保證了在任意時刻,最多只有乙個

writer

在修改索引資料。

如果試圖在同乙個索引目錄下生成多個indexwriter

物件,則會報

alreadysetexception

異常。

2、fdt

檔案和fdx

檔案的生成。

在lucene

中,fdt

與fdx

檔案都是在

fieldswriter

中生成的。對於每個document,

解析其fields

中的內容後(這個解析過程是比較複雜的,包括分詞等操作

,後面詳細討論

),把document

中的field

作為正向資訊

原封不動

地儲存到檔案中

(一般用於內容的展示,不參與打分排序)。

fdt(

fielddata

)檔案儲存

field

資料,fdx(fieldindex)

檔案儲存

field

索引。如果把一本書拆成目錄和正文兩部分,那麼fdt

檔案就是正文,fdx

檔案就是目錄。這樣就使得我們

能夠快捷地

讀取document

中的內容。從這裡也可以猜測,對

fdt檔案的讀

取一定是隨機的,可以定位的

,用到了

randomaccessfile類(順便說一下

randomaccess

3、tis和

tii檔案的生成

<

反向資訊

>

當關閉indexwriter

時,儲存在綏存中的詞資訊就需要

flush

到硬碟上了。在這個過程中,

tis和

tii檔案會被建立。

tis和

tii檔案都是在

terminfoswriter

類的建構函式中生成的。

tis和tii

兩個檔案儲存term

,即詞資訊。與

fdt檔案和

fdx檔案類似,

tis檔案儲存

term

內容,tii

檔案是tis

檔案的索引。

4、frq檔案的生成

<

反向資訊

>

frq檔案儲存倒排表資訊,即每個

term

在哪些文件中出現,並且存

term

在每個文件出現的次數。此檔案在

formatpostingsdocswriter

的建構函式中生成。

5、prx檔案的生成

<

反向資訊

>

prx檔案儲存的是每個

term

在出現文件中的位置資訊。 由

formatpostingspositionswriter

的建構函式生成。需要注意的是,如果所有的

field都需要不儲存詞的位置資訊,則此檔案將不存在。

6、norm檔案的生成

norm檔案儲存所有的標準化因子。該檔案在

normswriter

的flush

函式中生成。對於標準化因子,乍一看不好理解,通俗而不全面的理解就是「文件加權」(也包含長文件的降權)。標準化因子由三部分組成

:document boost

、field boost

、lengthnorm(field)

。關於norm

的通俗解釋可參見:

部落格。

7、fnm檔案的生成

fnm檔案儲存的資訊非常簡單明瞭,就是

field

的名字及

field

的結構資訊。該檔案在

docfieldprocessor

的flush方法中生成。

8、segments_

n檔案的生成

segments_

n檔案是索引目錄中

segments_*

檔案的總稱。此檔案儲存了索引的段資訊,即索引包含了多少段,每個段的段名、段的大小、段包含

document

數目等資訊。該檔案在

segmentinfos

類的write方法中生成。

9、segments.gen檔案的生成

segments.gen檔案在

segmentinfos

類的finishcommit

方法中生成。

segments.gen檔案也儲存了段資訊。其作用在於輔助

index

開啟segments_n

檔案。

以上就是程式執行過程中依次生成的索引檔案,這些檔案共同組成了乙個完整的索引。當然,如果有一些特殊的需求,比如高亮顯示、模糊查詢,那麼需要設定field.

termvector

引數,那樣的話,索引檔案的成員又會增加三個tvd

、tvf

、tvx

。當資料量特別大時,索引又會生成

cfs、

cfe檔案。總之,在

lucene3.5

中,圍繞著索引的總共有

17種檔案。其中,最核心的是

frq檔案,即倒排表。它是整個索引的靈魂之所在。

在建立索引的過程中,詞資訊是由bytepool

、charpool

、intpool

三個快取來進行儲存。當快取滿了,則

flush

到硬碟中。

以上就是我所理解到的lucene

建立索引的過程。

Lucene 建立索引

public class indexer public static string indexdir d luceneindex public static void main string args system.out.println 被索引的文件個數 writer.numdocs catch ...

Lucene索引的建立

lucene索引的建立 1.搜尋引擎之所以檢索速度快其中乙個因素就是對索引的建立。就好像書籍的目錄,可以讓我們迅速定位到內容。這裡引用一張圖說明搜尋過程。從圖中可以很清晰的看到乙個搜尋系統,三個部分 收集資料整理成索引文件,這個過程多是確定你需要檢索的資訊。比如如果你需要檢索圖書館中的書。那麼你可能...

Lucene之建立索引

lucene用來建搜尋引擎要解決四個問題 抓取資料 解析資料 建立索引和執行搜尋。首先為每一篇文章新增標題 內容 寫作時間等資訊,從而寫好每一篇文章,然後將每一篇文章新增到書裡面去。這樣問及就寫好了。建立索引的過程如下 建立索引器indexwriter,這相當於一本書的框架。建立文件物件docmen...