Lucene全文檢索引擎在商業(yè)網(wǎng)站中的應(yīng)用
出處:朱雪蓮 發(fā)布于:2011-08-29 17:56:31
Lucene是apache軟件基金會(huì)4 jakarta項(xiàng)目組的一個(gè)子項(xiàng)目,是一個(gè)開(kāi)放源代碼的全文檢索引擎工具包,即它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語(yǔ)言)。Lucene的目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎。
Lucene作為一個(gè)開(kāi)放源代碼全文檢索工具包,具有優(yōu)異的索引結(jié)構(gòu)和良好的系統(tǒng)架構(gòu), 不僅可以通過(guò)它來(lái)構(gòu)建具體的全文檢索應(yīng)用, 而且能方便地集成到各種系統(tǒng)軟件中,本文對(duì)Lucene進(jìn)行深入的研究和分析,以此為基礎(chǔ)設(shè)計(jì)實(shí)現(xiàn)了一個(gè)以商業(yè)網(wǎng)站中構(gòu)建搜索引擎的實(shí)例。
1 全文檢索引擎Lucene
1.1 Lucene概述
Lucene是用Java寫的全文檢索引擎工具包,并不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),可以提供多個(gè)應(yīng)用程序編程接口函數(shù)和數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),并能方便地嵌入到各種應(yīng)用中,從而實(shí)現(xiàn)針對(duì)應(yīng)用的全文索引/檢索功能。
Lucene是一個(gè)高性能、可伸縮的信息搜索(IR)庫(kù)。它使你可以為你的應(yīng)用程序添加索引和搜索能力。Lucene是用java實(shí)現(xiàn)的成熟的、的開(kāi)源項(xiàng)目,是著名的Apache Jakarta大家庭的一員,并且基于在Apache軟件許可 [ASF, License]。同樣,Lucene是當(dāng)前與近幾年內(nèi)非常流行的的Java信息搜索(IR)庫(kù)。
1.2 Lucene系統(tǒng)結(jié)構(gòu)
Lucene的系統(tǒng)結(jié)構(gòu)中運(yùn)用了面向?qū)ο蟮脑O(shè)計(jì)思想,定義的索引文件格式與平臺(tái)無(wú)關(guān),并通過(guò)抽象將系統(tǒng)的組成部分和具體的平臺(tái)部分設(shè)計(jì)為抽象類,與具體平臺(tái)相關(guān)的部分例如文件存儲(chǔ)也封裝為類,經(jīng)過(guò)層層處理,形成了一個(gè)低耦合、高效率、容易二次開(kāi)發(fā)的檢索引擎系統(tǒng)。系統(tǒng)結(jié)構(gòu)圖如圖1所示。

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

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

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

關(guān)鍵代碼如下:
import org. apache. lucene. document;
public class ProductDocument
{
//Field名稱,當(dāng)前產(chǎn)品在數(shù)據(jù)庫(kù)中的ID
private static final String PRODUCT_ ID=“p roductid”;
……
public static Document buildProductDocument(Porduct pro-
duct, int id)
{
Document doc = new Document( ) ;
// 此處構(gòu)建6個(gè)Field
Field identifier;
Field indextime;
Field p roducturl;
Field category;
Field name;
Field type;
//一個(gè)Field將category、name、type的信息綜合起來(lái),默認(rèn)在此進(jìn)行檢索
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);
?。ǎ∕MAnalyzer)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方法中,初始化了一個(gè)JE分詞的MMAnalyzer實(shí)例,然后將生成的主題詞庫(kù)添加到該實(shí)例中。addProduct方法將兩個(gè)參數(shù)Product和id傳遞到ProductDocument.bulidProductDocument方法里,然后調(diào)用IndexWriter的addDocument方法,把生成的產(chǎn)品加入到索引中。至此,數(shù)據(jù)庫(kù)與索引的建立結(jié)束。
2.2 檢索
Lucene的檢索接口主要由QueryParser、IndexSearcher、Hits三個(gè)類構(gòu)成,QueryParser是查詢分析器,IndexSearcher是索引搜索器,檢索時(shí),用戶提交檢索關(guān)鍵字,先調(diào)用Lucene的查詢分析器分析用戶提交的查詢,然后調(diào)用IndexSearcher類進(jìn)行搜索;返回結(jié)果為Hits類,通過(guò)它再訪問(wèn)Document=>Field中的內(nèi)容。
本文在深入剖析Lucene的系統(tǒng)結(jié)構(gòu)和索引機(jī)制的基礎(chǔ)上,實(shí)現(xiàn)了一個(gè)商業(yè)領(lǐng)域搜索引擎的實(shí)例,檢索的結(jié)果由結(jié)構(gòu)化的數(shù)據(jù)組成,描述針對(duì)性很強(qiáng),響應(yīng)速度快、查準(zhǔn)率高。今后,將進(jìn)一步增加對(duì)動(dòng)態(tài)頁(yè)面的索引和語(yǔ)義分析來(lái)提高搜索的。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 工業(yè)5G技術(shù)在智能制造中的應(yīng)用與實(shí)踐解析2025/12/31 10:57:21
- 工業(yè)以太網(wǎng)交換機(jī)選型與現(xiàn)場(chǎng)應(yīng)用技術(shù)指南2025/12/18 10:48:14
- 無(wú)線傳輸電路基礎(chǔ),射頻前端設(shè)計(jì)、天線匹配與鏈路預(yù)算計(jì)算2025/10/27 13:55:50
- ASK 解調(diào)的核心要點(diǎn)與實(shí)現(xiàn)方式2025/9/5 16:46:17
- 雙偶極子天線:結(jié)構(gòu)、特性與應(yīng)用全解析2025/9/3 10:29:21
- 高速PCB信號(hào)完整性(SI)設(shè)計(jì)核心實(shí)操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計(jì)算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對(duì)系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護(hù)設(shè)計(jì)
- 連接器耐腐蝕性能測(cè)試方法
- PCB電磁兼容(EMC)設(shè)計(jì)與干擾抑制核心實(shí)操規(guī)范
- 用于相位噪聲測(cè)量的低通濾波器設(shè)計(jì)與本振凈化技術(shù)
- MOSFET在高頻開(kāi)關(guān)中的EMI問(wèn)題
- 電源IC在便攜式設(shè)備中的設(shè)計(jì)要點(diǎn)
- 連接器結(jié)構(gòu)設(shè)計(jì)常見(jiàn)問(wèn)題分析









