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