何萍 (成都信息工程學院圖書館,四川成都 610225)
李凡 (成都信息工程學院計算機學院,四川成都 610225)
基于Lucene的全文檢索管理系統(tǒng)設計與實現(xiàn)
何萍 (成都信息工程學院圖書館,四川成都 610225)
李凡 (成都信息工程學院計算機學院,四川成都 610225)
全文檢索是各種信息系統(tǒng)實現(xiàn)對各種繁多的電子文檔進行分析處理的基礎(chǔ),而依賴于數(shù)據(jù)庫的全文檢索功能存在許多局限性。Lucene是一種基于純Java技術(shù)的輕量級的文本索引和查詢引擎,幾乎適合于任何需要全文檢索的應用。設計了一個基于Lucene技術(shù)的全文檢索管理系統(tǒng)(id XMS)。全文檢索管理系統(tǒng)(id XMS)采用純Java技術(shù)實現(xiàn),以Lucene作為核心引擎,總體上分為8個功能模塊,分別是系統(tǒng)管理器、索引管理器、查詢管理器、文檔解析器管理器、配置管理器、優(yōu)化器管理器、I/O模塊和Lucene全文檢索引擎。
全文檢索管理系統(tǒng)(id XMS);Lucene;Java技術(shù)
隨著信息技術(shù)的發(fā)展,各式各樣的電子文檔取代了原來的紙制文獻,用戶面對海量的數(shù)據(jù),如何更好、更準確的抓住所需信息,已經(jīng)成為一道難題。隨著全文檢索技術(shù)的誕生,在一定程度上解決了這一問題。全文檢索技術(shù)能對各種文檔的信息進行提取,創(chuàng)建快速查詢索引,是實現(xiàn)對文檔的快速查找,對信息進一步提煉加工的基礎(chǔ)設施。因此,全文檢索技術(shù)已被廣泛的應用在信息系統(tǒng)中。然而,許多信息系統(tǒng)雖使用全文檢索技術(shù),但沒有提供獨立的全文檢索模塊,而是完全依賴于數(shù)據(jù)庫提供的全文檢索能力或SQL查詢能力,這必然導致以下幾點問題:應用與特定數(shù)據(jù)庫邦定;增加了數(shù)據(jù)庫的查詢負載,可能引起整體性能的大幅下降;不利于數(shù)據(jù)在不同數(shù)據(jù)庫產(chǎn)品間移植;系統(tǒng)全文檢索模塊沒有組件化,與其他模塊間無法達到松散耦合。所以,建立一個獨立的組件式的高效穩(wěn)定的全文檢索模塊或全文檢索服務系統(tǒng)已經(jīng)成為新趨勢。要設計如此的管理系統(tǒng),Lucene技術(shù)的使用是必須的。Lucene是一個高性能、純Java的全文檢索引擎,而且免費、開源[1]。Lucene是Apache開源組織著名的開源項目,目前已得到廣泛的使用和測試,具有良好的性能和可靠的穩(wěn)定性。為此,筆者開發(fā)設計了一個以Lucene作為核心引擎的全文檢索管理系統(tǒng)(id XMS)。
全文檢索管理系統(tǒng)(id XMS)采用純Java技術(shù)[2-3]實現(xiàn),以Lucene作為核心引擎,總體上分為8個功能模塊,分別是系統(tǒng)管理器、索引管理器、查詢管理器、文檔解析器管理器、配置管理器、優(yōu)化器管理器、I/O模塊和Lucene全文檢索引擎(見圖1)。系統(tǒng)既可作為獨立服務器提供全文檢索服務,又能作為獨立組件集成到其他信息系統(tǒng)當中。
此外,系統(tǒng)除了提供最基本的文本檢索和查詢功能,還具有以下功能:能對WORD、PDF、RTF、HTML等多種格式的文檔建立索引,并可通過新增自定義的文檔解析器來支持自定義文檔;能建立并維護多個文檔索引目錄;支持文件系統(tǒng)、數(shù)據(jù)庫或網(wǎng)絡等多種索引存儲方式;能定時自動合并優(yōu)化索引,提高系統(tǒng)檢索性能;系統(tǒng)配置基于XML,簡單易維護。
2.1 Lucene全文檢索引擎
Lu c e n e全文檢索引擎是整個系統(tǒng)的核心組成部分。Lu c e n e中的索引(I n d e x)對象有多個文檔(Do c ume n t)對象,每個文檔對象又包含多個域(Field)對象,每個域?qū)ο笥职姸嗟膯卧~(Term)對象。文檔對象就表示一個實際要處理的文檔(如一個PDF文檔),為了提高查詢效率,Lucene采用增量更新。一個新增的文檔成為一個子索引,稱為“段”,當子索引達到一定數(shù)量后就要合并這些子索引以提高整體查詢效率,這一工作主要靠優(yōu)化器對象(Optimizer)來完成。文檔中的“域”可以看作關(guān)系數(shù)據(jù)庫表的“字段”,Lucene中的域分為“Keyword”、“UnIndex”、“UnStored”、“Text”4種類型,Keyword類型用于表示短文本對象,如標題等;UnIndex類型用于表示不需要進行索引的對象;UnStored類型用于表示需要進行索引而不需要保存全文的大文本對象,如正文等;Text類型用于表示既需要索引又需要在索引中保存全文的大文本對象,如摘要等;通過以上分析,在設計該系統(tǒng)時為每個文檔都預建了一組域。
在設計的整個系統(tǒng)中Lucene引擎主要具有以下功能:由配置管理器調(diào)用,在解析配置文件過程中創(chuàng)建新的索引;由索引管理器調(diào)用,新增或刪除指定索引中的文檔;由查詢管理器調(diào)用,在指定的索引查詢文檔;由優(yōu)化器調(diào)用,合并指定索引中的子索引。
圖1 系統(tǒng)主要組成模塊
2.2 系統(tǒng)管理器
為了提供統(tǒng)一的用戶接口,在設計本系統(tǒng)時采用了設計模式中的正面(Facade)模式,其他管理器模塊由系統(tǒng)管理器類(XMSManager)控制和協(xié)調(diào),系統(tǒng)管理器類本身采用了單實例(Singleton)模式[4]。系統(tǒng)管理器提供的API主要可分為以下幾類:
1)索引操作 獲取索引類別名稱集合:getIndex Names(…);判斷指定的索引是否存在:indexExists (…);獲取指定索引中的文檔數(shù):getIndex NumDoc(…);優(yōu)化指定的索引:optimizeIndex(…)。
2)文檔操作 在指定的索引中添加文檔:add Document(…);在指定的索引中刪除文檔:removeDocument(…)。
3)查詢操作 獲取指定索引中的所有文檔:search All(…);在指定索引中進行查詢:search (…);在指定索引的日期型域中進行查詢:searchDate(…);在指定索引的日期型域中進行日期范圍查詢:search DateRange(…)。
4)系統(tǒng)監(jiān)視器操作 啟動查詢池監(jiān)視器:startSPMonitor(…);停止查詢池監(jiān)視器:stopSPMonitor (…);判斷查詢池監(jiān)視器是否啟動:isSPMStarted(…);啟動連接池監(jiān)視器:startCPMonitor(…);停止連接池監(jiān)視器:stop CPMonitor(…);判斷連接池監(jiān)視器是否啟動:isCPMStarted(…)。
5)索引優(yōu)化器操作 啟動自動優(yōu)化器:startOptimizer(…);停止自動優(yōu)化器:stop Optimizer(…)。
2.3 配置管理器
系統(tǒng)的配置管理器類(Config Manager)主要負責在系統(tǒng)啟動時解析配置XML文件,提供系統(tǒng)各模塊的初始化信息,同時在系統(tǒng)運行過程中負責提供Lucene引擎的Index Writer和Index Reader對象實例。為了保證數(shù)據(jù)的一致性,配置管理器類采用單實例(Singleton)模式(見圖2)。
2.4 索引管理器
系統(tǒng)的索引管理器類(Index Manager)主要負責對指定索引的具體操作,包括增刪文檔、優(yōu)化索引、獲取索引相關(guān)信息(如最大文檔數(shù)、當前文檔數(shù)、索引域名集合、索引單詞集合等)等。索引管理器類采用單實例(Singleton)模式,向系統(tǒng)管理器提供服務。
2.5 查詢管理器
系統(tǒng)的查詢管理器類(Search Mananger)是系統(tǒng)管理器中查詢功能的最終實現(xiàn)者,能提供針對單詞、短語(多個單詞)、前綴(prefix)、模糊(fuzzy)、通配符(wildcard)和日期等多種方式的查詢。由于查詢是比較耗費系統(tǒng)資源的操作,為了靈活的限制查詢操作消耗的資源總量,系統(tǒng)使用了查詢對象池,可通過配置XML文件中的<pool>元素的屬性來設置池中的最大活動實例數(shù)(max Active)、最大空閑實例數(shù)(maxIdle)和最大等待請求數(shù)(max Wait)。
圖2 系統(tǒng)各模塊包和類結(jié)構(gòu)圖
2.6 文檔解析器管理器
系統(tǒng)的文檔解析器管理器類(Paser Manager)負責管理解析各種類型文檔的解析器基類(DocParser)的子類對象。系統(tǒng)已預建了WORDParser、PDFParser、RTFParser、HTMLParser等子類,分別用于解析Office Word文檔、Adobe PDF文檔、RTF文檔和HTML文檔,從中提取標題、作者、正文、創(chuàng)建時間等文本(如無相應的內(nèi)容則可為空)。在設計系統(tǒng)時,為了便于自定義擴展新的文檔解析器,采用了設計模式中的模版方法(Template Method)模式[4]。
2.7 優(yōu)化器管理器
系統(tǒng)的優(yōu)化器管理器類(Optimizer Manager)是系統(tǒng)管理器中優(yōu)化器相關(guān)功能的最終實現(xiàn)者。由于引擎采用了增量更新方式,在一定時間內(nèi)會存在多個子索引,如果子索引數(shù)量過多就會大大影響系統(tǒng)的查詢效率,所以必須不斷進行合并子索引(優(yōu)化)的操作,但是在合并子索引過程中索引處于寫保護和讀保護狀態(tài),使系統(tǒng)無法提供服務,因此構(gòu)建了優(yōu)化器(Optimizer)以守護線程的方式對索引進行定時優(yōu)化(見圖2)。
2.8 I/O模塊
系統(tǒng)擴展了Lucene的I/O模塊,使索引可以直接將索引存儲于指定數(shù)據(jù)庫中。為了便于擴展支持其他數(shù)據(jù)庫,采用了模版方法(Template Method)模式和工廠(Factory)模式[5],抽象基類DBDirectory繼承了Lucene的I/O模塊中的抽象類Directory(對目錄的抽象),而要支持其它數(shù)據(jù)庫,需繼承DBDirectory實現(xiàn)其中的抽象方法,同時繼承Lucene的I/O模塊中的抽象類InputStream和OutputStream,并提供2個輸入輸出子類。
系統(tǒng)采用了基于XML的配置文件,下面給出配置文件的部分文檔類型定義(DTD):
基于Lucene引擎的全文檢索管理系統(tǒng)(id XMS)在Web上的應用,基本用戶查詢界面如圖3所示。
基于Lucene引擎的全文檢索管理系統(tǒng)(id XMS)具有獨立的組件式的高效穩(wěn)定的全文檢索模塊。因此使用Lucene技術(shù)來構(gòu)建一個信息管理系統(tǒng)將大大提高系統(tǒng)中文查詢效率,這也是全文檢索管理系統(tǒng)的研究重點。
圖3 Web XMS查詢界面
[1]Otis Gospodnetic.Advanced Text Indexing with Lucene[EB/OL].http://www.onjava.com/pub/a/onjava/2003/03/05/ lucene.html,2003-03-05.
[2]Scott Oaks,Henry Wong.Java Threads[M].OReilly&Associates,1999.
[3]Doug Lea.Concurrent Programming in Java:Design Principles and Patterns Second Edition[M].Addison Wesley Longman,Inc, 1999.
[4]Gamma E,Helm R,Johnson R,et al.Design Patterns:Elements of Reusable Object-Oriented Software[M].Addison Wesley Longman, Inc,1994.
[5]車東.基于Java的全文索引引擎Lucene簡介[EB/OL].http://www.chedong.com/tech/lucene.html,2014-08-25.
[編輯] 張濤
TP391
A
1673-1409(2014)22-0035-04
2014-04-02
何萍(1979),女,碩士,館員,現(xiàn)主要從事圖書館信息化建設和數(shù)字圖書館等方面的研究工作。