胡杰+郭喬進(jìn)+陳彬
摘 要: 當(dāng)今社會已經(jīng)進(jìn)入信息量爆發(fā)式增長的大數(shù)據(jù)時(shí)代,如何從海量數(shù)據(jù)中快速查找信息成為當(dāng)前研究的熱點(diǎn),Lucene軟件作為優(yōu)秀的開源全文檢索工具已被廣泛應(yīng)用于各種搜索引擎。文章通過對全文檢索原理與Lucene工具架構(gòu)的研究,從優(yōu)化內(nèi)存索引、索引壓縮處理、優(yōu)化磁盤索引等方面探討Lucene檢索效率的優(yōu)化。實(shí)驗(yàn)結(jié)果證明,通過優(yōu)化內(nèi)存索引、索引壓縮處理等方法可以有效地提高全文檢索的效率。
關(guān)鍵詞: 全文檢索; Lucene; 倒排索引; 檢索優(yōu)化
中圖分類號:TP393.08 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-828(2017)11-16-04
Research on the optimizing of full-text retrieval with Lucene
Hu Jie, Guo Qiaojin, Chen Bin
(The 28th Institute of China Electronics Technology Group Corporation, Nanjing, Jiangsu 210007, China)
Abstract: Today's society has entered the big data era with the explosive growth of information, how to find information quickly from massive data has become the current research hotspot, as an excellent open source full-text retrieval tool, Lucene has been widely used in all kinds of search engines. This paper studies the principle of full-text retrieval and the architecture of Lucene tool, and discusses the Lucene retrieval efficiency optimization from aspects of optimizing memory index, index compression processing and optimizing disk index. The experimental result proved that the efficiency of full-text retrieval can be improved effectively by optimizing memory index and index compression processing.
Key words: full-text retrieval; Lucene; inverted index; retrieval optimization
0 引言
當(dāng)今社會已經(jīng)進(jìn)入信息量爆發(fā)式增長的大數(shù)據(jù)時(shí)代。面對快速增長的海量數(shù)據(jù),基于SQL查詢的傳統(tǒng)數(shù)據(jù)庫已經(jīng)難以滿足數(shù)據(jù)檢索的需要,而且隨著多媒體技術(shù)的發(fā)展,文本、音頻、圖像等非結(jié)構(gòu)化數(shù)據(jù)也成為用戶主要的檢索對象。傳統(tǒng)數(shù)據(jù)庫查詢普遍存在檢索內(nèi)容覆蓋有限、檢索時(shí)間長等缺點(diǎn),最重要的是不能通過查詢數(shù)據(jù)中某個詞語獲得用戶實(shí)際需要的內(nèi)容,因此全文檢索技術(shù)作為現(xiàn)代信息檢索的核心技術(shù),已經(jīng)成為現(xiàn)有各種搜索引擎必不可少的功能。
Lucene是當(dāng)前應(yīng)用最廣泛的開源全文檢索項(xiàng)目,它提供了豐富的函數(shù)接口用于嵌入到其他應(yīng)用程序中,實(shí)現(xiàn)強(qiáng)大的全文索引和搜索功能。實(shí)際應(yīng)用中,Lucene可以從檢索效率、中文分詞、檢索精度等多方面開展檢索優(yōu)化,本文主要探討硬盤索引、內(nèi)存索引、索引壓縮處理等方面的檢索優(yōu)化。
1 全文檢索原理
全文檢索主要面向文本文檔,它通過一定的算法對文檔進(jìn)行語言和詞法分析,將文檔中每一個獨(dú)立的單詞進(jìn)行分離并對這些單詞建立索引,記錄這些單詞在文檔中出現(xiàn)的次數(shù)和位置[1]。當(dāng)用戶以這些單詞為關(guān)鍵字進(jìn)行查詢時(shí),檢索程序按照一定的算法直接在索引文件進(jìn)行查找,而不必在檢索時(shí)遍歷整個文檔。
全文檢索作為信息檢索的核心技術(shù)已廣泛應(yīng)用于Google、百度等主流的搜索引擎,用來實(shí)現(xiàn)網(wǎng)頁、文檔等非結(jié)構(gòu)化數(shù)據(jù)的檢索[2]。全文檢索與傳統(tǒng)的數(shù)據(jù)庫檢索相比,數(shù)據(jù)庫檢索只能檢索基于庫、表、字段等固定格式的結(jié)構(gòu)化數(shù)據(jù),而全文檢索卻能夠任意檢索各種無固定格式的非結(jié)構(gòu)化數(shù)據(jù)。
全文檢索包括文件預(yù)處理、索引構(gòu)建、檢索實(shí)現(xiàn)等三個步驟[3]。
⑴ 文件預(yù)處理:由于被檢索文件往往不是單純的文本數(shù)據(jù),全文檢索首先要對被檢索文件進(jìn)行一定的預(yù)處理,將各種類型文件進(jìn)行文本內(nèi)容的提取,同時(shí)過濾掉文本文件中的標(biāo)點(diǎn)符號和控制符等無關(guān)內(nèi)容,完成文本提取和符號過濾后,使用純文本文件替代原始文件準(zhǔn)備下一步的處理。
⑵ 索引構(gòu)建:掃描已處理的純文本文件,完成分詞處理后,將每個單詞出現(xiàn)的位置和頻率記錄下來,為了提高后續(xù)的檢索效率,一般采用倒排索引的方式進(jìn)行索引庫的構(gòu)建。當(dāng)掃描文檔時(shí),如果某個單詞第一次出現(xiàn),那么為該單詞建立一張新的索引表,用于記錄該單詞出現(xiàn)的位置與頻率;當(dāng)這個單詞再次出現(xiàn)時(shí),則在該單詞的索引表中記錄下文檔中出現(xiàn)的位置,同時(shí)將單詞頻率計(jì)數(shù)值加1。
⑶ 檢索實(shí)現(xiàn):檢索實(shí)現(xiàn)的過程是在已經(jīng)創(chuàng)建的索引表中查找匹配關(guān)鍵詞,這個過程包括兩步:首先通過詞法分析實(shí)現(xiàn)詞語的拆分,比如詞語“軟件設(shè)計(jì)”就會被拆分為“軟件”和“設(shè)計(jì)”兩個詞語,此時(shí)詞法分析與建立索引時(shí)詞法分析采用的是同一個規(guī)則;然后將檢索詞語與索引表進(jìn)行比對與匹配,如果“軟件”出現(xiàn)在第M篇文檔的第N個字節(jié),同時(shí)“設(shè)計(jì)”出現(xiàn)在該篇文檔的第N+4個字節(jié)處,則“軟件設(shè)計(jì)”詞語被命中匹配。endprint
2 Lucene工具
2.1 Lucene概述
Lucene是一個由Apache軟件基金管理的全文檢索項(xiàng)目[4],它提供了完整的查詢引擎與索引引擎以及部分文本分析引擎。
為了能夠適應(yīng)不同的操作系統(tǒng)和軟件平臺,Lucene工具庫定義了以8位字節(jié)為單位的索引文件格式[5],并采用了分層的數(shù)據(jù)結(jié)構(gòu):詞(Term)是索引的最小單位,它表示一個處理后的關(guān)鍵字以及該關(guān)鍵字在文件中的位置與頻率;多個相關(guān)的詞形成域(Field),域是一個包括域名和域值的二元數(shù)組,通常一篇文章的題目、作者、發(fā)表日期都可以保存在不同的域中;多個相關(guān)的域形成文檔(Document),通常把文檔看作索引的基本單位,每個文檔都有一個惟一的標(biāo)識號;多個文檔可以形成段(Segment),段(又稱子索引)是索引層次結(jié)構(gòu)的最高層,索引就是由若干個段組成,不同的段文件之間可以合并,并且能夠單獨(dú)地進(jìn)行搜索與維護(hù)[6]。
如圖1所示,Lucene的層次索引架構(gòu)能夠有效地提高全文檢索的效率,它按照段、文檔、域、詞的分級模式搜索相關(guān)數(shù)據(jù),避免遍歷索引中的每一條詞(Term)數(shù)據(jù),尤其是在海量數(shù)據(jù)檢索時(shí)效率提升更加明顯[7]。Lucene索引文件同時(shí)保存了正向信息和反向信息,其中正向信息是從索引到段、一直到詞(索引->段->文檔->域->詞)的正向索引關(guān)系,而反向信息是從詞到文檔(詞->域->文檔)的反向索引關(guān)系,即倒排索引。倒排索引是一種基于鍵值對(key/value)的索引方法,其中鍵(key)表示文檔中出現(xiàn)的所有關(guān)鍵詞,而值(value)表示包含該關(guān)鍵詞的文檔集合信息,鍵值對記錄了文檔中關(guān)鍵詞與關(guān)鍵詞在文檔中存儲位置的映射關(guān)系[8]。
2.2 Lucene結(jié)構(gòu)組成
Lucene的總體結(jié)構(gòu)與索引過程如圖2所示,它包括索引管理和搜索索引兩部分:索引管理負(fù)責(zé)從外部的數(shù)據(jù)庫、文件系統(tǒng)、網(wǎng)站或人工輸入方式搜集數(shù)據(jù),為這些數(shù)據(jù)構(gòu)建索引文件并進(jìn)行管理,其中數(shù)據(jù)抓取功能由外部的應(yīng)用程序?qū)崿F(xiàn);當(dāng)外部的應(yīng)用程序提出檢索請求時(shí),搜索索引負(fù)責(zé)解析用戶輸入的檢索語句,將外部輸入的檢索語句翻譯成Lucene能夠識別的搜索語句,搜索引擎根據(jù)搜索語句在索引文件中進(jìn)行比對匹配,最后將匹配的檢索結(jié)果返回給用戶[9]。
Lucene主要由analysis、index、store、search、queryParser、util等模塊組成,其中analysis作為語言分析器,主要負(fù)責(zé)對文檔進(jìn)行詞法分析和語言處理,最終形成詞(Term),index負(fù)責(zé)實(shí)現(xiàn)索引創(chuàng)建、索引刪除等索引管理功能,store負(fù)責(zé)實(shí)現(xiàn)索引數(shù)據(jù)的底層I/O存取操作,search負(fù)責(zé)實(shí)現(xiàn)檢索管理功能,即根據(jù)指定的查詢條件檢索得到結(jié)果,queryParser負(fù)責(zé)對用戶的查詢語句進(jìn)行語法分析,包括多個關(guān)鍵詞的與、或、非等各種運(yùn)算,util提供了文檔編碼、字節(jié)結(jié)構(gòu)等公用的輔助功能類[10]。
3 檢索效率優(yōu)化探討
3.1 優(yōu)化內(nèi)存索引
通過對索引建立過程的研究和分析,可以發(fā)現(xiàn)整個索引建立的過程,同時(shí)也是一個磁盤讀寫的過程。磁盤讀寫的效率嚴(yán)重影響著建立索引的效率,這也是索引建立的性能瓶頸。為了減少磁盤讀寫效率的影響,提高建立索引的效率,可以通過改變索引建立過程中的合并閾值,從而增加索引緩沖區(qū)和索引文件中的文檔數(shù),減少由內(nèi)存往硬盤寫索引的頻率,達(dá)到提高創(chuàng)建索引效率的目的。為了實(shí)現(xiàn)這個優(yōu)化過程,需要設(shè)置IndexWriter對象的mergeFactor、maxMergeDocs、minMergeDocs參數(shù)。
首先,Lucene工具將文檔對象讀入內(nèi)存,形成單一段索引,當(dāng)內(nèi)存中的單一段索引達(dá)到minMergeDocs時(shí),就合并成一個段索引并寫入磁盤。然后,當(dāng)磁盤上的段索引數(shù)目達(dá)到 mergeFactor時(shí),就將段索引合并成為一個較大的段索引,但是,由于每個段索引都存在一個包含文檔數(shù)目的上限maxMergeDocs,所以這個合并過程也不是無限制的。通過分析可知,合理地調(diào)整這3個參數(shù)值,可以有效地提高索引性能。
3.2 索引壓縮處理
檢索優(yōu)化的一個關(guān)鍵目標(biāo)就是通過一些算法來減少I/O開銷和存儲開銷,索引文件的大小決定其所占用的存儲開銷。此外,由于大索引文件需要更大的I/O帶寬來讀取,因此其大小也直接影響了檢索的處理時(shí)間,這里以哈夫曼編碼為例介紹無損壓縮的編碼方式。哈夫曼編碼是一種可變字長編碼,它通過使用較短的碼字標(biāo)識出現(xiàn)頻率較高的信源符號,而出現(xiàn)頻率較低的信源符號用較長的碼字來編碼,從而實(shí)現(xiàn)平均碼長最短,達(dá)到數(shù)據(jù)壓縮的目的[11]。
利用哈夫曼編碼進(jìn)行文件壓縮的原理如下:首先將文件看作一個單符號信源,而每個文件都是由多個8位字節(jié)組成,每個字節(jié)的內(nèi)容最多有256(28)種可能,所以可將文件視作由不超過256種字符形成的組合。然后掃描待壓縮的索引文件,統(tǒng)計(jì)文件中出現(xiàn)的每一個字符及出現(xiàn)的概率,將字符按由高到低的概率進(jìn)行排序。最后以字符出現(xiàn)的頻率作為權(quán)值,通過構(gòu)造哈夫曼樹,生成碼長最短的二進(jìn)制前綴編碼。
3.3 優(yōu)化磁盤索引
通過對建立索引過程的研究和分析可知,Lucene建立索引的過程是先分別在磁盤上生成若干個較小的段索引,當(dāng)它達(dá)到mergeFactor后,就合并這些索引。但是這樣建立索引后,仍然可能會剩下很多索引文件,可以將磁盤中的若干個索引文件再次合并一個索引文件,減少由硬盤往內(nèi)存讀寫索引的頻率,達(dá)到提高檢索效率的目的。
當(dāng)然,針對磁盤的索引優(yōu)化也需要選擇合理的時(shí)機(jī),實(shí)踐驗(yàn)證表明,如果在索引生成過程中使用上述方法,那么索引創(chuàng)建的時(shí)間將比平常索引創(chuàng)建時(shí)間多出幾十倍,因此最優(yōu)的方法是選擇索引建立完成后且短期內(nèi)不再發(fā)生索引變更的時(shí)機(jī)進(jìn)行合并操作,這樣才不會出現(xiàn)合并操作與索引建立兩者之間的沖突。endprint
4 實(shí)驗(yàn)及結(jié)果
實(shí)驗(yàn)采用64位紅帽 Linux 6.1企業(yè)版操作系統(tǒng),集成開發(fā)環(huán)境為Eclipse 4.5版本,硬件平臺采用Intel core i7處理器、8G內(nèi)存和1T硬盤。實(shí)驗(yàn)選擇15萬篇網(wǎng)絡(luò)下載的文檔,實(shí)驗(yàn)結(jié)果如表1所示。
實(shí)驗(yàn)證明,在內(nèi)存足夠大的情況下,通過增加MergeFactor參數(shù)確實(shí)可以提高索引建立的吞吐量,即提高索引創(chuàng)建的速度,但是如果設(shè)置過高,可能存在突破操作系統(tǒng)文件描述符上限的風(fēng)險(xiǎn),因此需要根據(jù)實(shí)際應(yīng)用場景設(shè)置合理的參數(shù)值。
在索引壓縮處理實(shí)驗(yàn)中,將MergeFactor值統(tǒng)一設(shè)置為10,實(shí)驗(yàn)結(jié)果表明當(dāng)索引文件相對較小且不超過機(jī)器內(nèi)存時(shí),索引壓縮處理對于效率提升也是相對有限的,只有在索引文件較大且遠(yuǎn)大于機(jī)器內(nèi)存時(shí),能明顯提升索引處理效率,試驗(yàn)結(jié)果如表2所示。
對于優(yōu)化磁盤索引實(shí)驗(yàn),由于將磁盤中的若干個索引文件合并為一個索引文件,由于每次合并操作時(shí)這些小的索引文件數(shù)量和大小具有一定的不確定性,因此在效率優(yōu)化的實(shí)際實(shí)驗(yàn)結(jié)果中存在較大的偏差,有些情況下效果較好,而有些情況效率提升不明顯,這里不再一一列舉。
5 結(jié)束語
本文通過研究優(yōu)化硬盤索引、優(yōu)化內(nèi)存索引、索引壓縮處理等方法,探討基于Lucene全文檢索效率的優(yōu)化。實(shí)驗(yàn)結(jié)果表明,通過優(yōu)化內(nèi)存索引、索引壓縮處理等方法可以有效地提高全文檢索的效率,而優(yōu)化磁盤索引則對效率提升有限,存在較大的不確定性??傮w而言,索引效率優(yōu)化需要針對具體的業(yè)務(wù)環(huán)境,需要綜合考慮機(jī)器配置、索引文件數(shù)量與大小等多種因素,只有選擇合適的優(yōu)化方法才能有效地提高全文檢索的效率。當(dāng)然,Lucene檢索效率優(yōu)化還可以從多線程、并行處理等軟件開發(fā)角度去進(jìn)一步嘗試,這些方法還有待于進(jìn)一步的深入研究。
參考文獻(xiàn)(References):
[1] 黃承慧,印鑒,陸寄遠(yuǎn).一種改進(jìn)的Lucene語義相似度檢索算
法[J].中山大學(xué)學(xué)報(bào):自然科學(xué)版,2011.50(2).
[2] 趙珂,逯鵬,李永強(qiáng).基于Lucene的搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)[J].
計(jì)算機(jī)工程,2011.37(16):39-41
[3] 義天鵬,陳啟安.基于Lucene的中文分析器分詞性能比較研
究[J].計(jì)算機(jī)工程,2012.38(22):279-282
[4] 胡長春,劉功申.面向搜索引擎Lucene的中文分析器[J].計(jì)算
機(jī)工程與應(yīng)用,2009.45(12):157-159
[5] 吳廣君,王樹鵬,陳明等.海量結(jié)構(gòu)化數(shù)據(jù)存儲檢索系統(tǒng)[J].計(jì)
算機(jī)研究與發(fā)展,49(S1):1-5
[6] 黃江平,黃理燦,徐玲.基于Lucene的PDF文檔的全文檢索的
實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2012.25(5):10
[7] 吳代文,楊方琦.Lucene在數(shù)據(jù)庫全文檢索中的性能研究[J].
微計(jì)算機(jī)應(yīng)用,2011.32(6):53-58
[8] 李永春,丁華福.Lucene的全文檢索的研究與應(yīng)用[J].計(jì)算機(jī)
技術(shù)與發(fā)展,2010.20(2):12-15.
[9] 王歡,孫瑞志.基于領(lǐng)域本體和 Lucene 的語義檢索系統(tǒng)研究[J].
計(jì)算機(jī)應(yīng)用,2010.30(6):1655-1657
[10] 姜鑫,余平.基于Lucene的音視頻資源檢索系統(tǒng)的研究與
實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用與軟件,2011.28(11):245-248
[11] 張鳳林,劉思峰.Huffman~*:一個改進(jìn)的Huffman數(shù)據(jù)壓縮
算法[J].計(jì)算機(jī)工程與應(yīng)用,2007.43(2):73-74endprint