<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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


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

    本文主要討論Lucene的系統結構,希望對其結構的初步分析,更深入的了解Lucene的運作機制,從而實現對Lucene的功能擴展。

     

    1 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

    一些公用類

     

    2 Lucene的主要邏輯圖

     

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

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

     

    STORAGE

    (存儲器)

    ACCESS INDEX

    (訪問索引)

    SERACHER

    (查詢器)

    ANALYZER

    (語言分析器)

    QUERY PARSER

    (查詢分析器)

    DOCUMENT

    (文檔結構)

    SEARCHER

    (查詢)

    INDEXER

    (入庫)

     

    FS

     

    BDD

     

    RAM

    Lucene功能邏輯圖

     


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    查詢邏輯

     

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

     

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

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

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

    4  將返回的結果集顯示在查詢結果頁面,當點擊某一條內容時,可以鏈接到原始網頁,也可以打開全文檢索庫中存儲的網頁內容。

     

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

     

    入庫邏輯

     

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

     

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

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

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

     

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

     

    接下來將對Lucene的各個子包的結構進行討論。

     

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

     

     

    Analyzer是一個抽象類,司職對文本內容的切分詞規則。

     

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

     

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

     

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

     

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

     

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

     

     

    4 文檔結構包org.apache.lucene.document

     

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

     

     

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

     

     

    索引包是整個系統核心,全文檢索的的根本就為每個切出來的詞建索引,查詢時就只需要遍歷索引,而不需要去正文中遍歷,從而極大的提高檢索效率,索引建設的質量關鍵整個系統的質量。Lucene的索引樹是非常優質高效的,具體的索引樹細節,將在后續章節中重要探討。

     

    在這個包中,主要學習IndexWriterIndexReader這個類。

     

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

     

    初始化全文庫的語句為:

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

     

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

     

    IndexWriter主要用于寫庫,當需要讀取庫內容時,就需要用到IndexReader這個類了。

     

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

     

     

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

     

    7 存儲包org.apache.lucene.store

     

     

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

     

    8 工具包org.apache.lucene.util

     

    該包中包括4個工具類。

     

    9 總結

     

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

     

    l         org.apache.lucene.analysis

    l         org.apache.lucene.index

    l         org.apache.lucene.search

     

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

     

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

     

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

     

    參考資料

     

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

     

    作者簡介

     

    陳光 J2EE項目經理,熟悉EJBXML,致力于Aapche Jakarta項目的應用與推廣,可通過holen@263.net與作者聯系。

    posted on 2005-06-28 16:09 gaich 閱讀(679) 評論(0)  編輯  收藏 所屬分類: J2EE應用
    主站蜘蛛池模板: 国产精品自拍亚洲| 91嫩草私人成人亚洲影院| 亚洲精品一二三区| 2021国产精品成人免费视频| 国产成人无码a区在线观看视频免费| 亚洲国产精品线在线观看| a级毛片在线免费| 亚洲国产精品无码久久SM| 伊人久久大香线蕉免费视频| 亚洲妇女无套内射精| 国产精品视频免费一区二区三区| 亚洲成av人片在线天堂无| 全部免费毛片免费播放| 亚洲午夜久久久久久久久久| WWW免费视频在线观看播放| 久久精品国产亚洲综合色| 日韩午夜理论免费TV影院| 亚洲激情视频网站| 成年性午夜免费视频网站不卡| 亚洲av无码成人影院一区| 又粗又大又硬又爽的免费视频| 久久久免费观成人影院| 久久久久亚洲精品美女| 91免费资源网站入口| 亚洲成AV人片一区二区| 在线永久免费的视频草莓| 亚洲av无码成人精品国产 | 好男人资源在线WWW免费| 亚洲不卡中文字幕无码| 无码国产精品一区二区免费式直播 | 女人与禽交视频免费看| 真人无码作爱免费视频| 亚洲欧洲成人精品香蕉网| 无码人妻久久一区二区三区免费丨| 国产亚洲精品国产福利在线观看| 亚洲乱码国产乱码精品精| 免费视频专区一国产盗摄| 特级毛片A级毛片100免费播放| 亚洲开心婷婷中文字幕| 国产精品久久久久久久久久免费| 羞羞视频在线观看免费|