楊 單
(中南民族大學 管理學院,武漢430074)
當前,校園網內部信息的數量在高速增長,如何讓校園師生們更快速、更準確地獲取校內信息,單純依靠傳統Internet上的大型搜索引擎有時候不一定特別奏效,因為通用搜索引擎根據自身的策略不可能覆蓋某一學校的局域網內所有的網頁,存在信息覆蓋率不高的問題,同時由于網頁的重要性問題,信息的更新會比較慢.例如Google在網頁抓取策略方面使用的就是基于鏈接評價的搜索引擎[1],它獨創(chuàng)的“鏈接評價體系”認為一個網頁的重要性取決于它被其它網頁鏈接的數量,特別是一些已經被認定是“重要”的網頁的鏈接數量,這樣對于局域網內相關信息搜索的準確率就不會很高,而校園網上用戶對于校園內部信息的查準率的要求要高于查全率.基于此種需求,本系統的主要目的是探索實現針對校內信息的搜索引擎,著眼于學校內部信息的收集與處理,使相關用戶更快捷地找到所關注的信息.
Apache Lucene 是一個開放源程序的、用 Java 寫的全文檢索引擎工具包,利用它可以輕易地為 Java 軟件加入全文搜索功能,用戶可以基于它開發(fā)出各種全文搜索的應用.作為一種全文檢索引擎的架構,Lucene提供了完整的查詢引擎、索引引擎及部分文本分析引擎[2].
Lucene關注文本的索引和搜索,并為數據訪問和管理提供簡單的函數調用接口,可以方便地嵌入到各種應用中實現針對應用的全文索引、檢索功能[3].Lucene 作為一個優(yōu)秀的全文搜索引擎的架構,其系統結構運用了大量面向對象的編程思想,定義了一個與平臺無關的索引文件格式,通過抽象將系統的核心組成部分設計為抽象類,并將與具體平臺相關的部分也封裝為類,經過層層面向對象編程的處理,最終達成一個低耦合、高效率、容易二次開發(fā)的搜索引擎系統[4].作為一個開放源代碼項目,Lucene 以其優(yōu)異的索引結構、良好的系統架構獲得了越來越多的應用.
按照相關功能,系統分為兩大部分:網頁資源采集與索引、檢索與展示.網頁資源采集和索引部分包括了網頁資源采集、資源處理與索引兩大模塊,檢索與展示部分包括數據檢索、網頁快照、關鍵字過濾三大模塊,如圖1所示.
圖1 系統模塊設計圖
本系統結構由3個部分組成:數據庫服務器,搜索引擎核心服務器,Tomcat Web服務器,各部分既分工明確又相互合作.數據庫服務器記錄資源抓取情況、索引情況,它與搜索引擎核心服務器協作完成資源的下載更新與索引,同時通過記錄網頁的抓取歷史,使網絡爬蟲具備了自動學習的功能,即根據網頁的更新頻率來調整自身的抓取頻率.Tomcat服務器比較獨立,與其他部分沒有交互,但是它的數據來源于前面索引好的索引文件,同時其網頁快照功能實現也是以網絡爬蟲抓取的原始網頁文件為基礎的.
整個系統運行的數據流程如圖2所示:第一階段網絡爬蟲從數據庫中獲取需要抓取的網頁信息,進行網頁的下載,下載后需要將下載時間、文件存放路徑等信息記錄到數據庫中,同時將下載的文件存放在硬盤上;第二階段是Lucene建立索引階段,先從數據庫中取得需要建立索引的任務,然后進行處理,并將索引結構寫入到索引文件中;第三階段是檢索階段,系統檢索建立好的索引文件,并且將查詢到的結果返回給用戶.
圖2 系統數據流程圖
網頁資源采集模塊主要負責從網絡上抓取相關網頁信息,即通常所說的網絡爬蟲Spider.網絡爬蟲采用多線程,多個線程(SpiderWorker)同時下載網頁資源.而下載的網頁和需要下載的網頁的相關信息存儲在數據庫中,并且網頁需要更新.基于以上考慮,Spider的功能實現主要從以下幾個方面進行.
(1) 多線程的控制.在有多個任務時,多個工作者線程(SpiderWorker)在取得爬行任務后,往任務隊列中添加新發(fā)現的任務.在沒有任務時,多個線程只剩下一個,監(jiān)視是否有任務需要執(zhí)行,如果有任務且不止一個,它就會喚醒另一個睡眠的線程,而其他線程在沒有任務時就會進入睡眠狀態(tài).基于以上考慮,所有的工作者線程都由某個線程(Spider)掌管,通過該線程(Spider)可以控制網絡爬蟲的運行或停止;
(2) 由于工作者線程不能下載相同的網頁(已經下載過的),所以必須將已經下載過的網頁的相關信息(地址、下載時間等)進行保存,鑒于要處理的網頁較多,所以采用數據庫對網頁的相關信息進行存儲.所以此部分主要涉及對數據庫的相關操作;
(3) 工作者線程的工作主要是從網頁上下載網頁,并對網頁進行解析,所以該部分主要工作是利用socket取得網頁文件,并對網頁內容進行解析,將網頁中找到的網頁地址的相關信息存儲到數據庫中;
(4) 由于當工作者線程在解析一個網頁時,在這個網頁中可能發(fā)現多個網頁地址(本站點或其他站點的),所以在設計時可以根據實際需要確定是否將在本站點發(fā)現的外部站點鏈接加入到工作者隊列中,如果添加還可對其深度進行控制.如只抓取在本站點發(fā)現的該外部鏈接,該外部鏈接上發(fā)現的鏈接不予處理,即其抓取外部鏈接的深度為1.
網絡爬蟲數據處理流程圖如圖3所示.
圖3 網絡爬蟲數據處理流程圖
Lucene建立索引采用的也是多線程的實現方式,基本上實現方式與WEB采集、FTP采集類似,目前主要可以對文本類文件(txt、html、shtml、xml)、word文檔、excel文檔、pdf文檔、數據庫中的記錄等建立索引[5].
純文本類文件處理:對于文本類文件的處理沒有使用Lucene內置的類,而是直接使用java.io.BufferedReader和java.io.FileReader,通過它們讀取文件,并且將空格去掉.
Word文檔處理:使用 org.textmining.text.extraction.WordExtractor進行處理,它是apache下解析word文件的一個類.
Excel文檔處理:使用jxl包里面的 jxl.Cell、jxl.Sheet、jxl.Workbook三個類進行信息的抽??;jxl是一個開源的操作Excel的Java包.
PDF文檔的處理:使用PDFBox包里面的org.pdfbox.pdmodel.PDDocument、org.pdfbox.util.PDFTextStripper兩個類,PDFBox是Java實現的PDF文檔協作類庫,提供PDF文檔的創(chuàng)建、處理以及文檔內容提取功能,也包含了一些命令行實用工具.主要特性包括:從PDF提取文本,合并PDF文檔,PDF 文檔加密與解密,與Lucene搜索引擎的集成,填充PDF/XFDF表單數據,打印PDF文檔等.
Lucene建立索引階段,先從數據庫中取得需要建立索引的任務,然后進行處理,并將索引結構寫入到索引文件中.
用戶輸入關鍵字后,系統會對關鍵字進行分析,判斷關鍵字是否為敏感詞匯,如果為敏感詞直接返回,并提示用戶系統對該關鍵字進行過濾;如果不是敏感詞,則系統檢索已經建立好的索引文件,并對檢索結果進行分頁處理,最后將合適的結果返回給用戶.
該處提到的判斷關鍵字是否為敏感詞匯的方法是采取建立敏感詞庫的方式,不斷將某些詞匯添加到該詞庫,在具體的檢索時,將用戶輸入的關鍵字進行分詞,在敏感詞庫中進行檢索,如果關鍵字存在敏感詞匯,將直接返回,不再進行檢索.
在本系統中,需要利用數據庫記錄網絡資源采集的相關信息,資源采集包括Web網頁采集、FTP采集、數據庫采集,具體涉及到以下幾個表.
(1) 表DownLoaderWorkload.
該表存儲是FTP文檔采集的文件信息,FTP文檔采集時有兩種線程:一種是文件發(fā)現線程(FileFinder),另一種是文件下載線程(DownLoader),FileFinder將發(fā)現的文件信息存儲在DownLoaderWorkload表中,而DownLoader從DownLoaderWorkload表取得需要下載的文件的信息進行下載.
(2) 表SpiderWorkload.
該表用于記錄Web網頁采集信息,與DownLoaderWorkload表功能類似.
(3) 表IndexSource.
該表用于記錄從數據庫中采集的信息.
(4) 視圖IndexResource.
該視圖用于將不同來源的數據以相同的結構呈現給Lucene索引.
網絡爬蟲的實現包括3個層次:網頁訪問與抓取層、多線程控制及網頁解析提取鏈接層、數據庫交互層.網頁訪問與抓取層使用多線程并行處理,在數據庫交互層進行同步控制,防止各線程互鎖資源造成死鎖.3個部分分別對應4個主要類HTTPSocket、SpiderWorker、Spider、SpiderSQLWorkload.
(1) 網頁訪問與抓取層實現.
整個網絡爬蟲是由Spider控制的,SpiderWorker類的功能是訪問網頁并下載網頁,它是個多線程類,采用extend方式實現.HTTPSocket完成了網頁訪問與抓取的全部工作.
該網絡爬蟲的實現參考了Jeff Heaton的爬蟲模型[6],對其進行了適度地改進以滿足自身的需求,主要的改進體現在以下方面.
(a) 在數據庫中增加了網頁抓取記錄,同時使爬蟲增加了對更新后的網頁重新抓取的功能;
(b) 在網絡爬蟲的多線程控制方面:原網絡爬蟲在所有的任務完成后,所有的線程全部停止退出,修改后,沒有任務時只留下一個線程監(jiān)視是否有新的任務,其他線程進入睡眠狀態(tài),當有新的任務時,活躍的一個線程負責喚醒其他睡眠的線程繼續(xù)作業(yè).該改進主要是為了實現網絡爬蟲抓取的自動化.
(2) 多線程控制及網頁解析提取鏈接層實現.
(a) 多線程控制. 該系統的多線程的控制是用wait()與notify()實現的,整個網絡爬蟲線程的數量是由參數文件控制的,例如啟動了100個線程同時采集網頁,當資源隊列中的網頁采集完成后,其余的99個線程進入睡眠狀態(tài),保留一個線程處于活躍狀態(tài),它的主要作用是查詢資源隊列需要采集的任務,當任務數大于1時,它會按照任務量喚醒一定數量的線程繼續(xù)工作.圖4是該部分功能實現的流程圖.
(b) 網頁解析提取鏈接層. 網頁解析工作是由SpiderWorker承擔的,而且網頁的更新也是由其判斷HTTP頭信息來判斷網頁是否更新過.根據HTTP頭信息里面的Last-Modified屬性確定網頁的最新更新時間,將這個時間和數據庫中上次抓取的時間進行比較,如果更新時間晚于上次抓取時間,即再次抓取.processWorkload()方法實現了大部分功能,包括解析網頁、提取鏈接、保存網頁等.
圖4 多線程控制流程圖
(3) 數據庫交互層實現.
數據庫交互層實現主要類為SpiderSQLWorkload,它的assignWorkload()、addWorkload(String url)等方法完成了與數據庫交互的大部分工作,assignWorkload方法的作用是為網絡爬蟲分配爬行任務,addWorkload方法的作用是將網絡爬蟲解析網頁發(fā)現的鏈接加入到資源隊列中,該鏈接是經過去重等一系列處理的,保證其在資源隊列中的唯一性.
Lucene是一個開放源代碼的全文檢索引擎工具包,它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎[7].
本系統使用Lucene Smartcn進行中文分詞,并且支持多種資源的索引,如doc、xls、pdf、html、shtml、htm、xml、txt等類型的資源,針對每種資源其索引方法都不相同,針對此問題,系統充分利用了JAVA語言多態(tài)的特性進行處理,即所有的資源類型都統一實現IndexResource接口的buildIndex()方法,但是每種資源的實現方法各異.如ExcelResource、PDFResource、TextResource、WordResource都實現了IndexResource,但是它們buildIndex方法的實現是不同的,這樣使得異構的資源最后都被索引成相同結構的結構性索引文件,如圖5所示.
圖5 Lucene索引工作流程圖
本系統針對校園網的特點改進了傳統搜索引擎,以適應局域網對于數據查詢準確性的要求,同時在某些方面進行了增強,如網頁的更新方面和使網絡爬蟲具備了智能學習的功能,可以根據網頁的更新頻率,智能調整自身抓取頻率.
傳統的搜索引擎有兩個重要參數:查全率和查準率[8].一般情況下,查全率很難比較,在衡量搜索引擎的性能時很少采用,而且本系統重點解決的是校園網信息搜索的查詢準確率問題,所以本系統測試重點在于測試查準率.
以中南民族大學校園網作為測試對象,參照相關測評標準,對查詢進行分類考慮,對于主題頁面的查詢,根據前10個結果中出現的相關頁面數目來判斷系統的性能,通常采用前10個結果的平均精確率(P@10)來評判;對于待定網頁的查詢,則以第一個相關頁面出現位置的倒數平均值(MRR)為評判標準.根據P@10、MRR等參數對系統性能進行了測試和分析,結果見表1.
表1 系統性能測試數據統計結果比較
根據測試結果綜合分析來看,本系統能在校園網內較好地執(zhí)行搜索任務,系統的功能和性能都比較令人滿意.但隨著索引量的增加,系統的響應時間也會有所增長.而隨著關鍵詞的增加以及查詢邏輯的復雜化,查詢的準確率會有所下降.
針對校園信息的特點,利用Lucene開源全文檢索引擎工具包,設計并實現了一個適合于校園等局域網使用的小型搜索引擎,并對相關性能進行了優(yōu)化,達到了較好的效果.該Lucene應用也可推廣到許多其他的應用實例的設計與實現.當然系統還存在一些不足:如網絡資源抓取的速度和效率、中文分詞的準確率等,都需要做進一步的研究.
[1] 李曉明,閆宏飛,王繼民. 搜索引擎——原理、技術與系統[M]. 2版.北京:科學出版社,2012.
[2] 郎小偉,王申康.基于Lucene的全文檢索系統的研究與開發(fā)[J].計算機工程,2006,32(4):94-99.
[3] 梁 弼,王光瓊,鄧小清.基于Lucene的全文檢索系統模型的研究及應用[J].微型機與應用,2011,30(1):44-46.
[4] 趙 珂,逯 鵬,李永強.基于Lucene的搜索引擎設計與實現[J].計算機工程,2011,37(16): 39-41.
[5] 鄭榕增,林世平.基于 Lucene的中文倒排索引技術的研究[J].計算機技術與發(fā)展,2010,20(3):80-83.
[6] Heaton J.網絡機器人Java編程指南[M]. 童兆豐,李 純,劉潤杰,譯.北京:電子工業(yè)出版社,2002.
[7] 張 俊,李魯群,周 熔.基于Lucene的搜索引擎的研究與應用[J].計算機技術與發(fā)展,2013,23(6): 230-232.
[8] Hawking D,Craswell N,Bailey P,et al.Measuring search engine quality[J].Information Retrieval,2001,4(1):33-59.