Lucene初探之索引過程分析(一)

2021-07-29 14:02:22 字數 1269 閱讀 3478

經過上面的學習,我們對於lucene的索引檔案的儲存原理有了初步的了解,不過了解了這些只是為隨後的操作lucene打下了乙個很小的基礎,我們無法依靠這些知識就去自完成搜尋引擎的整個設計。接下來,我們將開始深入lucene的索引過程,進一步去深入了解lucene的執行。

對於lucene的索引過程,除了將詞(term)寫入倒排表並最終寫入索引檔案之外,還包括了分詞與合併段的過程,後面這兩個部分我們將在後面進行單獨地講解。其實有很多文章已經對索引過程有了乙個非常好的講解,比如《annotated lucene》。

在程式設計領域,想要真正地去深入了解一項技術,最好的方法就是深入**內部,debug跟蹤每一步**的執行,畢竟語言的描述總是因人而異,但是code是不會去騙你的。

本文所分析的是lucene3.0版本的索引過程。

lucene3.0的搜尋過程是乙個非常複雜的過程,各種資訊資料分散在不同的物件之中進行分析、處理並寫入,為了支援多執行緒,每乙個執行緒都建立了一系列的結構類似的物件集,為了提高效率,需要復用一些物件集,這又使得過程變得更加地複雜。

上面這幅圖就是lucene的索引過程,它是由一系列的索引鏈構成,索引鏈中的每乙個節點分別負責處理索引文件的不同部分,當文件經過所有的索引鏈之後,就代表文件被處理完畢。最初的索引鏈,我們稱之為基本索引鏈。

為了支援多執行緒,使得多個執行緒可以併發地處理文件,每個執行緒都需要去建立自己的索引鏈體系,這個索引鏈都是基於基本索引鏈而建立,被稱之為執行緒索引鏈。執行緒索引鏈的每乙個節點都可以在基本索引鏈的中找到對應的節點。事實上執行緒索引鏈的節點都是通過這些基本節點的addthreads建立的。

對於文件的域處理也一樣,同樣為了復用一些物件而建立相應的域索引鏈,這些索引鏈上的節點是通過執行緒索引鏈的相應節點的addfields方法產生的。

在完成對文件的處理之後,不同的資訊會最終沿著基本索引鏈寫入索引檔案中,毫無疑問,這一步需要同步操作。

indexwriter writer = new indexwriter(fsdirectory.open(index_dir), new   standardanalyer(version.lucene_current), true,  indexwriter.maxfieldlength.limited);
indexwriter物件主要包含以下幾個資訊:

- 用於索引文件;

- 用於合併文件;

- 為了保持索引一致性,事務性和完整性;

- 一些配置資訊;

Lucene初探之索引過程分析(二)

在上乙個章節我們講到lucene的索引過程的起點是建立乙個indexwriter物件。在indexwriter物件建立之後,我們將會建立document文件物件,並且將其加入域 field document doc new document doc.add new field path f.getp...

Lucene搜尋 索引過程筆記

lucene索引文件過程 初始化indexwriter 構建document 呼叫indexwriter.adddocument執行寫入 初始化documentwriter。引數指定寫出位置為記憶體 生成自增段id 呼叫documentwriter.adddocument 執行寫入 寫出fieldi...

Lucene之建立索引

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