胡宏偉,虞 萍,周 南,喬 軍
(中國農業大學網絡中心,北京 100083)
近年來,隨著文獻資料數量的持續增長及其影響力的日益擴大,文獻資料的重要性也在逐漸增加。有鑒于此,許多單位建立了專門的內部文獻管理系統,實現了內部文獻資料的集中存儲和管理,促進了文獻資料的應用和推廣。
然而,由于現有的文獻管理系統多采用目錄檢索或數據庫查詢方式,使得其在為用戶提供豐富文獻資料的同時也給用戶的文獻查詢帶來了新的問題,即用戶很難采用常規的檢索方式實現文獻的快速準確查詢。因此,如何建立一種能從海量的文獻資料中快速、準確查找所需文獻的檢索系統,就顯得很有必要。
研究表明,實現海量電子資料快速、準確檢索的核心技術是全文檢索[1]。全文檢索可以按照一定的策略對電子信息進行組織和處理,并能通過特定的方法實現信息的快速、準確檢索。現階段,實現全文檢索的工具很多,其中Lucene是當今最為流行的開源全文檢索工具包之一[1-2]。
全文檢索是一種實現電子資料中的信息與檢索項快速匹配的檢索方法[3],它以各種計算機數據(包括文本、圖像、音視頻等)作為處理對象,通過掃描其內容,為每一個詞建立索引;在用戶查詢時,檢索程序則根據已建立的索引進行查找和匹配,并將查找結果反饋給用戶[4-5],從而實現電子資料的快速查找。
全文檢索一般包括信息獲取和存儲、信息索引創建、信息檢索和用戶搜索界面4個部分:
1)信息獲取和存儲。全文檢索的信息獲取方式一般有2種:一是通過網絡爬蟲方式獲取互聯網中其他網站中的信息,類似于百度、google等全文檢索引擎;二是在信息產生過程中直接獲取信息,如企業級網站全文檢索的信息獲取。獲取后的信息一般存放到系統的存儲設備中,為了檢索和查閱的方便,信息的存儲一般按照固定的格式,例如標題、內容、作者和發布日期等。
2)信息索引創建。索引創建是指在信息獲取后,通過掃描信息中的每一個詞,建立一個能精確定位到每個詞的索引,然后將該索引添加到索引文件中,從而完成索引的創建。
3)信息檢索。信息檢索一般由用戶發起請求,檢索程序根據用戶提交的關鍵字對索引文件進行檢索,并通過一系列的計算、合并和篩選等操作獲得查詢結果,最后將查詢結果返回給用戶,完成檢索過程。
4)用戶搜索界面。用戶搜索界面主要實現用戶檢索詞的輸入、查詢結果顯示等功能。
Lucene是一個完全開放源代碼的全文檢索工具包[6]。它最初由Doug Cutting開發并于2010年捐獻給Apache軟件基金會,Lucene目前是Jakara項目組的一個子項目。Lucene最初是用Java開發的,隨著項目的發展和應用的不斷推廣,Lucene逐漸被翻譯成了C、C++、C#、Perl等多種語言。
Lucene不是一個完整的全文檢索引擎,而是一個提供了完整的索引引擎和查詢引擎的架構。它為數據的訪問和管理提供了簡單的函數調用接口,可以方便地嵌入到各種應用中實現針對應用的全文索引/檢索功能。目前Lucene已被許多項目作為開發引擎,如 Eclipise、Jive、Conoon和 Eyebrows等[7]。
Java版Lucene的體系結構由基礎結構封裝、索引核心和對外接口3部分組成,分為7個JAR包[8],如圖1 所示。

圖1 Lucene體系結構
索引核心部分包含org.apache.lucene.index和org.apache.lucene.store 2個JAR包:index包提供了索引的創建接口,實現了索引記錄的增加、更新、刪除及讀取記錄等功能;store包提供了底層I/O的存儲結構,負責索引的讀寫等數據存儲管理。
基礎結構封裝部分包含org.apache.lucene.document和 org.apache.lucene.utit 2個 JAR包:document包提供了索引文檔需要的類,包括Document和Field等;util包含了一些公共的數據結構。
對外接口部分包括org.apache.lucene.search、org.apache.lucene.queryPaser和 org.apache。
lucene.analysis含3個JAR包:search包是lucene的檢索接口,它提供了在索引文件上進行查詢所需要的類。常用的包括IndexSearcher和Hits 2個類,其中IndexSearcher類定義了在指定的索引上進行搜索的方法;Hits類則用來保存搜索得到的結果。queryPaser包是查詢分析器接口,負責語法分析,實現關鍵詞間的與、或、非等運算操作;analysis包是語言分析器,主要用于切分詞。lucene提供了針對不同語言的分詞,開發人員也可以在此基礎上進行不同語言分詞器的開發。
作為一個開源的全文搜索引擎,Lucene有以下特點:
1)Lucene是完全開放源代碼的搜索引擎工具,開發者不僅可以充分利用其現有的功能,還可以在此基礎上根據實際需要進行針對性的開發,滿足不同程度用戶的需求。Lucene面向對象的系統架構也使得其具有良好的可擴展性,易于進行新模塊的開發。
2)Lucene采用獨立于應用平臺的索引文件,使不同平臺的項目能夠共享索引文件。它還設計了獨立于語言和文件格式的文本分析接口,能夠方便地實現不同語言和文件格式的擴展。
3)Lucene采用了分塊索引模式,在進行索引更新時,可以通過建立小的索引文件提升索引速率,然后再通過與原有文件的合并達到效率優化的目的。
本文采用J2EE架構進行文獻資料全文檢索系統的開發。系統采用Struts,Hibernate和Spring框架的5層軟件開發架構[9]。系統整體框架包括WEB瀏覽器上的用戶層、J2EE服務器上的WEB層、業務邏輯層、數據持久層以及數據庫服務器上的數據層,系統架構如圖2所示。

圖2 系統開發架構
各層的功能如下:用戶層主要是指用戶瀏覽器上的HTML頁面,用戶通過其向WEB層發起應用請求,實現用戶的需求;WEB層主要采用JSP和Struts對用戶的請求進行呼應;業務邏輯層采用Spring框架,它是一種控制反轉和面向容器輕量級的容器框架;數據持久層采用Hibernate框架,實現了對象、關系之間的映射和數據的持久化;數據層采用Mysql數據庫和索引文件庫,實現對文獻數據及文獻索引的增、刪、改、查等操作。
文獻資料全文檢索系統主要實現了文獻資料的收集和全文檢索兩大主要功能。其中,文獻資料收集部分主要實現文獻資料提交、存儲和審核管理等功能;而全文檢索部分實現文獻資料的索引和數據檢索等功能。
本文將完整的文獻資料設計為屬性信息和對象文件兩部分:文獻的屬性信息包括文獻標題、作者、出版或收錄單位、文獻摘要、關鍵字等信息;而文獻的內容則存儲在對象文件,對象文件由txt、html、word、pdf、ppt、excel等多種格式。本文對文獻資料的收集、索引和檢索操作也基于這兩部分開展。
根據系統的功能分析,本系統的設計思路分為4個步驟,其流程如圖3所示。首先,由用戶通過文獻資料提交系統提交文獻資料,文獻資料提交成功后將存放到存儲系統中;第二,由管理員審核用戶提交的文獻資料;第三,系統對通過審核的文獻資料進行轉換、清洗和全文索引創建;第四,用戶通過檢索頁面提交檢索請求,由Lucene檢索引擎進行檢索操作并向用戶返回檢索結果。

圖3 文獻資料全文檢索流程
根據系統分析和設計思路,本文將校內文獻全文檢系統劃分為5個模塊,包括文獻資料管理模塊、數據存儲模塊、數據解析與轉換模塊、文獻索引模塊、文獻檢索模塊。各模塊的功能如下:
文獻資料管理模塊:實現用戶文獻資料的提交、編輯以及管理員對文獻資料的審核、編輯和管理等操作。
文獻資料存儲模塊:存儲用戶提交的文獻資料屬性信息和對象文件,并建立屬性信息和對象文件的1-1對應關系。
數據解析與轉換模塊:從關系數據庫中讀取文獻資料的屬性信息并從對象文件抽取文件內容,通過轉換和清洗操作將文獻資料的屬性信息和對象文件內容轉變為可被Lucence索引的數據格式。
文獻索引模塊:利用Lucence搜索引擎對文獻資料進行全文索引,實現索引的建立、更新和刪除等操作。
文獻檢索模塊:通過檢索頁面對被索引的文獻資料進行全文檢索,包括對各個字段關鍵詞的邏輯操作后的綜合檢索等。
其中文獻資料存儲、數據解析與轉換、文獻索引和檢索4個模塊是系統的核心技術部分,本文的實現部分也針對這4個模塊開展。
根據校內文獻資料的特點,本文文獻資料的存儲將采用數據庫和文件系統2種方式。文獻資料的對象文件存放到文件系統,對象文件提交成功后,系統按照上傳日期和隨機數重命名對象文件,確保對象文件名稱的唯一性;文獻資料的屬性信息和對象文件的路徑及名稱則存放到Mysql數據表中并與對象文件形成1-1對應關系。數據庫中文獻資料的表結構如表1所示。

表1 文獻資料表結構
由于 Lucene只支持對 Document對象的索引[10],因此文獻資料的信息需要轉換成Document支持的數據格式。根據Document的格式特點,數據庫中的屬性信息一般可以直接進行索引,而存放到文件系統中的對象文件則需要通過讀取、清洗等操作轉化為文本格式。本文中對象文件有txt、html、word、pdf、ppt、excel等多種不同格式。為了讀取對象,本文設計了不同對象文件的讀取方式,并基于不同的Java包實現了對象文件的讀取,其過程如圖4所示。
實現對象文件內容抽取與解析的核心代碼如下:


本文利用apache的poi包讀取word內容的核心代碼,實現word文件讀取的核心代碼如下:



圖4 對象文件解析與轉換
文獻資料信息被解析和轉換后就可以進行索引操作了。文獻索引就是利用Lucene全文索引技術將解析和轉換后的文獻資料生成一條條的索引記錄并將其添加到索引文件的過程。文獻索引實現了全文索引記錄、文獻屬性信息和對象文件三者間的關聯。
Lucene搜索引擎的全文索引主要由寫索引器(IndexWriter)、文檔(Document)和域(Field)3個類來實現[11-121。在Lucence中,索引建立分為4個步驟:第一步,首先要創建索引文件目錄(Directory),它負責存儲索引記錄,索引文件的存儲有內存、文件系統和數據庫3種方式,本文的索引文件的存儲采用文件系統方式;第二步,創建 IndexWriter索引器,它接受新的Document文檔,并將其寫入索引文件中;第三步,建立Document文檔,并為其添加Field對象,每個Document文檔對應著一個文獻資料對象,Documet通過Filed對象存儲了文獻資料的各類信息(包括文檔id、標題、作者、內容等);第四步,利用IndexWriter索引器對Document進行索引,并將其寫入索引文件,完成索引。文獻資料的索引過程如圖5所示:

圖5 文獻資料索引過程
實現資料全文索引的核心代碼如下:


文獻檢索是指利用Lucene的全文檢索引擎實現文獻資料的查詢功能[13-14],它根據用戶輸入的查詢語句將符合條件的索引信息從索引文件中提取出來,并將結果返回給用戶。文獻檢索一共包含以下幾個過程:首先,用戶通過查詢頁面輸入查詢語句;其次,利用Query對象封裝查詢語句并利用Analyzer對象分析查詢語句;第三,打開索引文件,通過SearcherManage獲得IndexSearcher對象;第四,利用IndexSearcher對象進行查詢,并將查詢結果返回到Hits結果集中;第五,將查詢結果展現在查詢頁面中。
利用Lucence實現文獻材料全文檢索的核心代碼如下:


除了基本查詢之外,本文還利用BooleanQuery實現了對文獻作者、關鍵詞、出版單位等多條件的布爾查詢,并基于RangeQuery實現了出版時間的范圍查詢。
系統開發完成后,本文分別利用Lucene和關系數據庫Sql Server 2005對10萬條文本數據進行了檢索測試。系統試驗環境中CPU為Intel Xeon 1.86 GHz,內存為三星4GB DDR3 ×2,操作系統為redhat 6.2 linux。測試選取100 000條文獻資料,在1 000、10 000、100 000數據規模下對Lucene和數據庫檢索分別進行了20次測試,取其平均值作為測試結果,結果如表2所示。

表2 Lucene與Sql Server性能對比
測試結果表明:基于Lucene的文獻資料全文檢索系統具有較好的時間和資源優勢,并且隨著文獻記錄數的增多,其優勢更加明顯。
本文在研究文獻全文檢索技術和Lucene系統架構的基礎上,設計了基于Lucene技術的文獻資料知識庫檢索系統,并進行了實際應用。研究結果表明:Lucene開放的體系架構使得其能夠方便地應用到文獻知識庫系統中;Lucene基于字典和倒排技術的索引和檢索技術使得系統能夠實現文獻資料的快速、準確檢索。相比于傳統的數據庫檢索方式,Lucene在性能和效率上具有明顯的檢索優勢。
[1]錢愛兵.全文檢索算法設計及全文檢索系統概述[J].現代圖書情報技術,2003(2):42-44.
[2]管建和,甘劍峰.基于Lucene全文檢索引擎的應用研究與實現[J].計算機工程與設計,2007(2):489-491.
[3]曹元大,賀海軍,涂哲明,等.全文檢索字索引技術的研究與實現[J].計算機工程,2002(6):260-262.
[4]孫西全,馬瑞芳,李燕靈.基于Lucene的信息檢索的研究與應用[J].情報理論與實踐,2006(1):125-128.
[5]肖創柏,李玉鑒,鄭廣順,等.基于全文檢索技術的商業信函處理系統的設計與實現[J].計算機應用研究,2004(1):150-152.
[6]蘇潭英,郭憲勇,金鑫.一種基于Lucene的中文全文檢索系統[J].計算機工程,2007(23):94-96.
[7]唐鐵兵,陳林,祝偉華.基于Lucene的全文檢索構件的研究與實現[J].計算機應用與軟件,2010(2):197-199.
[8]高磊.基于LUCENE的搜索引擎研究與實現[D].武漢:武漢理工大學,2007.
[9]王海濤,賈宗璞.基于Struts和Hibernate的Web應用開發[J].計算機工程,2011(9):112-114.
[10]郎小偉,王申康.基于Lucene的全文檢索系統研究與開發[J].計算機工程,2006(4):94-96.
[11]趙珂,逯鵬,李永強.基于Lucene的搜索引擎設計與實現[J].計算機工程,2011(16):39-41.
[12]夏天,黃文,馬駿濤,等.Lucene全文檢索軟件及其在學科信息服務平臺中的應用[J].圖書情報工作,2011(21):106-109.
[13]黃杰.基于Lucene的全文檢索系統模型的研究[D].廣州:暨南大學,2007.
[14]李曉麗,杜振龍.基于Lucence的個性化搜索引擎研究[J].計算機工程,2010(19):258-260.