摘 要: 基于Lucene開源框架設計實現了MYSearch索引擎">全文搜索引擎。給出了MYSearch實現的基本原理和設計流程,以及實驗結果,并針對Lucene在中文分詞方面的不足展開了討論,給出了改進方法。
關鍵詞: 全文搜索引擎;Lucence;分詞;索引
隨著互聯網的飛速發展,網絡資源量也在迅速增加。最大的搜索引擎Google從2002年的10億網頁增加到現在近40億網頁;最近雅虎搜索引擎號稱收錄了45億個網頁;國內的中文搜索引擎百度的中文頁面從兩年前的7 000萬頁增加到了現在的2億多。據估計,當前整個互聯網的網頁數達到100多億,而且還在快速增長。用戶要在如此浩瀚的信息海洋里尋找信息,猶如“大海撈針”,往往無功而返[1]。如何從資源的海洋里找到自己需要的內容就成了關鍵問題,搜索引擎的出現和研究,使網絡上的資源變得有序,使用戶能更加方便快捷地找到所需資源。目前被大家廣泛使用的搜索引擎如Google、百度等,其實現技術非常復雜,后臺數據庫也非常龐大,更新速度也很快。然而,若想搭建一個全文搜索引擎也并不是遙不可及的事情。本文主要針對Lucene介紹全文搜索引擎實現的各項技術,并給出改進方法。
1 Lucene基本技術原理
目前網絡上有許多全文搜索引擎的開源代碼,若想構建自己的全文搜索引擎,可以在這些開源代碼的基礎上進行。其中,Lucene是比較突出的一款。Lucene不是一個完整的全文索引應用,而是一個用Java寫的全文索引引擎工具包,因此它并不像“百度”或者“Google”那樣,可以直接作為查詢工具使用,而只是為全文搜索引擎的構建提供了基本的工具和設計方法。Lucene提供了一系列API,能夠對文檔進行預處理、過濾、分析、索引和檢索排序。本文就是在Lucene基礎上構建了一個全文搜索引擎MYSearch。
2 MYSearch工作流程
2.1 搜索引擎的基本構成
搜索引擎系統一般由蜘蛛(也叫網頁爬行器)、切詞器、索引器、查詢器幾部分組成。蜘蛛負責網頁信息的抓取工作;一般情況下切詞器和索引器一起使用,它們負責將抓取的網頁內容進行切詞處理并自動進行標引,建立索引數據庫;查詢器根據用戶查詢條件檢索索引數據庫并對檢索結果進行排序和集合運算,再提取網頁簡單摘要信息反饋給查詢用戶。
2.2 MYSearch工作流程
MYSearch首先使用網絡蜘蛛抓取網絡上的可用網頁鏈接,然后把抓取到的網頁資源下載到本地計算機,對下載到本地計算機的網頁進行初步的處理,去掉對搜索沒有意義的信息和詞匯。然后使用Lucene提供的索引功能,對處理后的信息資源建立索引,并且保存到索引數據庫中。之后,根據用戶提供的搜索信息,在索引中進行查詢,并將搜索結果顯示到用戶搜索的界面上。其流程框圖如圖1所示。
3 MYSearch實現
3.1 系統功能模塊的劃分
MYSearch全文搜索系統主要分為網絡蜘蛛抓取、資源初步處理、建立索引、搜索以及顯示等功能模塊。
(1)網絡蜘蛛抓取功能模塊:首先根據事先設定好的網絡入口地址和設置的搜索條件,讀取網頁的內容,分析網頁中其他的鏈接地址,然后垂直鏈接到下一個網頁,這樣一直循環,直到網站的所有網頁都抓取完成或者滿足了搜索的條件為止。
(2)資源初步處理功能模塊:將搜索來的網頁中的信息進行相關處理,去掉沒有用的格式內容和其他對搜索結果沒有實際意義的信息。
(3)建立索引功能模塊:將處理后的網頁資源寫入數據庫,并使用倒排索引算法實現網頁資源索引的建立。
(4)搜索功能模塊:根據用戶的搜索關鍵詞,在已建好索引的數據庫中,根據語素向量的匹配度和相似度進行相關的匹配,然后按照一定的排列順序把搜索結果返回給用戶。
(5)顯示功能模塊:將搜索結果按照一定的顯示方式顯示在頁面中,供用戶選擇和瀏覽。
3.2 MYSearch全文搜索引擎的實現
3.2.1 網絡蜘蛛
網絡蜘蛛是指某個能以人類無法達到的速度不斷重復執行某項任務的自動程序[1]。本系統中使用的蜘蛛程序是Nutch,核心是Crawl工具。它可以根據之前設定好的入口URL列表不斷地自動下載頁面,直到滿足系統預設的停止條件。圖2所示是Nutch的工作機制。
3.2.2 網頁初步處理
網頁剛剛被抓取下來的時候,存在很多格式化的信息(如html的網頁標記),還有很多多余的信息(比如“is,the,an”)。這些信息都是噪音,如果想要使搜索引擎更高效、更準確地運行,就要去除這些信息,留下有效的信息。
對于html標記的處理,首先就是準備一個空字符串,然后判斷網頁的文字中是否存在html的“<>”符號,如果是html“<>”的符號,就繼續判斷網頁中的下一個字符,如果不是就把該字符保存到這個空字符串中;如果判斷完成,就結束;否則就繼續判斷。對于多余信息,在Lucene中提供了相關的包進行處理。
通過上面的處理之后,下載的文件在建立索引的時候,就會更加便捷。
3.2.3 索引的建立
在日常的生活中,往往需要快速地從海量頁面信息中定位頁面資源。這樣的需求就需要用索引技術來實現。索引建立的好壞直接影響搜索效果和用戶的體驗感覺,所以索引的建立方法十分重要。Lucene采用倒排索引算法建立索引[2],主要包括索引類(IndexWriter)、文檔對象類(Document)和信息字段對象類(Field)。索引建立的過程為:
(1)建立索引器IndexWriter;
(2)建立文檔對象Document;
(3)建立信息字段對象Field;
(4)將Field添加到Document;
(5)將Document添加到IndexWriter里面;
(6)關閉索引器IndexWriter。
Lucene將建好的索引信息存儲在“_0.cfs”、“segments.gen”以及“segments_s”文件中。
3.2.4 信息搜索
用戶提交的查詢請求通常是一個詞語或者短語,MYSearch搜索引擎在接受用戶訪問后會進行一系列處理并最終向用戶提交。當用戶輸入關鍵詞搜索后,由搜索程序從索引數據庫中找到符合該關鍵詞的所有相關文檔。因為所有文檔針對該關鍵詞的相關度早已算好,所以只需按照現成的相關度數值排序。排序規則是相關度越高,排名就越靠前。然后,就會把查詢到的信息返回給用戶,并進行顯示。基本查詢流程如圖3所示。
3.2.5 搜索結果顯示
良好的交互設計可以使用戶的操作更加簡便,可以使用戶能夠更快更準確地找到自己想要的信息,同時能夠增加用戶的滿意度。MYSearch全文搜索引擎設計了一個簡捷的搜索界面,用戶在該界面中輸入搜索條件,提交后就可以看到查詢結果。
4 改進
在一個搜索引擎中,搜索速度的快慢、搜索效率的高低、搜索準確度的高低,很大程度上取決于分詞的優劣。分詞就是為生成索引提供原材料,如果分詞分得不明確,則生成的索引必然復雜,那些沒有實際意義的分詞被稱為噪音,噪音多了搜索速度必然下降。Lucene其實自身是帶有中文分詞功能的,主要采用“單字切分”和“二分法”,但是由于它沒有做到確定最小索引項,因此無法去除噪音,搜索效率大大降低。
為了改進Lucene的中文分詞的缺陷,MYSearch全文搜索引擎采用了IK_Canalyzer中文分析器。IK_Canalyzer中文分析器實現了以詞典為基礎的正反向全切分和一級正反向最大匹配切分兩種方法。IK_Canalyzer中文分析器是第三方實現的分析器,繼承自Lucene的Analyzer類。圖4(a)和圖4(b)分別為采用Lucene與IK_Canalyer分詞的顯示結果,可明顯看出后者優于前者。
MYSearch是基于Lucene設計實現的一個全文搜索引擎,本文給出了設計過程以及實驗結果,并針對Lucene在中文分詞方面的不足給出了解決辦法。此外目前可以獲得的Lucene開源代碼中并沒有對PDF、Word、Excel等常用的文本格式進行搜索。要想克服上述問題,就要對不同格式的文本進行解析,把解析出來的文字提取出純文本,然后就像建立網頁的索引一樣,對提出來的文字建立索引,以便查詢。這將是進一步需要改進MYSearch全文搜索引擎的工作重點。
參考文獻
[1] 吳卓斌.基于Lucene全文搜索引擎關鍵技術的研究[D]. 廣州:暨南大學,2007.
[2] 隋麗萍,徐承韜.一個中文全文檢索系統的設計與實現[J].科技資訊,2007,5(18):244-245.
[3] 張校乾,金玉玲,侯麗波.一種基于Lucene檢索引擎的全文數據庫的研究與實現[J].現代圖書情報技術,2005,21(2):12-14