《電子技術應用》
您所在的位置:首頁 > 通信與網(wǎng)絡 > 設計應用 > 基于Lucene全文檢索引擎的應用研究
基于Lucene全文檢索引擎的應用研究
來源:微型機與應用2010年第22期
朱雪蓮
(新疆藝術學院基礎部(思政部), 新疆 烏魯木齊 830049)
摘要: Lucene是一個強大的全文索引引擎工具包, 它的全文檢索技術是信息檢索領域廣泛使用的基本技術, 具有訪問索引時間快、多用戶訪問、跨平臺使用的特點。介紹了一個高性能的全文檢索引擎——Lucene開源系統(tǒng),詳細分析了Lucene的系統(tǒng)結構、全文索引機制,然后將其引入具體應用,給出了一個基于Lucene全文檢索技術的具體實例。
Abstract:
Key words :

摘  要: Lucene是一個強大的全文索引引擎工具包, 它的全文檢索技術是信息檢索領域廣泛使用的基本技術, 具有訪問索引時間快、多用戶訪問、跨平臺使用的特點。介紹了一個高性能的全文檢索引擎——Lucene開源系統(tǒng),詳細分析了Lucene的系統(tǒng)結構、全文索引機制,然后將其引入具體應用,給出了一個基于Lucene全文檢索技術的具體實例。
關鍵詞: 全文檢索技術; Lucene; 索引

    Lucene作為一個開放源代碼全文檢索工具包,具有優(yōu)異的索引結構和良好的系統(tǒng)架構, 不僅可以通過它來構建具體的全文檢索應用, 而且能方便地集成到各種系統(tǒng)軟件中,本文對Lucene進行深入的研究和分析,以此為基礎設計實現(xiàn)了一個以商業(yè)網(wǎng)站中構建搜索引擎的實例。
1 全文檢索引擎Lucene
1.1  Lucene概述

    Lucene是用Java寫的全文檢索引擎工具包,并不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,可以提供多個應用程序編程接口函數(shù)和數(shù)據(jù)存儲結構,并能方便地嵌入到各種應用中,從而實現(xiàn)針對應用的全文索引/檢索功能。
1.2  Lucene系統(tǒng)結構
    Lucene的系統(tǒng)結構中運用了面向對象的設計思想,定義的索引文件格式與平臺無關,并通過抽象將系統(tǒng)的核心組成部分和具體的平臺部分設計為抽象類,與具體平臺相關的部分例如文件存儲也封裝為類,經(jīng)過層層處理,形成了一個低耦合、高效率、容易二次開發(fā)的檢索引擎系統(tǒng)。系統(tǒng)結構圖如圖1所示。

    從圖1看到Lucene系統(tǒng)是由基礎結構封裝、索引核心、對外接口三大部分組成。其中索引核心部分是系統(tǒng)的重點。 Lucene中共有7個子包,每個包的具體功能見表1,核心類包主要有: org. apache.lucene. analysis; org. apache. lucene. Index;org. apache.lucene. search。

1.3 Lucene全文索引機制
    Lucene索引存儲結構采用層次結構,主要由索引、字段、文檔、字、詞組成,在存儲正向信息時通常是按層次保存從索引到詞的包含關系,即Lucene索引文件由若干段(Segment,相當于表)組成,每一段由若干的文檔(document,相當于表中記錄)組成,每一個文檔由若干的域(Field,相當于表中字段)組成,每一個域由若干的項(Term,相當于表中數(shù)據(jù))組成; 而反向信息則保存了詞典到倒排表的映射。因此,索引存儲結構設計比較通用,輸入輸出結構類似于數(shù)據(jù)庫中的表→記錄→字段,很多文件、數(shù)據(jù)庫等都能較為方便地映射到Lucene的索引存儲結構/接口中。
    Lucene訪問索引的時間較快,這是因為大部分數(shù)據(jù)庫引擎是用B樹來維護索引結構的,更新索引時會導致大量的輸入和輸出操作,而通過Lucene構建的索引文件在擴展索引時,是將新創(chuàng)建的小索引文件定期地合并到原先的大索引文件中,從而提高了索引效率。
2 基于Lucene構建搜索引擎的具體應用
    在實現(xiàn)利用Lucene構建搜索引擎的具體應用時,以在商業(yè)網(wǎng)站中構建一個搜索引擎為例,通過爬蟲將各大IT門戶網(wǎng)站提供的商品信息抓取下來,然后對網(wǎng)頁內(nèi)容進行數(shù)據(jù)信息抽取并轉換為統(tǒng)一格式的文本文件,并構建專業(yè)數(shù)據(jù)庫和主題詞典,同時將詞典內(nèi)容擴充到中文分詞模塊中;中文分詞模塊對文件處理器處理生成的文本文件進行分詞處理,并提供詞元序列供索引器索引,并將索引結果保存到索引數(shù)據(jù)庫中;使用Tomcat Web服務器發(fā)布系統(tǒng)的檢索頁面,當用戶通過Web界面輸入要查詢的關鍵詞并提交后,搜索器到索引數(shù)據(jù)庫中進行檢索,檢索到的結果經(jīng)過處理之后,作為響應發(fā)送給用戶。系統(tǒng)結構如圖2所示。本文將介紹與Lucene相關的設計與實現(xiàn),并利用Lucene工具包提供的類對其擴展來實現(xiàn)具體的應用。

    首先對抓取下來的網(wǎng)頁內(nèi)容進行結構化的抽取,并對抽取的內(nèi)容按固定格式保存、完成主題詞庫的構建、產(chǎn)品數(shù)據(jù)庫的構建、數(shù)據(jù)庫處理類的構建等幾項任務,為后續(xù)的索引入庫、檢索打下基礎。
2.1 索引庫的建立
    在索引階段需要定義Lucene的Document格式和構建索引的處理類。Lucene的索引庫是通過接口添加一條條索引記錄實現(xiàn)的,首先需要構造一個Document文檔對象,確定Document的各個域,IndexWriter負責接收新加入的文檔,并寫入索引庫中。
    本實例中ProductDocument類靜態(tài)方法為一個Product對象構建Lucene的Document,當中包含了 7個Field,分別為identifier(產(chǎn)品ID)、indextime(索引時間)、producturl(產(chǎn)品URL)、category(產(chǎn)品分類)、name(產(chǎn)品名稱)、type(產(chǎn)品型號)、all。前6個Field與數(shù)據(jù)庫中的內(nèi)容有直接的對應關系,而all則是將category(產(chǎn)品分類)、name(產(chǎn)品名稱)、type(產(chǎn)品型號)拼接起來,為用戶搜索時提供一個默認Field。具體定義如表2所示。

    關鍵代碼如下:
import org. apache. lucene. document;
public class ProductDocument
{
     //Field名稱,當前產(chǎn)品在數(shù)據(jù)庫中的ID
     private static final String PRODUCT_ ID="p roductid";
    ……
     public static Document buildProductDocument(Porduct pro-
duct, int id)
      {
          Document doc = new Document( ) ;
       // 此處構建6個Field
       Field identifier;
       Field indextime;
       Field p roducturl;
       Field category;
       Field name;
       Field type;
       //最后一個Field將category、name、type的信息綜合起來,默認在此進行檢索
       Field all;
       // add all
       doc. add ( identifier) ;
       ……
       return doc;
      }
}
  下面的代碼是索引類的代碼,它用于向Lucene索引中添加Document。
public classProductIndexer{
   ......
private void initialize() throws Exception{
      analyzer = new MMAnalyzer();
       FileReader reader = new
     FileReader(dictionary_file);
     ((MMAnalyzer)analyzer). addDictionary(reader);
       writer = new IndexWriter( indexPath, analyzer,
       true);
}
public void close(){...... }
public void addProduct(Product product, int id) throws Exception{
       writer. addDocument ( ProductDocument.
       buildProductDocument(product, id));
          }
          ......
}
    在initialize方法中,初始化了一個JE分詞的MMAnalyzer實例,然后將生成的主題詞庫添加到該實例中。addProduct方法將兩個參數(shù)Product和id傳遞到ProductDocument.bulidProductDocument方法里,然后調用IndexWriter的addDocument方法,把生成的產(chǎn)品加入到索引中。至此,數(shù)據(jù)庫與索引的建立結束。
2.2 檢索
    Lucene的檢索接口主要由QueryParser、IndexSearcher、Hits三個類構成,QueryParser是查詢分析器,IndexSearcher是索引搜索器,檢索時,用戶提交檢索關鍵字,先調用Lucene的查詢分析器分析用戶提交的查詢,然后調用IndexSearcher類進行搜索;返回結果為Hits類,通過它再訪問Document=>Field中的內(nèi)容。
    本文在深入剖析Lucene的系統(tǒng)結構和索引機制的基礎上,實現(xiàn)了一個商業(yè)領域搜索引擎的實例,檢索的結果由結構化的數(shù)據(jù)組成,描述針對性很強,響應速度快、查準率高。今后,將進一步增加對動態(tài)頁面的索引和語義分析來提高搜索的精度。
參考文獻
[1] 管建和,甘劍峰.基于Lucene全文檢索引擎的應用研究與實現(xiàn)[J].計算機工程與設計,2007,1.28(2):489-491.
[2]  車東.在應用中加入全文檢索功能—基于Java的全文索引引擎 Lucene簡介[EB/OL].http://www.chedong.com/tech/lucene.html.2009.03.20.
[3]  邱哲,符滔滔.開發(fā)自己的搜索引擎[M].北京:人民郵電出版社, 2007.
[4] 李廣麗,劉覺夫.垂直搜索引擎的研究與實現(xiàn)[J]. 情報雜志, 2009,10.28(10):144-147,169.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉載。