1. 程式人生 > >lucene的包的結構和工作流程

lucene的包的結構和工作流程

Lucene總的來說是: 

  • 一個高效的,可擴充套件的,全文檢索庫。 
  • 全部用Java實現,無須配置。 
  • 僅支援純文字檔案的索引(Indexing)和搜尋(Search)。 
  • 不負責由其他格式的檔案抽取純文字檔案,或從網路中抓取檔案的過程。

在Lucene in action中,Lucene 的構架和過程如下圖, 

image

說明Lucene是有索引和搜尋的兩個過程,包含索引建立,索引,搜尋三個要點。

讓我們更細一些看Lucene的各元件: 

lucene  zong ti jia gou

  • 被索引的文件用Document物件表示。
  • IndexWriter通過函式addDocument將文件新增到索引中,實現建立索引的過程。
  • Lucene的索引是應用反向索引。
  • 當用戶有請求時,Query代表使用者的查詢語句。
  • IndexSearcher通過函式search搜尋Lucene Index。
  • IndexSearcher計算term weight和score並且將結果返回給使用者。
  • 返回給使用者的文件集合用TopDocsCollector表示。

那麼如何應用這些元件呢? 

讓我們再詳細到對Lucene API 的呼叫實現索引和搜尋過程。 

using lucene

  • 索引過程如下:
    • 建立一個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》) 

clip_image008

  • Lucene的analysis模組主要負責詞法分析及語言處理而形成Term。
  • Lucene的index模組主要負責索引的建立,裡面有IndexWriter。
  • Lucene的store模組主要負責索引的讀寫。
  • Lucene的QueryParser主要負責語法分析。 
  • Lucene的search模組主要負責對索引的搜尋。
  • Lucene的similarity模組主要負責對相關性打分的實現。

瞭解了Lucene的整個結構,我們便可以開始Lucene的原始碼之旅了。

如上圖所示,Lucene原始碼中共包括7個子包,每個包完成特定的功能:

Lucene包結構功能表

包名 功能
org.apache.lucene.analysis 語言分析器,主要用於的切詞,支援中文主要是擴充套件此類
org.apache.lucene.document 索引儲存時的文件結構管理,類似於關係型資料庫的表結構
org.apache.lucene.index 索引管理,包括索引建立、刪除等
org.apache.lucene.queryParser 查詢分析器,實現查詢關鍵詞間的運算,如與、或、非等
org.apache.lucene.search 檢索管理,根據查詢條件,檢索得到結果
org.apache.lucene.store 資料儲存管理,主要包括一些底層的I/O操作
org.apache.lucene.util 一些公用類

1analysis對需要建立索引的文字進行分詞、過濾等操作

2standard是標準分析器

3document提供對DocumentField的各種操作的支援。

4index是最重要的包,用於向Lucene提供建立索引時各種操作的支援

5queryParser提供檢索時的分析支援

6search負責檢索

7store提供對索引儲存的支援

8util提供一些常用工具類和常量類的支援

Lucene中的類主要組成如下:

1)org.apache.1ucene.analysis語言分析器,主要用於的切詞Analyzer是一個抽象類,管理對文字內容的切分詞規則。

2)org.apache.1uceene.document索引儲存時的文件結構管理,類似於關係型資料庫的表結構。

3)document包相對而言比較簡單,該包下面有3個類,document相對於關係型資料庫的記錄物件,Field主要負責欄位的管理。

4)org.apache.1ucene.index索引管理,包括索引建立、刪除等。索引包是整個系統核心,全文檢索的根本就是為每個切出來的詞建索引,查詢時就只需要遍歷索引,而不需要去正文中遍歷,從而極大的提高檢索效率。

5)org.apache.1ucene.queryParser查詢分析器,實現查詢關鍵詞間的運算,如與、或、非等。

6)org.apache.1ucene.search檢索管理,根據查詢條件,檢索得到結果。

7)org.apache.1ucene.store資料儲存管理,主要包括一些底層的I/0操作。

8)org.apache.1ucene.util一些公用類。

lucene提供的服務實際包含兩部分:一入一出。所謂入是寫入,即將你提供的源(本質是字串)寫入索引或者將其從索引中刪除;所謂出是讀出,即向用戶提供全文搜尋服務,讓使用者可以通過關鍵詞定位源。
寫入流程:源字串首先經過analyzer處理,包括:分詞,分成一個個單詞;去除stopword(可選)。將源中需要的資訊加入Document的各個Field中,並把需要索引的Field索引起來,把需要儲存的Field儲存起來。將索引寫入儲存器,儲存器可以是記憶體或磁碟。
讀出流程:使用者提供搜尋關鍵詞,經過analyzer處理。對處理後的關鍵詞搜尋索引找出對應的Document。使用者根據需要從找到的Document中提取需要的Field。
索引過程:從命令列讀取檔名(多個),將檔案分路徑(path欄位)和內容(body欄位)2個欄位進行儲存,並對內容進行全文索引:索引的單位是Document物件,每個Document物件包含多個欄位Field物件,針對不同的欄位屬性和資料輸出的需求,對欄位還可以選擇不同的索引/儲存欄位規則。

建立document:這一步驟所指的document是lucene索引是使用的一個數據物件,每個document對應一個數據即一個頁面或是資料庫中的一行資料等等。資料被抓取之後,需要將資料中的資訊分解為多個field,並將這些field通過document組織起來。將資料分解為field並儲存到document之後,可以為field以及document指定激勵因子以影響結果集的排名。每一個文件最終被封裝成了一個 Document 物件。

analysis document:接下來就是分析文件(analyze document)。搜尋引擎不對直接對建立的document物件建立索引,它會對document中包含的資料欄位進行分析,分解為多個token。文件分析階段會涉及很多問題,例如同義詞,詞彙的變形,以及多語言等問題。lucene提供了一些分析器用以分析文件,使用者也可自定義分析器用以分析文件資料。

分析文件之後就是將文件新增到索引中,這個步驟lucene已經提供了API讓使用者可以輕鬆建立索引。

索引建立完成之後,資料的準備工作已經完成,之後就是等待使用者使用搜索引擎搜尋了。一般是通過瀏覽器或客戶端提交檢索詞,搜尋引擎接受到使用者請求之後,會將檢索詞轉換為一個Query物件,即Build Query階段。Lucene提供了一個QueryParser的包來講使用者提交的檢索詞轉換為Query物件,檢索詞中有可能包含布林操作符或萬用字元或是限制結果集數量的條件,如果你的頁面上想要實現控制結果集數量或是其他限制條件的話,也是需要通過一定的邏輯將其轉換為相應的查詢條件。通常,lucene提供的QueryParser足以應付使用者提交的檢索詞,如果想要新增自己的邏輯的話也可以自定義QueryParser。

 lucene使用Query物件查詢是一個查詢索引以及提取與Query物件匹配的文件並按照使用者需要對結果集進行排序的過程。lucene已經封裝了具體的搜尋實現並提供了簡便的API,如果使用者需要實現特殊的查詢邏輯,整個查詢實現也是可以拓展的。這個包提供了對在建立好的索引上進行搜尋所需要的類。比如 IndexSearcher 和 Hits, IndexSearcher 定義了在指定的索引上進行搜尋的方法,Hits 用來儲存搜尋得到的結果。

搜尋演算法當前大概有三種:

1、純布林模型:該模型對於文件的判斷僅限於匹配與不匹配,並不存在相關性判斷。

2、向量空間模型:將檢索詞與document抽象為N維向量空間中的向量,每一個term作為一個維度,通過計算檢索詞與document向量之間的距離來判斷相似性與相關性。

3、概率模型:使用概率的方法來判斷一個document的相關性

lucene使用的檢索方法是純布林模型以及向量空間模型的聯合體。

一旦我們獲得了與檢索詞相匹配的document,經過排序,然後就是向用戶展示檢索結果。lucene並沒有提供展示檢索結果的功能,但是在lucene中提供了動態摘要以及高亮檢索詞的功能。