隨筆-6  評論-6  文章-2  trackbacks-0


          原文:http://jalorsoft.com/holen/holen_lucene_01.html

          本文主要討論Lucene的系統(tǒng)結(jié)構(gòu),希望對其結(jié)構(gòu)的初步分析,更深入的了解Lucene的運作機制,從而實現(xiàn)對Lucene的功能擴展。

           

          1 Lucene的包結(jié)構(gòu)

           

           

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

           

          Lucene包結(jié)構(gòu)功能表

          包名

          功能

          org.apache.lucene.analysis

          語言分析器,主要用于的切詞,支持中文主要是擴展此類

          org.apache.lucene.document

          索引存儲時的文檔結(jié)構(gòu)管理,類似于關(guān)系型數(shù)據(jù)庫的表結(jié)構(gòu)

          org.apache.lucene.index

          索引管理,包括索引建立、刪除等

          org.apache.lucene.queryParser

          查詢分析器,實現(xiàn)查詢關(guān)鍵詞間的運算,如與、或、非等

          org.apache.lucene.search

          檢索管理,根據(jù)查詢條件,檢索得到結(jié)果

          org.apache.lucene.store

          數(shù)據(jù)存儲管理,主要包括一些底層的I/O操作

          org.apache.lucene.util

          一些公用類

           

          2 Lucene的主要邏輯圖

           

          Lucene功能強大,但從根本上說,主要包括兩塊:一是文本內(nèi)容經(jīng)切詞后索引入庫;二是根據(jù)查詢條件返回結(jié)果。

          以下是上述兩大功能的邏輯圖:

           

          STORAGE

          (存儲器)

          ACCESS INDEX

          (訪問索引)

          SERACHER

          (查詢器)

          ANALYZER

          (語言分析器)

          QUERY PARSER

          (查詢分析器)

          DOCUMENT

          (文檔結(jié)構(gòu))

          SEARCHER

          (查詢)

          INDEXER

          (入庫)

           

          FS

           

          BDD

           

          RAM

          Lucene功能邏輯圖

           


           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

           

          查詢邏輯

           

          按先后順序,查詢邏輯可分為如下幾步:

           

          1  查詢者輸入查詢條件
          條件之間可以通過特定運算符進行運算,比如查詢希望查詢到與“中國”和“北京”相關(guān)的記錄,但不希望結(jié)果中包括“海淀區(qū)中關(guān)村”,于是輸入條件為“中國+北京-海淀區(qū)中關(guān)村”;

          2  查詢條件被傳達到查詢分析器中,分析器將將對“中國+北京-海淀區(qū)中關(guān)村”進行分析,首先分析器解析字符串的連接符,即這里的加號和減號,然后對每個詞進行切詞,一般最小的詞元是兩個漢字,則中國和北京兩個詞不必再切分,但對海淀區(qū)中關(guān)村需要切分,假設(shè)根據(jù)切詞算法,把該詞切分為“海淀區(qū)”和“中關(guān)村”兩部分,則最后得到的查詢條件可以表示為:“中國” AND “北京” AND NOT(“海淀區(qū)” AND “中關(guān)村”)

          3  查詢器根據(jù)這個條件遍歷索引樹,得到查詢結(jié)果,并返回結(jié)果集,返回的結(jié)果集類似于JDBC中的ResultSet。

          4  將返回的結(jié)果集顯示在查詢結(jié)果頁面,當(dāng)點擊某一條內(nèi)容時,可以鏈接到原始網(wǎng)頁,也可以打開全文檢索庫中存儲的網(wǎng)頁內(nèi)容。

           

          這就是查詢的邏輯過程,需要說明的是,Lucene默認只支持英文,為了便于說明問題,以上查詢過程采用中文舉例,事實上,當(dāng)Lucene被擴充支持中文后就是這么一個查詢過程。

           

          入庫邏輯

           

          入庫將把內(nèi)容加載到全文檢索庫中,按順序,入庫邏輯包括如下過程:

           

          1  入庫者定義到庫中文檔的結(jié)構(gòu),比如需要把網(wǎng)站內(nèi)容加載到全文檢索庫,讓用戶通過“站內(nèi)檢索”搜索到相關(guān)的網(wǎng)頁內(nèi)容。入庫文檔結(jié)構(gòu)與關(guān)系型數(shù)據(jù)庫中的表結(jié)構(gòu)類似,每個入庫的文檔由多個字段構(gòu)成,假設(shè)這里需要入庫的網(wǎng)站內(nèi)容包括如下字段:文章標題、作者、發(fā)布時間、原文鏈接、正文內(nèi)容(一般作為網(wǎng)頁快照)。

          2  包含N個字段的文檔(DOCUMENT)在真正入庫前需要經(jīng)過切詞(或分詞)索引,切詞的規(guī)則由語言分析器(ANALYZER)完成。

          3  切分后的“單詞”被注冊到索引樹上,供查詢時用,另外也需要也其它不需要索引的內(nèi)容入庫,所有這些是文件操作均由STORAGE完成。

           

          以上就是記錄加載流程,索引樹是一種比較復(fù)雜的數(shù)據(jù)存儲結(jié)構(gòu),將在后續(xù)章節(jié)陸續(xù)介紹,這里就不贅述了,需要說明的一點是,Lucene的索引樹結(jié)構(gòu)非常優(yōu)秀,是Lucene的一大特色。

           

          接下來將對Lucene的各個子包的結(jié)構(gòu)進行討論。

           

          3 語言分析包org.apache.lucene.analysis

           

           

          Analyzer是一個抽象類,司職對文本內(nèi)容的切分詞規(guī)則。

           

          切分后返回一個TokenStream,TokenStream中有一個非常重要方法next(),即取到下一個詞。簡單點說,通過切詞規(guī)則,把一篇文章從頭到尾分成一個個的詞,這就是org.apache.lucene.analysis的工作。

           

          對英文而言,其分詞規(guī)則很簡單,因為每個單詞間都有一個空格,按空格取單詞即可,當(dāng)然為了提高英文檢索的準確度,也可以把一些短語作為一個整體,其間不切分,這就需要一個詞庫,對德文、俄文也是類似,稍有不同。

           

          對中文而言,文字之間都是相連的,沒有空格,但我們同樣可以把字切分,即把每個漢字作為一個詞切分,這就是所謂的“切字”,但切字方式方式的索引沒有意義,準確率太低,要想提高準確度一般都是切詞,這就需要一個詞庫,詞庫越大準確度將越高,但入庫效率越低。

           

          若要支持中文切詞,則需要擴展Analyzer類,根據(jù)詞庫中的詞把文章切分。

           

          簡單點說,org.apache.lucene.analysis就是完成將文章切分詞的任務(wù)。

           

           

          4 文檔結(jié)構(gòu)包org.apache.lucene.document

           

          document包相對而言比較簡單,該包下面就3個類,Document相對于關(guān)系型數(shù)據(jù)庫的記錄對象,主要負責(zé)字段的管理,字段分兩種,一是Field,即文本型字段,另一個是日期型字段DateField。這個包中關(guān)鍵需要理解的是Field中字段存儲方式的不同,這在上一篇中已列表提到,下面我們可以參見一下其詳細的類圖:

           

           

          5 索引管理包org.apache.lucene.index

           

           

          索引包是整個系統(tǒng)核心,全文檢索的的根本就為每個切出來的詞建索引,查詢時就只需要遍歷索引,而不需要去正文中遍歷,從而極大的提高檢索效率,索引建設(shè)的質(zhì)量關(guān)鍵整個系統(tǒng)的質(zhì)量。Lucene的索引樹是非常優(yōu)質(zhì)高效的,具體的索引樹細節(jié),將在后續(xù)章節(jié)中重要探討。

           

          在這個包中,主要學(xué)習(xí)IndexWriterIndexReader這個類。

           

          通過上一篇的初步應(yīng)用可知,全文檢索庫的初始化和記錄加載均需要通過該類來完成。

           

          初始化全文庫的語句為:

          IndexWriter indexWriter = new IndexWriter(“全文庫的目錄位置”,new StandardAnalyzer(),true);

           

          記錄加載的語句為:indexWriter.addDocument(doc);

           

          IndexWriter主要用于寫庫,當(dāng)需要讀取庫內(nèi)容時,就需要用到IndexReader這個類了。

           

          6 查詢分析包org.apache.lucene.queryParser和檢索包org.apache.lucene.search

           

           

          通過查詢分析器(queryParser)解析后,將返回一個查詢對象(query),根據(jù)查詢對象就可進行檢索了。上圖描述了query對象的生成,下圖描述了查詢結(jié)果集(Hits)的生成。

           

          7 存儲包org.apache.lucene.store

           

           

          一些底層的文件I/O操作。

           

          8 工具包org.apache.lucene.util

           

          該包中包括4個工具類。

           

          9 總結(jié)

           

          通過對Lucene源碼包的分析,我們可以初步認識到Lucene的核心類包主要有3個:

           

          l         org.apache.lucene.analysis

          l         org.apache.lucene.index

          l         org.apache.lucene.search

           

          其中org.apache.lucene.analysis 主要用于切分詞,切分詞的工作由Analyzer的擴展類來實現(xiàn),Lucene自帶了StandardAnalyzer類,我們可以參照該寫出自己的切詞分析器類,如中文分析器等。

           

          org.apache.lucene.index主要提供庫的讀寫接口,通過該包可以創(chuàng)建庫、添加刪除記錄及讀取記錄等。

           

          org.apache.lucene.search主要提供了檢索接口,通過該包,我們可以輸入條件,得到查詢結(jié)果集,與org.apache.lucene.queryParser包配合還可以自定義的查詢規(guī)則,像google一樣支持查詢條件間的與、或、非、屬于等復(fù)合查詢。

           

          參考資料

           

          1  http://www-igm.univ-mlv.fr/~dr/XPOSE2003/lucene/node1.html

           

          作者簡介

           

          陳光 J2EE項目經(jīng)理,熟悉EJB、XML,致力于Aapche Jakarta項目的應(yīng)用與推廣,可通過holen@263.net與作者聯(lián)系。

          posted on 2005-06-28 16:09 gaich 閱讀(676) 評論(0)  編輯  收藏 所屬分類: J2EE應(yīng)用

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 安多县| 大悟县| 上栗县| 田东县| 长武县| 汤阴县| 怀仁县| 都昌县| 蕲春县| 宣恩县| 广昌县| 蓬莱市| 辛集市| 沁源县| 若尔盖县| 灵川县| 宜阳县| 土默特左旗| 神农架林区| 秦皇岛市| 黄大仙区| 遂川县| 民勤县| 咸宁市| 桑日县| 天祝| 丰镇市| 许昌县| 九寨沟县| 石嘴山市| 高雄市| 保定市| 景东| 拜城县| 林周县| 乡城县| 河池市| 青浦区| 玉树县| 鹤峰县| 洞头县|