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