張吳波 史旅華 李貴榮
摘要:大數(shù)據(jù)時代下信息爆炸式增長,全文檢索技術(shù)是提高信息檢索效率的有效方法。Lucene是一個采用Java編寫的全文搜索引擎框架,它運(yùn)用了面向?qū)ο蟮脑O(shè)計思想,提供了豐富的API。對Lucene的系統(tǒng)結(jié)構(gòu)、索引流程、索引機(jī)制進(jìn)行了詳細(xì)分析,對應(yīng)用Lucene引擎搭建全文搜索系統(tǒng)的關(guān)鍵問題進(jìn)行了研究。
關(guān)鍵詞:全文檢索;Lucene;倒排索引;分詞
DOIDOI:10.11907/rjdk.151168
中圖分類號:TP319
文獻(xiàn)標(biāo)識碼:A 文章編號
文章編號:16727800(2015)006012703
作者簡介作者簡介:張吳波(1977-),男,湖南邵陽人,湖北汽車工業(yè)學(xué)院電氣與信息工程學(xué)院講師,研究方向?yàn)檐浖_發(fā)。
0 引言
大數(shù)據(jù)時代,可利用的數(shù)據(jù)和信息量呈爆炸式增長,人們在獲取更多信息的同時,也不可避免地增加了篩選信息的難度[1]。面對海量數(shù)據(jù),如何使用戶更好、更準(zhǔn)確地抓取所需信息,已成為信息化技術(shù)中一個非常重要的課題。全文檢索技術(shù)是為用戶提供快速、準(zhǔn)確獲取有效信息的重要方法。
1 全文檢索技術(shù)
全文檢索是以各種計算機(jī)數(shù)據(jù),諸如文字、聲音、圖像等為處理對象,提供按照數(shù)據(jù)資料的內(nèi)容,而不是外在特征來實(shí)現(xiàn)的信息檢索手段[2]。相對于一般的DBMS,可以將Word文檔、郵件、網(wǎng)頁等非結(jié)構(gòu)化、半結(jié)構(gòu)化數(shù)據(jù)作為檢索對象。
全文檢索最初是以字符串匹配程序?qū)崿F(xiàn)的,即在待查找的文件中,打開每個文件后,對文件內(nèi)容從頭到尾檢索,如果其中包含需要查詢的字符串,則將它作為結(jié)果文件。這種順序檢索效率較低,因此,全文檢索都是通過“索引”技術(shù)實(shí)現(xiàn)的。其過程是由計算機(jī)索引程序掃描文件中的每一個詞,然后對每個詞建立一個索引,并指明該詞在文章中出現(xiàn)的次數(shù)和位置。當(dāng)用戶查詢時,由檢索程序?qū)σ呀⒌乃饕M(jìn)行查找,得到所需要的文件[3]。
2 全文搜索引擎Lucene
Lucene是一個非常優(yōu)秀、成熟、開源、免費(fèi)、采用Java語言編寫的全文檢索引擎工具。它提供了豐富的API,可以與存儲在索引中的信息方便地交互,并能方便地嵌入到各種應(yīng)用系統(tǒng)中,實(shí)現(xiàn)針對應(yīng)用的全文索引/檢索功能。
Lucene運(yùn)用了大量的面向?qū)ο笤O(shè)計思想。首先定義了一個與平臺無關(guān)的索引文件格式,其次通過抽象系統(tǒng)的核心組成部分設(shè)計為抽象類,具體的平臺實(shí)現(xiàn)部分設(shè)計為抽象類的實(shí)現(xiàn),此外與具體平臺相關(guān)的部分比如文件存儲也封裝為類,經(jīng)過層層的面向?qū)ο笫教幚?,最終達(dá)成一個低耦合、高效率、容易二次開發(fā)的檢索引擎系統(tǒng)[4]。
目前,Lucene得到了廣泛應(yīng)用,許多Java項目都使用了Lucene作為其后臺的全文搜索引擎,比較著名的有:Jive(Web論壇系統(tǒng))、Eyebrows(郵件列表HTML歸檔/瀏覽/查詢系統(tǒng))、Cocoon(基于XML的Web發(fā)布框架)等。
3 Lucene系統(tǒng)模型
3.1 Lucene系統(tǒng)結(jié)構(gòu)
Lucene搜索引擎由基礎(chǔ)結(jié)構(gòu)封裝、索引核心、對外接口、查詢分析器4大部分組成,如圖1所示。
索引核心是Lucene的重點(diǎn),主要包括索引管理和數(shù)據(jù)存儲管理。其中org.apache.lucene.index包實(shí)現(xiàn)對索引的建立、刪除等操作[5],通過為每個分出的詞建立索引,查詢時只需遍歷索引,從而極大地提高檢索效率;org.apache.lucene.store包實(shí)現(xiàn)對索引文件的存儲管理?;A(chǔ)結(jié)構(gòu)封裝是Lucene的基礎(chǔ),包括文檔管理和公用類。其中org.apache.lucene.document實(shí)現(xiàn)對文檔信息和域信息的管理;org.apache.lucene.util作為公共類,實(shí)現(xiàn)一些優(yōu)化的數(shù)據(jù)結(jié)構(gòu)和算法。對外接口包括檢索和語言分析器,org.apache.lucene.analysis是語言分析器,主要用于切分詞,把輸入的文本分成一個個可供索引模塊處理的“詞語”。org.apache.lucene.search是檢索管理器,提供用戶檢索接口,可以實(shí)現(xiàn)根據(jù)用戶輸入的查詢條件進(jìn)行查詢。org.apache.lucene.QueryParser是查詢分析器,其作用是解析用戶輸入的查詢語句,對查詢語句進(jìn)行分析,然后返回一個查詢對象(query),它還可以自定義查詢規(guī)則,以實(shí)現(xiàn)像Google一樣能支持查詢條件的與、或、非等復(fù)合查詢方式。
3.2 Lucene檢索流程
基于Lucene的全文搜索,包含索引管理和搜索索引兩個基本過程,其數(shù)據(jù)處理流程如圖2所示。
3.2.1 索引管理
在創(chuàng)建索引時,先將被索引(待搜索的數(shù)據(jù))的內(nèi)容,作為文檔(Document)信息,傳給IndexWriter對象,在IndexWriter對象中,指定語言分析器Analyzer。語言分析器自動對文檔進(jìn)行分詞處理,將文檔分成一個個單獨(dú)的單詞,其中還要進(jìn)行去除標(biāo)點(diǎn)符號和停用詞(像英語中的a、the、or等使用頻率很多的冠詞、介詞、副詞或連詞)等處理,形成“詞元(Token)”。詞元傳遞給語言處理器進(jìn)行相關(guān)處理,形成“詞(Term)”,對于英語形式的詞元進(jìn)行語言處理時,一般做以下工作:將詞元變?yōu)樾?、將詞元縮減為詞根形式(例如“cars”轉(zhuǎn)換成“car”)、將詞元轉(zhuǎn)變?yōu)樵~根形式(例如“drove”轉(zhuǎn)換“drive”)等。最后索引組件依據(jù)語言處理產(chǎn)生的詞形成詞典,采用倒排索引法,形成一定數(shù)據(jù)結(jié)構(gòu)的索引文件。
3.2.2 搜索索引
Lucene是針對索引進(jìn)行查詢的。先將用戶輸入的查詢信息傳遞給QueryParser對象,該對象采用建立索引時類似的分詞方法和語言處理方法,得到需要查詢的單詞和查詢關(guān)鍵詞;再根據(jù)查詢語句的語法規(guī)則,進(jìn)行語法分析,創(chuàng)建一棵語法樹,形成Query對象;最后由IndexSearcher對象打開、讀取索引目錄中的索引文件,在反向索引表中,分別找出需要查詢的單詞文檔鏈表,并根據(jù)語法樹對文檔鏈表進(jìn)行交、差、并等操作,得到結(jié)果文檔。
3.3 Lucene索引機(jī)制
索引是Lucene進(jìn)行全文搜索的基礎(chǔ),關(guān)系到檢索的效率。在Lucene中,分析器只能對文本數(shù)據(jù)進(jìn)行解析,并產(chǎn)生索引,對于其它類型的數(shù)據(jù),需要將其轉(zhuǎn)換成文本數(shù)據(jù)后,提交給分析器進(jìn)行處理。Lucene在管理索引時,是通過索引文件管理的,在索引文件中既保存正向信息,也保存反向信息。
3.3.1 正向信息
在Lucene中,索引結(jié)構(gòu)是一種層次結(jié)構(gòu)。索引(index)由段(segment)組成,段由記錄(document)組成,記錄由域(field)組成,域由詞(term)組成。每個層次都保存了本層次的信息以及下一層次的元信息,也即屬性信息[6],其結(jié)構(gòu)如圖3所示。
3.3.2 反向信息
反向信息是索引文件的核心,記錄的是倒排索引表。倒排索引源于實(shí)際應(yīng)用中根據(jù)屬性的值來查找記錄的方式。索引表中的每一項都包括一個屬性值和該屬性值記錄的地址。在Lucene中,索引表中的項是文檔單詞,其屬性是包含單詞的文檔號、在文檔中的出現(xiàn)頻次及位置,如圖4所示。反向信息主要包括倒排索引表中的詞典(Term Dictionary)和倒排表(Posting List)。
4 Lucene應(yīng)用
Lucen提供了全文檢索框架,具備完整的查詢引擎和索引引擎,為數(shù)據(jù)訪問和管理提供了簡單的函數(shù)調(diào)用接口。在應(yīng)用Lucene搭建全文檢索系統(tǒng)時,由于應(yīng)用領(lǐng)域不同,需要進(jìn)行二次開發(fā),以擴(kuò)展系統(tǒng)功能。
4.1 構(gòu)建數(shù)據(jù)采集器
能被Lucene索引的數(shù)據(jù)是文本數(shù)據(jù)。實(shí)際應(yīng)用中,待檢索數(shù)據(jù)有許多種格式和來源,例如:PDF文件、Word文件、XML文件,以及互聯(lián)網(wǎng)的網(wǎng)頁文件。在具體實(shí)施時,需要按照應(yīng)用需求,對這些不同格式的文件分別進(jìn)行處理,從中提取出純文本格式信息,并建立對應(yīng)的Lucene文檔,再提交給索引管理器進(jìn)行索引。
在處理PDF文件、Word文件等二進(jìn)制文件時,可以借助第三方的接口和應(yīng)用程序,對文件進(jìn)行數(shù)據(jù)提取。例如在處理PDF文件時,可以使用PDFBox接口進(jìn)行文件分析并提取數(shù)據(jù);在處理Word文件時,可以使用JACOB、POI等從中提取數(shù)據(jù)等;在處理互聯(lián)網(wǎng)上的網(wǎng)頁時,可以通過網(wǎng)絡(luò)爬蟲等方式對網(wǎng)頁數(shù)據(jù)抓取,并使用網(wǎng)頁分析技術(shù),先去掉其中的HTML標(biāo)記,再提取網(wǎng)頁內(nèi)容。
4.2 擴(kuò)展分詞器
Lucene在org.apache.lucene.analysis中定義了接口,提供了可供應(yīng)用系統(tǒng)使用的語言處理能力。Lucene默認(rèn)已經(jīng)實(shí)現(xiàn)了英文等語言的簡單詞法分析邏輯(按照空格分詞,并去除常用的語法詞,如英語中的is、am、are等)。但是,在具體應(yīng)用時,由于每個語種的習(xí)慣和處理詞的方法差異較大,例如在漢語中詞語的分割與英語就有很大的不同。因此,使用Lucene提供的ChineseAnalyzer和CJKAnalyzer對中文分詞效果并不明顯,不能滿足系統(tǒng)對中文的分詞要求,此時可以采用analysis接口實(shí)現(xiàn)的方式,自定義分詞算法,以實(shí)現(xiàn)對中文的個性化分詞。
5 結(jié)語
Lucene本質(zhì)上是一個信息檢索的類庫(Library),它具有高效、簡潔、易用的特點(diǎn),在信息檢索中有著非常廣泛的應(yīng)用。Lucene采用了倒排索引技術(shù),實(shí)現(xiàn)了高效的索引管理和檢索。Lucene只以文本格式的數(shù)據(jù)作為索引對象,在實(shí)際應(yīng)用中,可以開發(fā)針對各種不同類型數(shù)據(jù)的采集器,以擴(kuò)展系統(tǒng)數(shù)據(jù)處理的廣度;可以在Lucene提供的分詞器基礎(chǔ)上,針對語言系統(tǒng)特點(diǎn),開發(fā)新的分詞器,以擴(kuò)展系統(tǒng)數(shù)據(jù)處理的深度。
參考文獻(xiàn):
[1]劉東君.基于Lucene非結(jié)構(gòu)化文檔全文檢索系統(tǒng)研究與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2013,12(10):100102.
[2]李永春.Lucene的全文檢索的研究與應(yīng)用[J].計算機(jī)技術(shù)與發(fā)展,2010,20(2):1215.
[3]李明宙.Lucene全文檢索引擎的結(jié)構(gòu)機(jī)制與應(yīng)用方式[J].廣西科學(xué)院學(xué)報,2012,26(4):433435.
[4]周平.Lucene全文檢索引擎技術(shù)及應(yīng)用[J].重慶工學(xué)院學(xué)報:自然科學(xué)版,2007,21(4):8688.
[5]何偉.基于Lucene的全文搜索引擎的設(shè)計與實(shí)現(xiàn)[J].情報雜志,2006(9):8890.
[6]黃少林.基于Lucene的索引系統(tǒng)設(shè)計與實(shí)現(xiàn)[J].現(xiàn)代情報,2009,29(7):169171.
責(zé)任編輯(責(zé)任編輯:杜能鋼)