二:Lucene的總體架構
阿新 • • 發佈:2019-02-03
Lucene總的來說是:
- 一個高效的,可擴充套件的,全文檢索庫。
- 全部用Java實現,無須配置。
- 僅支援純文字檔案的索引(Indexing)和搜尋(Search)。
- 不負責由其他格式的檔案抽取純文字檔案,或從網路中抓取檔案的過程。
在Lucene in action中,Lucene 的構架和過程如下圖,
說明Lucene 是有索引和搜尋的兩個過程,包含索引建立,索引,搜尋三個要點。
讓我們更細一些看Lucene的各元件:
- 被索引的文件用Document物件 表示。
- IndexWriter 通過函式addDocument 將文件新增到索引中,實現建立索引的過程。
- Lucene 的索引是應用反向索引。
- 當用戶有請求時,Query 代表使用者的查詢語句。
- IndexSearcher 通過函式search 搜尋Lucene Index 。
- IndexSearcher 計算term weight 和score 並且將結果返回給使用者。
- 返回給使用者的文件集合用TopDocsCollector 表示。
那麼如何應用這些元件呢?
讓我們再詳細到對Lucene API 的呼叫實現索引和搜尋過程。
- 索引過程如下:
- 建立一個IndexWriter 用來寫索引檔案,它有幾個引數,INDEX_DIR 就是索引檔案所存放的位置,Analyzer 便是用來對文件進行詞法分析和語言處理的。
- 建立一個Document 代表我們要索引的文件。
- 將不同的Field 加入到文件中。我們知道,一篇文件有多種資訊,如題目,作者,修改時間,內容等。不同型別的資訊用不同的Field 來表示,在本例子中,一共有兩類資訊進行了索引,一個是檔案路徑,一個是檔案內容。其中FileReader 的SRC_FILE 就表示要索引的原始檔。
- IndexWriter 呼叫函式addDocument 將索引寫到索引資料夾中。
- 搜尋過程如下:
- IndexReader 將磁碟上的索引資訊讀入到記憶體,INDEX_DIR 就是索引檔案存放的位置。
- 建立IndexSearcher 準備進行搜尋。
- 建立Analyer 用來對查詢語句進行詞法分析和語言處理。
- 建立QueryParser 用來對查詢語句進行語法分析。
- QueryParser 呼叫parser 進行語法分析,形成查詢語法樹,放到Query 中。
- IndexSearcher 呼叫search 對查詢語法樹Query 進行搜尋,得到結果TopScoreDocCollector 。
以上便是Lucene API函式的簡單呼叫。
然而當進入Lucene的原始碼後,發現Lucene有很多包,關係錯綜複雜。
然而通過下圖,我們不難發現,Lucene的各原始碼模組,都是對普通索引和搜尋過程的一種實現。
此圖是上一節介紹的全文檢索的流程對應的Lucene實現的包結構。(參照http://www.lucene.com.cn/about.htm 中文章《開放原始碼的全文檢索引擎Lucene》)
- Lucene 的analysis 模組主要負責詞法分析及語言處理而形成Term 。
- Lucene 的index 模組主要負責索引的建立,裡面有IndexWriter 。
- Lucene 的store 模組主要負責索引的讀寫。
- Lucene 的QueryParser 主要負責語法分析。
- Lucene 的search 模組主要負責對索引的搜尋。
- Lucene 的similarity 模組主要負責對相關性打分的實現。
瞭解了Lucene的整個結構,我們便可以開始Lucene的原始碼之旅了。