朱雪蓮
(新疆藝術學院基礎部(思政部),新疆 烏魯木齊 830049)
Lucene作為一個開放源代碼全文檢索工具包,具有優異的索引結構和良好的系統架構,不僅可以通過它來構建具體的全文檢索應用,而且能方便地集成到各種系統軟件中,本文對Lucene進行深入的研究和分析,以此為基礎設計實現了一個以商業網站中構建搜索引擎的實例。
Lucene是用Java寫的全文檢索引擎工具包,并不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,可以提供多個應用程序編程接口函數和數據存儲結構,并能方便地嵌入到各種應用中,從而實現針對應用的全文索引/檢索功能。
Lucene的系統結構中運用了面向對象的設計思想,定義的索引文件格式與平臺無關,并通過抽象將系統的核心組成部分和具體的平臺部分設計為抽象類,與具體平臺相關的部分例如文件存儲也封裝為類,經過層層處理,形成了一個低耦合、高效率、容易二次開發的檢索引擎系統。系統結構圖如圖1所示。
從圖1看到Lucene系統是由基礎結構封裝、索引核心、對外接口三大部分組成。其中索引核心部分是系統的重點。 Lucene中共有7個子包,每個包的具體功能見表1,核心類包主要有:org.apache.lucene.analysis;org.apache.lucene.Index;org.apache.lucene.search。


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

在索引階段需要定義Lucene的Document格式和構建索引的處理類。Lucene的索引庫是通過接口添加一條條索引記錄實現的,首先需要構造一個Document文檔對象,確定Document的各個域,IndexWriter負責接收新加入的文檔,并寫入索引庫中。
本實例中ProductDocument類靜態方法為一個Product對象構建 Lucene的 Document,當中包含了 7個 Field,分別為 identifier(產品 ID)、indextime(索引時間)、producturl(產品 URL)、category(產品分類)、name(產品名稱)、type(產品型號)、all。前6個 Field與數據庫中的內容有直接的對應關系,而 all則是將 category(產品分類)、name(產品名稱)、type(產品型號)拼接起來,為用戶搜索時提供一個默認Field。具體定義如表2所示。

表2 ProductDocument類中Field屬性配置情況
關鍵代碼如下:


下面的代碼是索引類的代碼,它用于向Lucene索引中添加 Document。

在initialize方法中,初始化了一個 JE分詞的MMAnalyzer實例,然后將生成的主題詞庫添加到該實例中。addProduct方法將兩個參數Product和 id傳遞到Product-Document.bulidProductDocument方法里,然后調用IndexWriter的addDocument方法,把生成的產品加入到索引中。至此,數據庫與索引的建立結束。
Lucene的檢索接口主要由 QueryParser、IndexSearcher、Hits三個類構成,QueryParser是查詢分析器,IndexSearcher是索引搜索器,檢索時,用戶提交檢索關鍵字,先調用Lucene的查詢分析器分析用戶提交的查詢,然后調用IndexSearcher類進行搜索;返回結果為 Hits類,通過它再訪問Document=>Field中的內容。
本文在深入剖析Lucene的系統結構和索引機制的基礎上,實現了一個商業領域搜索引擎的實例,檢索的結果由結構化的數據組成,描述針對性很強,響應速度快、查準率高。今后,將進一步增加對動態頁面的索引和語義分析來提高搜索的精度。
[1]管建和,甘劍峰.基于Lucene全文檢索引擎的應用研究與實現[J].計算機工程與設計,2007,1.28(2):489-491.
[2]車東.在應用中加入全文檢索功能—基于Java的全文索引引擎 Lucene簡介[EB/OL].http://www.chedong.com/tech/lucene.html.2009.03.20.
[3]邱哲,符滔滔.開發自己的搜索引擎[M].北京:人民郵電出版社,2007.
[4]李廣麗,劉覺夫.垂直搜索引擎的研究與實現[J].情報雜志,2009,10.28(10):144-147,169.