胡宏偉,虞 萍,周 南,喬 軍
(中國農(nóng)業(yè)大學(xué)網(wǎng)絡(luò)中心,北京 100083)
近年來,隨著文獻(xiàn)資料數(shù)量的持續(xù)增長及其影響力的日益擴(kuò)大,文獻(xiàn)資料的重要性也在逐漸增加。有鑒于此,許多單位建立了專門的內(nèi)部文獻(xiàn)管理系統(tǒng),實(shí)現(xiàn)了內(nèi)部文獻(xiàn)資料的集中存儲和管理,促進(jìn)了文獻(xiàn)資料的應(yīng)用和推廣。
然而,由于現(xiàn)有的文獻(xiàn)管理系統(tǒng)多采用目錄檢索或數(shù)據(jù)庫查詢方式,使得其在為用戶提供豐富文獻(xiàn)資料的同時也給用戶的文獻(xiàn)查詢帶來了新的問題,即用戶很難采用常規(guī)的檢索方式實(shí)現(xiàn)文獻(xiàn)的快速準(zhǔn)確查詢。因此,如何建立一種能從海量的文獻(xiàn)資料中快速、準(zhǔn)確查找所需文獻(xiàn)的檢索系統(tǒng),就顯得很有必要。
研究表明,實(shí)現(xiàn)海量電子資料快速、準(zhǔn)確檢索的核心技術(shù)是全文檢索[1]。全文檢索可以按照一定的策略對電子信息進(jìn)行組織和處理,并能通過特定的方法實(shí)現(xiàn)信息的快速、準(zhǔn)確檢索?,F(xiàn)階段,實(shí)現(xiàn)全文檢索的工具很多,其中Lucene是當(dāng)今最為流行的開源全文檢索工具包之一[1-2]。
全文檢索是一種實(shí)現(xiàn)電子資料中的信息與檢索項(xiàng)快速匹配的檢索方法[3],它以各種計算機(jī)數(shù)據(jù)(包括文本、圖像、音視頻等)作為處理對象,通過掃描其內(nèi)容,為每一個詞建立索引;在用戶查詢時,檢索程序則根據(jù)已建立的索引進(jìn)行查找和匹配,并將查找結(jié)果反饋給用戶[4-5],從而實(shí)現(xiàn)電子資料的快速查找。
全文檢索一般包括信息獲取和存儲、信息索引創(chuàng)建、信息檢索和用戶搜索界面4個部分:
1)信息獲取和存儲。全文檢索的信息獲取方式一般有2種:一是通過網(wǎng)絡(luò)爬蟲方式獲取互聯(lián)網(wǎng)中其他網(wǎng)站中的信息,類似于百度、google等全文檢索引擎;二是在信息產(chǎn)生過程中直接獲取信息,如企業(yè)級網(wǎng)站全文檢索的信息獲取。獲取后的信息一般存放到系統(tǒng)的存儲設(shè)備中,為了檢索和查閱的方便,信息的存儲一般按照固定的格式,例如標(biāo)題、內(nèi)容、作者和發(fā)布日期等。
2)信息索引創(chuàng)建。索引創(chuàng)建是指在信息獲取后,通過掃描信息中的每一個詞,建立一個能精確定位到每個詞的索引,然后將該索引添加到索引文件中,從而完成索引的創(chuàng)建。
3)信息檢索。信息檢索一般由用戶發(fā)起請求,檢索程序根據(jù)用戶提交的關(guān)鍵字對索引文件進(jìn)行檢索,并通過一系列的計算、合并和篩選等操作獲得查詢結(jié)果,最后將查詢結(jié)果返回給用戶,完成檢索過程。
4)用戶搜索界面。用戶搜索界面主要實(shí)現(xiàn)用戶檢索詞的輸入、查詢結(jié)果顯示等功能。
Lucene是一個完全開放源代碼的全文檢索工具包[6]。它最初由Doug Cutting開發(fā)并于2010年捐獻(xiàn)給Apache軟件基金會,Lucene目前是Jakara項(xiàng)目組的一個子項(xiàng)目。Lucene最初是用Java開發(fā)的,隨著項(xiàng)目的發(fā)展和應(yīng)用的不斷推廣,Lucene逐漸被翻譯成了C、C++、C#、Perl等多種語言。
Lucene不是一個完整的全文檢索引擎,而是一個提供了完整的索引引擎和查詢引擎的架構(gòu)。它為數(shù)據(jù)的訪問和管理提供了簡單的函數(shù)調(diào)用接口,可以方便地嵌入到各種應(yīng)用中實(shí)現(xiàn)針對應(yīng)用的全文索引/檢索功能。目前Lucene已被許多項(xiàng)目作為開發(fā)引擎,如 Eclipise、Jive、Conoon和 Eyebrows等[7]。
Java版Lucene的體系結(jié)構(gòu)由基礎(chǔ)結(jié)構(gòu)封裝、索引核心和對外接口3部分組成,分為7個JAR包[8],如圖1 所示。
圖1 Lucene體系結(jié)構(gòu)
索引核心部分包含org.apache.lucene.index和org.apache.lucene.store 2個JAR包:index包提供了索引的創(chuàng)建接口,實(shí)現(xiàn)了索引記錄的增加、更新、刪除及讀取記錄等功能;store包提供了底層I/O的存儲結(jié)構(gòu),負(fù)責(zé)索引的讀寫等數(shù)據(jù)存儲管理。
基礎(chǔ)結(jié)構(gòu)封裝部分包含org.apache.lucene.document和 org.apache.lucene.utit 2個 JAR包:document包提供了索引文檔需要的類,包括Document和Field等;util包含了一些公共的數(shù)據(jù)結(jié)構(gòu)。
對外接口部分包括org.apache.lucene.search、org.apache.lucene.queryPaser和 org.apache。
lucene.analysis含3個JAR包:search包是lucene的檢索接口,它提供了在索引文件上進(jìn)行查詢所需要的類。常用的包括IndexSearcher和Hits 2個類,其中IndexSearcher類定義了在指定的索引上進(jìn)行搜索的方法;Hits類則用來保存搜索得到的結(jié)果。queryPaser包是查詢分析器接口,負(fù)責(zé)語法分析,實(shí)現(xiàn)關(guān)鍵詞間的與、或、非等運(yùn)算操作;analysis包是語言分析器,主要用于切分詞。lucene提供了針對不同語言的分詞,開發(fā)人員也可以在此基礎(chǔ)上進(jìn)行不同語言分詞器的開發(fā)。
作為一個開源的全文搜索引擎,Lucene有以下特點(diǎn):
1)Lucene是完全開放源代碼的搜索引擎工具,開發(fā)者不僅可以充分利用其現(xiàn)有的功能,還可以在此基礎(chǔ)上根據(jù)實(shí)際需要進(jìn)行針對性的開發(fā),滿足不同程度用戶的需求。Lucene面向?qū)ο蟮南到y(tǒng)架構(gòu)也使得其具有良好的可擴(kuò)展性,易于進(jìn)行新模塊的開發(fā)。
2)Lucene采用獨(dú)立于應(yīng)用平臺的索引文件,使不同平臺的項(xiàng)目能夠共享索引文件。它還設(shè)計了獨(dú)立于語言和文件格式的文本分析接口,能夠方便地實(shí)現(xiàn)不同語言和文件格式的擴(kuò)展。
3)Lucene采用了分塊索引模式,在進(jìn)行索引更新時,可以通過建立小的索引文件提升索引速率,然后再通過與原有文件的合并達(dá)到效率優(yōu)化的目的。
本文采用J2EE架構(gòu)進(jìn)行文獻(xiàn)資料全文檢索系統(tǒng)的開發(fā)。系統(tǒng)采用Struts,Hibernate和Spring框架的5層軟件開發(fā)架構(gòu)[9]。系統(tǒng)整體框架包括WEB瀏覽器上的用戶層、J2EE服務(wù)器上的WEB層、業(yè)務(wù)邏輯層、數(shù)據(jù)持久層以及數(shù)據(jù)庫服務(wù)器上的數(shù)據(jù)層,系統(tǒng)架構(gòu)如圖2所示。
圖2 系統(tǒng)開發(fā)架構(gòu)
各層的功能如下:用戶層主要是指用戶瀏覽器上的HTML頁面,用戶通過其向WEB層發(fā)起應(yīng)用請求,實(shí)現(xiàn)用戶的需求;WEB層主要采用JSP和Struts對用戶的請求進(jìn)行呼應(yīng);業(yè)務(wù)邏輯層采用Spring框架,它是一種控制反轉(zhuǎn)和面向容器輕量級的容器框架;數(shù)據(jù)持久層采用Hibernate框架,實(shí)現(xiàn)了對象、關(guān)系之間的映射和數(shù)據(jù)的持久化;數(shù)據(jù)層采用Mysql數(shù)據(jù)庫和索引文件庫,實(shí)現(xiàn)對文獻(xiàn)數(shù)據(jù)及文獻(xiàn)索引的增、刪、改、查等操作。
文獻(xiàn)資料全文檢索系統(tǒng)主要實(shí)現(xiàn)了文獻(xiàn)資料的收集和全文檢索兩大主要功能。其中,文獻(xiàn)資料收集部分主要實(shí)現(xiàn)文獻(xiàn)資料提交、存儲和審核管理等功能;而全文檢索部分實(shí)現(xiàn)文獻(xiàn)資料的索引和數(shù)據(jù)檢索等功能。
本文將完整的文獻(xiàn)資料設(shè)計為屬性信息和對象文件兩部分:文獻(xiàn)的屬性信息包括文獻(xiàn)標(biāo)題、作者、出版或收錄單位、文獻(xiàn)摘要、關(guān)鍵字等信息;而文獻(xiàn)的內(nèi)容則存儲在對象文件,對象文件由txt、html、word、pdf、ppt、excel等多種格式。本文對文獻(xiàn)資料的收集、索引和檢索操作也基于這兩部分開展。
根據(jù)系統(tǒng)的功能分析,本系統(tǒng)的設(shè)計思路分為4個步驟,其流程如圖3所示。首先,由用戶通過文獻(xiàn)資料提交系統(tǒng)提交文獻(xiàn)資料,文獻(xiàn)資料提交成功后將存放到存儲系統(tǒng)中;第二,由管理員審核用戶提交的文獻(xiàn)資料;第三,系統(tǒng)對通過審核的文獻(xiàn)資料進(jìn)行轉(zhuǎn)換、清洗和全文索引創(chuàng)建;第四,用戶通過檢索頁面提交檢索請求,由Lucene檢索引擎進(jìn)行檢索操作并向用戶返回檢索結(jié)果。
圖3 文獻(xiàn)資料全文檢索流程
根據(jù)系統(tǒng)分析和設(shè)計思路,本文將校內(nèi)文獻(xiàn)全文檢系統(tǒng)劃分為5個模塊,包括文獻(xiàn)資料管理模塊、數(shù)據(jù)存儲模塊、數(shù)據(jù)解析與轉(zhuǎn)換模塊、文獻(xiàn)索引模塊、文獻(xiàn)檢索模塊。各模塊的功能如下:
文獻(xiàn)資料管理模塊:實(shí)現(xiàn)用戶文獻(xiàn)資料的提交、編輯以及管理員對文獻(xiàn)資料的審核、編輯和管理等操作。
文獻(xiàn)資料存儲模塊:存儲用戶提交的文獻(xiàn)資料屬性信息和對象文件,并建立屬性信息和對象文件的1-1對應(yīng)關(guān)系。
數(shù)據(jù)解析與轉(zhuǎn)換模塊:從關(guān)系數(shù)據(jù)庫中讀取文獻(xiàn)資料的屬性信息并從對象文件抽取文件內(nèi)容,通過轉(zhuǎn)換和清洗操作將文獻(xiàn)資料的屬性信息和對象文件內(nèi)容轉(zhuǎn)變?yōu)榭杀籐ucence索引的數(shù)據(jù)格式。
文獻(xiàn)索引模塊:利用Lucence搜索引擎對文獻(xiàn)資料進(jìn)行全文索引,實(shí)現(xiàn)索引的建立、更新和刪除等操作。
文獻(xiàn)檢索模塊:通過檢索頁面對被索引的文獻(xiàn)資料進(jìn)行全文檢索,包括對各個字段關(guān)鍵詞的邏輯操作后的綜合檢索等。
其中文獻(xiàn)資料存儲、數(shù)據(jù)解析與轉(zhuǎn)換、文獻(xiàn)索引和檢索4個模塊是系統(tǒng)的核心技術(shù)部分,本文的實(shí)現(xiàn)部分也針對這4個模塊開展。
根據(jù)校內(nèi)文獻(xiàn)資料的特點(diǎn),本文文獻(xiàn)資料的存儲將采用數(shù)據(jù)庫和文件系統(tǒng)2種方式。文獻(xiàn)資料的對象文件存放到文件系統(tǒng),對象文件提交成功后,系統(tǒng)按照上傳日期和隨機(jī)數(shù)重命名對象文件,確保對象文件名稱的唯一性;文獻(xiàn)資料的屬性信息和對象文件的路徑及名稱則存放到Mysql數(shù)據(jù)表中并與對象文件形成1-1對應(yīng)關(guān)系。數(shù)據(jù)庫中文獻(xiàn)資料的表結(jié)構(gòu)如表1所示。
表1 文獻(xiàn)資料表結(jié)構(gòu)
由于 Lucene只支持對 Document對象的索引[10],因此文獻(xiàn)資料的信息需要轉(zhuǎn)換成Document支持的數(shù)據(jù)格式。根據(jù)Document的格式特點(diǎn),數(shù)據(jù)庫中的屬性信息一般可以直接進(jìn)行索引,而存放到文件系統(tǒng)中的對象文件則需要通過讀取、清洗等操作轉(zhuǎn)化為文本格式。本文中對象文件有txt、html、word、pdf、ppt、excel等多種不同格式。為了讀取對象,本文設(shè)計了不同對象文件的讀取方式,并基于不同的Java包實(shí)現(xiàn)了對象文件的讀取,其過程如圖4所示。
實(shí)現(xiàn)對象文件內(nèi)容抽取與解析的核心代碼如下:
本文利用apache的poi包讀取word內(nèi)容的核心代碼,實(shí)現(xiàn)word文件讀取的核心代碼如下:
圖4 對象文件解析與轉(zhuǎn)換
文獻(xiàn)資料信息被解析和轉(zhuǎn)換后就可以進(jìn)行索引操作了。文獻(xiàn)索引就是利用Lucene全文索引技術(shù)將解析和轉(zhuǎn)換后的文獻(xiàn)資料生成一條條的索引記錄并將其添加到索引文件的過程。文獻(xiàn)索引實(shí)現(xiàn)了全文索引記錄、文獻(xiàn)屬性信息和對象文件三者間的關(guān)聯(lián)。
Lucene搜索引擎的全文索引主要由寫索引器(IndexWriter)、文檔(Document)和域(Field)3個類來實(shí)現(xiàn)[11-121。在Lucence中,索引建立分為4個步驟:第一步,首先要創(chuàng)建索引文件目錄(Directory),它負(fù)責(zé)存儲索引記錄,索引文件的存儲有內(nèi)存、文件系統(tǒng)和數(shù)據(jù)庫3種方式,本文的索引文件的存儲采用文件系統(tǒng)方式;第二步,創(chuàng)建 IndexWriter索引器,它接受新的Document文檔,并將其寫入索引文件中;第三步,建立Document文檔,并為其添加Field對象,每個Document文檔對應(yīng)著一個文獻(xiàn)資料對象,Documet通過Filed對象存儲了文獻(xiàn)資料的各類信息(包括文檔id、標(biāo)題、作者、內(nèi)容等);第四步,利用IndexWriter索引器對Document進(jìn)行索引,并將其寫入索引文件,完成索引。文獻(xiàn)資料的索引過程如圖5所示:
圖5 文獻(xiàn)資料索引過程
實(shí)現(xiàn)資料全文索引的核心代碼如下:
文獻(xiàn)檢索是指利用Lucene的全文檢索引擎實(shí)現(xiàn)文獻(xiàn)資料的查詢功能[13-14],它根據(jù)用戶輸入的查詢語句將符合條件的索引信息從索引文件中提取出來,并將結(jié)果返回給用戶。文獻(xiàn)檢索一共包含以下幾個過程:首先,用戶通過查詢頁面輸入查詢語句;其次,利用Query對象封裝查詢語句并利用Analyzer對象分析查詢語句;第三,打開索引文件,通過SearcherManage獲得IndexSearcher對象;第四,利用IndexSearcher對象進(jìn)行查詢,并將查詢結(jié)果返回到Hits結(jié)果集中;第五,將查詢結(jié)果展現(xiàn)在查詢頁面中。
利用Lucence實(shí)現(xiàn)文獻(xiàn)材料全文檢索的核心代碼如下:
除了基本查詢之外,本文還利用BooleanQuery實(shí)現(xiàn)了對文獻(xiàn)作者、關(guān)鍵詞、出版單位等多條件的布爾查詢,并基于RangeQuery實(shí)現(xiàn)了出版時間的范圍查詢。
系統(tǒng)開發(fā)完成后,本文分別利用Lucene和關(guān)系數(shù)據(jù)庫Sql Server 2005對10萬條文本數(shù)據(jù)進(jìn)行了檢索測試。系統(tǒng)試驗(yàn)環(huán)境中CPU為Intel Xeon 1.86 GHz,內(nèi)存為三星4GB DDR3 ×2,操作系統(tǒng)為redhat 6.2 linux。測試選取100 000條文獻(xiàn)資料,在1 000、10 000、100 000數(shù)據(jù)規(guī)模下對Lucene和數(shù)據(jù)庫檢索分別進(jìn)行了20次測試,取其平均值作為測試結(jié)果,結(jié)果如表2所示。
表2 Lucene與Sql Server性能對比
測試結(jié)果表明:基于Lucene的文獻(xiàn)資料全文檢索系統(tǒng)具有較好的時間和資源優(yōu)勢,并且隨著文獻(xiàn)記錄數(shù)的增多,其優(yōu)勢更加明顯。
本文在研究文獻(xiàn)全文檢索技術(shù)和Lucene系統(tǒng)架構(gòu)的基礎(chǔ)上,設(shè)計了基于Lucene技術(shù)的文獻(xiàn)資料知識庫檢索系統(tǒng),并進(jìn)行了實(shí)際應(yīng)用。研究結(jié)果表明:Lucene開放的體系架構(gòu)使得其能夠方便地應(yīng)用到文獻(xiàn)知識庫系統(tǒng)中;Lucene基于字典和倒排技術(shù)的索引和檢索技術(shù)使得系統(tǒng)能夠?qū)崿F(xiàn)文獻(xiàn)資料的快速、準(zhǔn)確檢索。相比于傳統(tǒng)的數(shù)據(jù)庫檢索方式,Lucene在性能和效率上具有明顯的檢索優(yōu)勢。
[1]錢愛兵.全文檢索算法設(shè)計及全文檢索系統(tǒng)概述[J].現(xiàn)代圖書情報技術(shù),2003(2):42-44.
[2]管建和,甘劍峰.基于Lucene全文檢索引擎的應(yīng)用研究與實(shí)現(xiàn)[J].計算機(jī)工程與設(shè)計,2007(2):489-491.
[3]曹元大,賀海軍,涂哲明,等.全文檢索字索引技術(shù)的研究與實(shí)現(xiàn)[J].計算機(jī)工程,2002(6):260-262.
[4]孫西全,馬瑞芳,李燕靈.基于Lucene的信息檢索的研究與應(yīng)用[J].情報理論與實(shí)踐,2006(1):125-128.
[5]肖創(chuàng)柏,李玉鑒,鄭廣順,等.基于全文檢索技術(shù)的商業(yè)信函處理系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].計算機(jī)應(yīng)用研究,2004(1):150-152.
[6]蘇潭英,郭憲勇,金鑫.一種基于Lucene的中文全文檢索系統(tǒng)[J].計算機(jī)工程,2007(23):94-96.
[7]唐鐵兵,陳林,祝偉華.基于Lucene的全文檢索構(gòu)件的研究與實(shí)現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2010(2):197-199.
[8]高磊.基于LUCENE的搜索引擎研究與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2007.
[9]王海濤,賈宗璞.基于Struts和Hibernate的Web應(yīng)用開發(fā)[J].計算機(jī)工程,2011(9):112-114.
[10]郎小偉,王申康.基于Lucene的全文檢索系統(tǒng)研究與開發(fā)[J].計算機(jī)工程,2006(4):94-96.
[11]趙珂,逯鵬,李永強(qiáng).基于Lucene的搜索引擎設(shè)計與實(shí)現(xiàn)[J].計算機(jī)工程,2011(16):39-41.
[12]夏天,黃文,馬駿濤,等.Lucene全文檢索軟件及其在學(xué)科信息服務(wù)平臺中的應(yīng)用[J].圖書情報工作,2011(21):106-109.
[13]黃杰.基于Lucene的全文檢索系統(tǒng)模型的研究[D].廣州:暨南大學(xué),2007.
[14]李曉麗,杜振龍.基于Lucence的個性化搜索引擎研究[J].計算機(jī)工程,2010(19):258-260.