摘 要:針對(duì)工建設(shè)領(lǐng)域信息公開(kāi)系統(tǒng)信息檢索的需求,在Lucene的基礎(chǔ)上,設(shè)計(jì)并實(shí)現(xiàn)了近實(shí)時(shí)的全文檢索系統(tǒng),核心模塊包括語(yǔ)言處理模塊、索引管理模塊和檢索模塊。通過(guò)研究Lucene的內(nèi)部原理,對(duì)中文分詞IKAnalyser擴(kuò)展同義詞。
關(guān)鍵詞:Lucene;全文檢索;近實(shí)時(shí)
中圖分類(lèi)號(hào):TP391.3;TP393.092
近年來(lái),政府積極增加工程建設(shè)領(lǐng)域信息公開(kāi)透明度。在工程建設(shè)領(lǐng)域項(xiàng)目信息和信用信息公開(kāi)共享系統(tǒng)中,可以獲得任一項(xiàng)目信息和信用信息。面對(duì)巨大的信息,為用戶(hù)提供快速準(zhǔn)確的檢索到所需有效信息的方法非常必要。
目前,常見(jiàn)的大型搜索引擎[1]有Google,Baidu,Yahoo等,但這種搜索引擎并不適應(yīng)于中小型的站內(nèi)搜索。傳統(tǒng)數(shù)據(jù)庫(kù)的索引的更新會(huì)導(dǎo)致大量的I/O操作,且不能索引附件,而由Doug Cutting設(shè)計(jì)開(kāi)發(fā)的開(kāi)源搜索引擎Lucene的目標(biāo)是為各種中小型應(yīng)用程序加入全文檢索功能,Lucene不是一個(gè)完整的全文索引應(yīng)用,而是一個(gè)引擎工具包,它可以方便的嵌入到各種應(yīng)用中實(shí)現(xiàn)針對(duì)應(yīng)用的全文檢索功能。
1 開(kāi)源全文檢索引擎Lucene
Lucene是一個(gè)高效可擴(kuò)展的全文檢索庫(kù),用Java實(shí)現(xiàn),無(wú)須配置, 僅支持純文本文件的索引和搜索,不負(fù)責(zé)由其他格式的文件抽取純文本文件,或從網(wǎng)絡(luò)中抓取文件的過(guò)程。
Lucene源碼中共包括7個(gè)模塊[2],其中主要的有analysis模塊主要負(fù)責(zé)詞法分析及語(yǔ)言處理而形成Term;index模塊主要負(fù)責(zé)索引的創(chuàng)建;store模塊主要負(fù)責(zé)索引的讀寫(xiě);QueryParser主要負(fù)責(zé)語(yǔ)法分析;search模塊主要負(fù)責(zé)對(duì)索引的搜索;similarity模塊主要負(fù)責(zé)對(duì)相關(guān)性打分的實(shí)現(xiàn)。
Lucene有索引和檢索的兩個(gè)過(guò)程,包含索引創(chuàng)建,索引,檢索三個(gè)要點(diǎn)。
2 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
系統(tǒng)采用B/S三層架構(gòu),開(kāi)發(fā)框架采用SSH框架,開(kāi)發(fā)工具是Myeclipse 6.0,Tomcat 5.5和SQL Server 2005。系統(tǒng)核心模塊包括語(yǔ)言處理模塊、索引管理模塊和檢索模塊。
2.1 語(yǔ)言處理模塊
Lucene的檢索過(guò)程是將輸入的關(guān)鍵詞與已建好的索引匹配,索引使文章的關(guān)鍵詞與文章建立了對(duì)應(yīng)關(guān)系,而分詞器就是用于切分文章得到關(guān)鍵詞的工具。
Lucene分詞的流程為:
由Reader讀入數(shù)據(jù)流,Tokenizer 將數(shù)據(jù)流轉(zhuǎn)換為語(yǔ)匯單元,TokenFilter對(duì)語(yǔ)匯單元進(jìn)行過(guò)濾操作,最后得到TokenStream。
Lucene并未提供很好的中文分詞,本系統(tǒng)采用第三方分詞器IKAnalyser[3],并對(duì)其擴(kuò)展同義詞查詢(xún)。同義詞詞庫(kù)以.dic文件保存,每行兩個(gè)詞以逗號(hào)隔開(kāi),將.dic文件按行讀入后以map(key,value)形式存放。利用map.get(String token)檢查tokenStream中詞元是否有同義詞,如果有則存入棧內(nèi),保存當(dāng)前詞元的信息,清空保存詞元的變量CharTermAttribute,將同義詞加入其中,同時(shí)將詞與詞的位置增量設(shè)為0,即setPositionIncrement(0),從而實(shí)現(xiàn)將同義詞加入到tokenStream中。
2.2 索引管理模塊
該模塊實(shí)現(xiàn)索引建立和索引的管理。提供更新、刪除、添加和重構(gòu)索引的功能。重構(gòu)索引是對(duì)索引進(jìn)行刪除和重新建立并提供手動(dòng)和定時(shí)執(zhí)行兩種方式。
用戶(hù)總希望實(shí)時(shí)檢索到更新后的信息,即數(shù)據(jù)發(fā)生變化后,需由writer.commit()提交索引寫(xiě)入硬盤(pán),但該函數(shù)會(huì)隨著索引的增加效率越來(lái)越低。Lucene提供的近實(shí)時(shí)檢索是由NRTManager來(lái)管理一切,當(dāng)更新數(shù)據(jù)后,先將索引保存到內(nèi)存,在某個(gè)時(shí)間提交內(nèi)存中索引,寫(xiě)入硬盤(pán),檢索時(shí)直接檢索內(nèi)存。NRTManager的getSearcherManager(true)方法獲取線程安全的SearcherManager來(lái)管理IndexSearcher,當(dāng)索引更新時(shí),需要重新獲取IndexSearcher,SearcherManager每隔一小段時(shí)間執(zhí)行maybereopen()重新讀取已更新的索引,從而實(shí)現(xiàn)了近實(shí)時(shí)的全文檢索。
圖1是建立索引的流程圖,IndexField存儲(chǔ)建立索引的字段,field2doc()實(shí)現(xiàn)將IndexField轉(zhuǎn)換為L(zhǎng)ucene可處理類(lèi)型Document,TempIndex記錄暫存于內(nèi)存中還未寫(xiě)入硬盤(pán)的索引,以免發(fā)生意外,導(dǎo)致信息不一致。
2.3 檢索模塊
由語(yǔ)言處理模塊對(duì)用戶(hù)輸入的關(guān)鍵詞進(jìn)行處理得到一系列term,將索引讀入內(nèi)存,通過(guò)檢索模塊檢索,得到每個(gè)term的文檔鏈表,對(duì)文檔鏈表進(jìn)行交、差操作,得到結(jié)果文檔,而后按相關(guān)度和時(shí)間排序并向用戶(hù)分頁(yè)顯示查詢(xún)結(jié)果。
圖2是檢索流程圖,scoreAfter(ScoreDoc scoreDoc,Query query,int viewNum)實(shí)現(xiàn)分頁(yè)顯示,scoreDoc獲得當(dāng)前頁(yè)的第一條結(jié)果,query實(shí)現(xiàn)多字段查詢(xún),viewNum是頁(yè)面顯示結(jié)果條數(shù)。Index封裝jsp頁(yè)面要顯示的字段,標(biāo)題title、內(nèi)容摘要content、發(fā)布人creatorName、發(fā)布單位chushiName、發(fā)布時(shí)間createTime、類(lèi)型type。
3 總結(jié)
本文采用Lucene技術(shù)結(jié)合實(shí)際需求,實(shí)現(xiàn)了基于Lucene的全文檢索系統(tǒng),主要模塊包括語(yǔ)言處理模塊、索引管理模塊和檢索模塊。本文不足之處是,限于實(shí)際硬件條件和數(shù)據(jù)量,本系統(tǒng)還需要進(jìn)行優(yōu)化。
參考文獻(xiàn):
[1]張蕾.基于Lucene的站內(nèi)電子檔案檢索系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2012,4.
[2]勞志佳.J基于Lucene 3.5搜索技術(shù)的研究與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2012,2.
[3]義天鵬,陳啟安.基于Lucene的中文分析器分詞性能比較研究[J].計(jì)算機(jī)工程,2012,11.
作者簡(jiǎn)介:李麗枝(1987.5.17-),女,河北省無(wú)極縣人,碩士研究生,研究方向:數(shù)據(jù)庫(kù)理論與信息系統(tǒng)。
作者單位:沈陽(yáng)理工大學(xué),沈陽(yáng) 110168;遼寧省信息中心,沈陽(yáng) 110002