王 亮,蘇 云
(1. 海軍指揮所,北京 100841;2. 江蘇自動化研究所,江蘇 連云港 222061)
?
基于Lucene的異構數(shù)據(jù)庫全文檢索技術
王 亮1,蘇 云2
(1. 海軍指揮所,北京 100841;2. 江蘇自動化研究所,江蘇 連云港 222061)
當前,我軍積累了部隊情況、裝備性能、海戰(zhàn)場環(huán)境等海量的作戰(zhàn)數(shù)據(jù)。這些數(shù)據(jù)數(shù)量巨大、格式多樣,且存儲在不同類型的數(shù)據(jù)庫中。如何快速準確地從這些數(shù)據(jù)中檢索出目標信息,成為一項非常重要的工作。Lucene是一個基于Java的開源的全文檢索庫,利用它可以方便地定制出符合用戶特定需求的搜索引擎。使用Lucene可研制出一種可配置的、支持不同類型數(shù)據(jù)庫的全文搜索引擎。
Lucene;異構數(shù)據(jù)庫;全文檢索;搜索引擎;索引
隨著現(xiàn)代互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)絡上存儲的信息量越來越大且呈指數(shù)增長。隨著計算機計算能力的日益增強、存儲設備存儲密度的日益提高、大規(guī)模集群日益普遍,人們處理大量數(shù)據(jù)的能力越來越強,“大數(shù)據(jù)”成為當前炙手可熱的話題。網(wǎng)絡成為現(xiàn)代人生活中不可或缺的一部分,在給人帶來便利的同時,也不可避免地造成了用戶難以快速獲取有效信息的問題[1]。如何使用搜索引擎快速地從浩瀚的網(wǎng)絡中獲取用戶需要的信息,成為一個重要研究課題。
當前,我軍積累了部隊情況、裝備性能、戰(zhàn)備工程、海戰(zhàn)場環(huán)境資料、水文氣象資料、情報資料等海量的作戰(zhàn)數(shù)據(jù),并且數(shù)據(jù)種類和數(shù)量還在逐年增加。這些數(shù)據(jù)具有以下幾個特點:
1)數(shù)量較大。尤其是包括高清圖片、視頻等大容量數(shù)據(jù),以及各種實時數(shù)據(jù)。單個數(shù)據(jù)庫的大小可達幾GB、幾十GB甚至更多;
2)格式多樣。既有通常的結構化數(shù)據(jù),也有文檔、圖片、視頻等非結構化數(shù)據(jù);
3)存儲在不同類型的數(shù)據(jù)庫中。包括Oracle、SQL Server、Access等不同類型的數(shù)據(jù)庫。
如何快速準確地從這些數(shù)據(jù)中檢索出目標信息,成為一項非常重要的工作。Lucene是一個開源的全文檢索庫,利用它可以方便地定制符合自身需求的搜索引擎。本文使用Lucene,研制出了一種可配置的、同時支持多種類型數(shù)據(jù)庫的全文搜索引擎,并成功應用于作戰(zhàn)數(shù)據(jù)搜索。
1.1 原理
Lucene的兩個核心能力是建立索引和搜索索引,分別通過索引器(Index Writer)和搜索器(Index Searcher)完成。具體的工作原理和過程見圖1。
1)建立索引過程:待處理的數(shù)據(jù)可能來源于各種不同的途徑,具有各種不同的形式,如文件系統(tǒng)、數(shù)據(jù)庫、互聯(lián)網(wǎng)、手工錄入的數(shù)據(jù)等。應用程序首先按需要把待處理數(shù)據(jù)劃分成一條條的數(shù)據(jù)記錄,此處的數(shù)據(jù)記錄類似于數(shù)據(jù)庫中表的記錄,即一條不可分割的信息單元。例如,對于來自文件系統(tǒng)的文本文檔,可以將每個文檔的內容作為一條數(shù)據(jù)記錄;對于來自數(shù)據(jù)庫的數(shù)據(jù),可以將每個數(shù)據(jù)行作為一條數(shù)據(jù)記錄;對于來自互聯(lián)網(wǎng)的站點數(shù)據(jù),可以將每個網(wǎng)頁的內容作為一條數(shù)據(jù)記錄。接下來通過Lucene提供的方法,將每條數(shù)據(jù)記錄轉換成一個文檔(Document),并寫入索引文件中。文檔是Lucene中的基本概念,是索引文件中的一個最小單元,同時對應著搜索過程中的一條搜索結果。
圖1 Lucene的工作原理和過程
2)搜索索引過程:應用程序將搜索關鍵字(通常來源于用戶輸入)提交給Lucene的搜索器,后者依次完成詞匯分析、停止詞去除、詞干提取、名詞及名詞性短語識別等過程[2],然后將處理后的搜索關鍵詞與索引庫中的索引內容對比,找到匹配的項,進行排序,將結果返回給應用程序,最終展示給用戶。在搜索過程中,排序是一個不可或缺的重要步驟,排序算法的好壞直接影響搜索結果的質量。
1.2 特點
Lucene主要有以下特點:
1)索引文件的格式獨立于應用平臺,它是一種以8字節(jié)為基礎的文件格式,使得兼容系統(tǒng)或者不同平臺的應用能夠共享建立的索引文件;
2)在傳統(tǒng)的全文搜索引擎的倒排索引的基礎上,實現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達到優(yōu)化的目的;
3)優(yōu)秀的面向對象的系統(tǒng)架構,使得對其擴展的學習難度降低,方便擴充新功能;
4)設計了獨立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的建立。用戶擴展新的語言和文件格式,只需要實現(xiàn)文本分析接口;
5)面向全文檢索的優(yōu)化,首次索引后并不把所有文檔的具體內容讀取出來,而只將所有結果中匹配度最高的前100個文檔的編號放到結果緩存中并返回,可以滿足90%以上的檢索需求;
6)已默認實現(xiàn)了一套強大的搜索引擎,用戶無需自己編寫代碼即可使系統(tǒng)獲得強大的檢索能力,默認實現(xiàn)了布爾檢索、模糊查詢和分組查詢等操作。
本文在Lucene的基礎上,實現(xiàn)了一個支持異構數(shù)據(jù)庫的、按分類搜索的、靈活可配的作戰(zhàn)數(shù)據(jù)庫全文搜索引擎(以下簡稱搜索引擎)。下面按照整個過程中數(shù)據(jù)流動的順序,詳細介紹搜索引擎的特點、設計過程中遇到的問題及解決措施。
2.1 對異構數(shù)據(jù)庫的支持
作戰(zhàn)數(shù)據(jù)存儲在各種不同類型的數(shù)據(jù)庫中,如Oracle數(shù)據(jù)庫、Access數(shù)據(jù)庫、SQL Server數(shù)據(jù)庫等。為了能夠統(tǒng)一處理存儲在不同數(shù)據(jù)庫中的數(shù)據(jù),必須使用一種屏蔽數(shù)據(jù)庫類型差異的方法。Java平臺提供的JDBC,即Java數(shù)據(jù)庫連接,正是一種以相同的方式訪問不同類型數(shù)據(jù)庫的方法。它在語言層提供了統(tǒng)一的數(shù)據(jù)庫訪問接口,而在底層則由各種類型的數(shù)據(jù)庫驅動實現(xiàn)這些接口。因此通過使用JDBC,在建立索引過程中獲取各數(shù)據(jù)庫存儲的作戰(zhàn)數(shù)據(jù)時,就不需要針對具體的數(shù)據(jù)庫類型專門進行實現(xiàn)。存在某些特殊的情況,例如在對Access數(shù)據(jù)庫進行查詢時,返回的結果集中的數(shù)據(jù)不符合標準,因此需要對其單獨處理。
為了能夠同時對多個不同類型數(shù)據(jù)庫提供支持,搜索引擎提供了專門的配置文件,用來配置搜索引擎使用的數(shù)據(jù)源,包括名稱、地址、數(shù)據(jù)庫名稱、數(shù)據(jù)庫類型等信息。搜索引擎會根據(jù)數(shù)據(jù)庫類型自動選擇相應的驅動程序對數(shù)據(jù)庫進行訪問,如表1所示。另外還可以靈活地配置數(shù)據(jù)庫中的哪些表被納入索引,哪些表被排除。
表1 數(shù)據(jù)源配置信息示例
2.2 建立索引
搜索引擎建立索引的過程[3-4]如圖2所示。
建立索引的過程中,最重要的步驟就是生成索引文檔。索引文檔類似于數(shù)據(jù)庫中的一條記錄,它包括多個字段,這些字段是將來進行搜索時用來匹配的關鍵信息。
圖2 搜索引擎建立索引的過程
在作戰(zhàn)數(shù)據(jù)庫搜索引擎設計過程中,在索引文檔中添加了如表2所示的字段。
表2 索引文檔中的字段及含義
其中,只有“內容”字段才是原始數(shù)據(jù)的信息,理論上只需要此字段就可以了。但是,為了實現(xiàn)更多功能而額外增加了一些字段[5]。例如,假設“內容”字段只保存了原始數(shù)據(jù)行中的部分數(shù)據(jù),那么通過“數(shù)據(jù)源的名稱”字段、“表名”字段和“主鍵信息”字段就可以反查出此數(shù)據(jù)行中的其他數(shù)據(jù)。為了簡單起見,將數(shù)據(jù)行中的所有字段的數(shù)據(jù)拼接起來,生成“內容”字段。
另外,數(shù)據(jù)庫中的數(shù)據(jù)可能并非全部需要被索引,因此在建立索引時,需要有對數(shù)據(jù)進行過濾的功能。前文提到的在配置文件中對排除范圍的配置,只能精確到數(shù)據(jù)表的級別。為了更精確地進行控制,搜索引擎提供了一個擴展點,可以通過編寫代碼將過濾數(shù)據(jù)的能力提升到數(shù)據(jù)行級別。搜索引擎提供的全部擴展點如表3所示。
表3 搜索引擎提供的擴展點
2.3 更新索引
通常,數(shù)據(jù)庫中的數(shù)據(jù)不是一成不變的,數(shù)據(jù)常常會更新,包括增加、刪除和修改。在數(shù)據(jù)更新時,搜索引擎的索引文件也必須相應地進行更新。針對不同特點的數(shù)據(jù)庫,本文中的搜索引擎提供了兩種可選的方式來更新索引。
1)全量更新方式。此更新方式針對數(shù)據(jù)可能會被增加、刪除和修改的數(shù)據(jù)庫。當數(shù)據(jù)有更新時,搜索引擎會重建索引文件,然后刪除之前的舊索引文件。在重建索引文件期間,仍然使用舊索引文件進行搜索,因此搜索服務不會中斷。
2)增量更新方式。此更新方式主要針對數(shù)據(jù)只會被增加、修改的數(shù)據(jù)庫。對于新增的數(shù)據(jù),只需要重復上述的建立索引過程,并將索引文件合并到已有的索引目錄即可。對于更新的數(shù)據(jù),可以使用Lucene提供的更新索引的方法,通過索引文檔的ID字段找到對應的索引,進行更新操作即可。
另外,搜索引擎還提供了一個后臺定時任務,以固定的時間間隔執(zhí)行更新索引的操作。同時也支持手動觸發(fā)的方式來更新索引。
2.4 對中文的支持
在建立索引和處理搜索關鍵詞時,需要對數(shù)據(jù)文本進行分詞處理。Lucene本身不支持中文分詞,數(shù)據(jù)中含有中文時,使用Lucene建立索引和搜索時將不會得到預期的結果。但是作為一個高度模塊化的庫,Lucene的分詞過程由分詞器完成,同時又支持第三方分詞器的接入,從而替代原生的分詞器。針對中文分詞,最出名、使用最廣泛的是IKAnalyzer分詞器,本文中正是用它完成中文分詞。
2.5 實現(xiàn)分類搜索
建立索引階段生成的索引文件都存在一個目錄下,在搜索階段將會對此索引目錄下的所有索引文件進行檢索。但是某些情況下,搜索引擎沒有必要檢索所有數(shù)據(jù)范圍,而是只檢索某個數(shù)據(jù)庫中的數(shù)據(jù),或者只檢索屬于某個或某幾個分類的數(shù)據(jù)。例如,假設作戰(zhàn)數(shù)據(jù)庫中存儲了我情數(shù)據(jù)、敵情數(shù)據(jù)和地情數(shù)據(jù),用戶可能只希望搜查我情數(shù)據(jù)分類中的結果。此時如果不加區(qū)分地對整個索引目錄進行檢索,將會在搜索結果中出現(xiàn)用戶不需要的無用數(shù)據(jù),并且會消耗更多的查詢時間。
為了能夠更好地支持分類搜索,需要在建立索引階段將數(shù)據(jù)按照需要分成幾個類別,可以在配置文件中配置某個數(shù)據(jù)源屬于哪個類別,或者某個表屬于哪個類別。在建立索引時,以類別為名稱建立多個文件夾,將不同類別的數(shù)據(jù)產生的索引文件保存到對應的目錄下。同時也可以通過樹狀的目錄結構實現(xiàn)多級分類。在搜索階段,根據(jù)用戶指定的類別,只需要到對應的索引目錄下去檢索數(shù)據(jù)即可,如圖3所示。如果用戶希望搜索某幾個分類或全部分類的數(shù)據(jù),可以通過Lucene合并索引目錄的能力實現(xiàn),即將多個索引目錄映射成一個虛擬的索引目錄。在此基礎上,也可以實現(xiàn)對某個指定的數(shù)據(jù)源進行搜索的功能。
圖3 搜索引擎分類搜索的原理
2.6 實現(xiàn)多種排序方式
排序是搜索引擎非常重要的一個環(huán)節(jié),排序的質量會影響整個搜索過程的質量。Lucene默認按照結果的相關度進行排序。所謂相關度,通常是指在某個索引文檔中“內容”字段匹配到的關鍵詞的數(shù)量與“內容”字段的長度的比值。
為了實現(xiàn)更豐富的排序功能,Lucene支持自定義排序方式,即按照索引文檔中的其他字段進行排序,并且可以指定排序字段的優(yōu)先級。本文的搜索引擎實現(xiàn)了按照數(shù)據(jù)源名稱和按照類別進行排序。例如,優(yōu)先按照類別排序,然后在同一個分類中按照相關度進行排序。以作戰(zhàn)數(shù)據(jù)庫為例,搜索結果可以按照我情、敵情和地情的分類順序排列,而在三種分類內部,按照結果的相關度排序。這樣一來,用戶就可以更加方便快速地定位結果。
2.7 摘要和高亮
摘要和高亮功能也是搜索引擎通常會具備的重要功能,通過這兩個功能可以很好地提升搜索引擎用戶的使用體驗。
Lucene本身提供了對摘要功能和高亮功能的支持。其中,摘要功能是從匹配結果附近抽取出一段文字返回給用戶,方便用戶了解搜索結果所處的上下文,以確定搜索結果是否符合自己的預期。而高亮功能通常是對摘要內容中的關鍵字進行特殊處理,以突出展示給用戶。例如對于在瀏覽器中以網(wǎng)頁形式展示的搜索結果,可以通過HTML頁面突出顯示關鍵字。本文中的搜索引擎,采用了將搜索關鍵字變成紅色的方式,同時支持自定義。如圖4所示。
圖4 搜索引擎的摘要和高亮功能示例
最終實現(xiàn)的作戰(zhàn)數(shù)據(jù)庫搜索引擎軟件的模塊組成和調用關系如圖5所示。其中,init模塊:啟動和初始化整個搜索引擎服務;collect模塊:周期性運行采集任務,完成索引的創(chuàng)建和更新;config模塊:用于用戶對數(shù)據(jù)采集過程進行配置;index模塊:將作戰(zhàn)數(shù)據(jù)庫中的數(shù)據(jù)轉化為索引文檔,存入索引庫;db模塊:實現(xiàn)對多源異構的作戰(zhàn)數(shù)據(jù)的透明訪問;web模塊:為用戶提供一個基于瀏覽器的可視化搜索界面;search模塊:根據(jù)用戶輸入的查詢條件,完成搜索、排序、高亮和摘要等功能,返回最終結果;util模塊:為其他模塊提供公共工具。
圖5 搜索引擎的模塊組成和調用關系
數(shù)據(jù)量為1GB的情況下,對若干關鍵詞進行搜索的結果如表4所示。
表4 對不同關鍵詞搜索的結果
數(shù)據(jù)量不同的情況下,對關鍵詞“海軍”進行搜索的結果如表5所示。
表5 不同數(shù)據(jù)量下搜索的結果
由上述的結果可以得出:1)對于不同的關鍵詞,搜索耗時基本在幾百毫秒的數(shù)量級,通常不超過200ms。這個速度完全可以滿足對作戰(zhàn)數(shù)據(jù)進行快速搜索的需求。
2)搜索耗時與搜索的結果數(shù)沒有明顯的關聯(lián),推測可能與倒排索引和搜索算法的內部實現(xiàn)有關。同時在增大數(shù)據(jù)量的情況下,對相同關鍵詞進行搜索的耗時增加緩慢。這表明,在作戰(zhàn)數(shù)據(jù)庫的數(shù)據(jù)不斷增大的情況下,仍能保證用戶的搜索請求能得到及時響應。
在傳統(tǒng)的作戰(zhàn)數(shù)據(jù)軟件中,對作戰(zhàn)數(shù)據(jù)的搜索采用了SQL查詢的方式。每次搜索請求,都需要遍歷大量數(shù)據(jù)表,進行多次數(shù)據(jù)庫查詢,完成一次搜索通常需要幾秒甚至十幾秒,用戶體驗較差。
本文根據(jù)海軍數(shù)據(jù)的特點,基于開源全文檢索庫Lucene,開發(fā)出一種可配置的、支持多種類型數(shù)據(jù)庫的全文搜索引擎,并成功運用到了作戰(zhàn)數(shù)據(jù)搜索的項目實踐當中。完成一次搜索僅需要幾百毫秒,同時能夠保證在數(shù)據(jù)量持續(xù)增大時搜索耗時不會發(fā)生明顯變化,因此用戶體驗得到很大的提升。
作戰(zhàn)數(shù)據(jù)庫搜索引擎的建立具有重要意義:一方面,可以將各單位建設的不同類型的作戰(zhàn)數(shù)據(jù)庫進行統(tǒng)一管理;另一方面,可以滿足我軍在執(zhí)行任務時快速獲取作戰(zhàn)數(shù)據(jù)的需求。
[1] 李樹青, 韓忠愿. 個性化搜索引擎原理與技術[M].北京:科學出版社,2008: 1-2.
[2] 岳昆. 數(shù)據(jù)工程: 處理、分析與服務[M].北京:清華大學出版社,2013: 88-89.
[3] 羅剛. 解密搜索引擎技術實戰(zhàn): Lucene & Java精華版[M].北京:電子工業(yè)出版社,2011: 6-7.
[4] 崔詩程,李千目,戈峰. 基于Lucene的全文檢索架構設計[J].南京理工大學學報(自然科學版), 2015,39(6):692-697.
[5] 秦杰,宋金玉,張廣星. 基于Lucene的本地搜索引擎研究與實現(xiàn)[J].計算機科學, 2014,41(22):368-370.
Full-text Search of Heterogeneous Database Based on Lucene
WANG Liang1, SU Yun2
(1.Navy Command Center, Beijing 100841;2.Jiangsu Automation Research Institute, Lianyungang 222061, China)
Recently the army has accumulated massive operational data, equipment performance, naval battlefield environment etc. These huge data is with various formats, and stored in different types of database. How to retrieve the target information from these data rapidly and exactly is a very important work. Lucene is a Java-based open source library of full text search, and can be easily used to customize a search engine which can meet the specific needs of users. In this paper, we develop a configurable full-text search engine which can support different types of database.
lucene; heterogeneous database; full-text search; search engine; indexing
2016-11-30
2017-02-28
王 亮(1980-),男,遼寧鐵嶺人,碩士研究生,工程師,研究方向為數(shù)據(jù)工程建設。 蘇 云(1986-),男,工程師。
1673-3819(2017)02-0141-04
TP391.3;E917
A
10.3969/j.issn.1673-3819.2017.02.026