基于Lucene的圖書搜索引擎的設計與實現_第1頁
基于Lucene的圖書搜索引擎的設計與實現_第2頁
基于Lucene的圖書搜索引擎的設計與實現_第3頁
基于Lucene的圖書搜索引擎的設計與實現_第4頁
基于Lucene的圖書搜索引擎的設計與實現_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、濱江學院 畢業論文(設計)題 目 基于lucene的圖書搜索引擎的設計與實現 院 系 計算機系 專 業 軟件工程 學生姓名 學 號 指導教師 職 稱 教授 二一o年 十二 月 三十 日聲 明本人鄭重聲明:1、 持以“求實、創新”的科學精神從事研究工作。2、 本論文是我個人在導師指導下進行的研究工作和取得的研究成果。3、 本論文中除引文外,所有實驗、數據和有關材料均是真實的。4、 本論文中除引文和致謝的內容外,沒有抄襲其他人或其他機構已經發表或撰寫過的研究成果。5、 其他同志對本研究所做的貢獻均已在論文中作了聲明并表示了謝意。作者簽名: 日 期: 目 錄1 引言11.1 研究背景11.2 圖書搜

2、索引擎的可行性分析22 系統簡介22.1 項目名稱22.2 開發工具22.2.1開發工具簡介22.3 搜索引擎簡介32.4 相關技術簡介32.4.1 jsp簡介32.4.2 servlet簡介42.4.3 lucene簡介52.4.4 heritrix簡介63 系統設計73.1 系統實現流程圖73.2 系統順序圖83.3 系統狀態圖93.4 數據庫設計93.4.1 數據庫建立93.4.2 數據庫連接103.5 索引建立113.6 圖書信息綜合處理124 系統實現134.1 使用heritrix抓取目標網站134.1.1 選擇目標網站134.1.2 配置heritrix、開始抓取134.2 抓取

3、內容的處理164.2.1 用htmlparser對網頁內容建立索引164.2.2 其他格式文檔的處理164.3 用lucene為抓取的網站建立索引164.4 搜索關鍵字164.4.1 indexsearcher174.4.2 query174.4.3 hits174.4.4 term184.5搜索引擎的交互界面184.5.1 dwr技術184.5.2 前臺界面205 全文總結216 致謝21參考文獻22abstract2424基于lucene的圖書搜索引擎喬梁南京信息工程大學濱江學院軟件工程專業,南京 210044摘要:隨著網絡的飛速發展,人們不僅僅使用互聯網看視頻、瀏覽新聞和網絡聊天,更把網

4、絡當成一種信息查詢的工具。其原因就在于網絡上龐大的信息量使得人們足不出戶就可以得到自己想要的信息。本文將設計基于lucene+ heritrix的圖書搜索引擎。論文首先介紹了本項目的相關知識背景,簡述了lucene和heritrix然后闡述了數據庫設計,最后說明了系統的具體實現過程。本系統的開發工具采用的是myeclipse和sql server2005。關鍵詞:lucene;heritrix;搜索引擎1 引言伴隨著internet技術的飛速發展,web技術已經不再局限于單純地提供娛樂休閑,而是逐漸成為人們搜索信息的一種工具。網絡上存在著大量的信息源,讓人們花費最短的時間得到最想要的信息。lu

5、cene是一個開源的全文搜索引擎包,配合上heritrix網絡爬蟲,再加上jsp的調用部署就可以實現一個功能強大的搜索引擎。使用heritrix從網絡上爬取大量信息,然后使用lucene建立索引,最后通過jsp頁面展示在用戶面前。就這樣一個網絡全文搜索引擎整個工作流程就完成了。1.1 研究背景搜索,這兩個字無疑是當今互聯網業界最為流行的字眼之一。在 baidu上輸入“搜索引擎”這個關鍵字,可以找到3000多萬的網頁。在google上查找時可以找到750萬個網頁。google的巨大成功讓整個世界都把眼光投入到搜索引擎這個領域中。一夜間,各種各樣的搜索服務席卷而來,從最初的google、yahoo

6、到今天的baidu、msn、中搜、sougou等,搜索引擎的品種越來越多,服務也越來越豐富。同時,伴隨著web2.0的瘋狂普及,網絡信息的查找速度成指數增長,各種各樣的網站都需要為其加入檢索功能,以滿足用戶的需要。另外,在企業級應用的市場上,全文信息檢索的需求也一直在增加,各種文檔處理、內容管理軟件都需要加入全文檢索的功能。在這樣的背景下,搜索引擎的技術迅速發展。各種討論搜索的文章、雜志、論文鋪天蓋地,論壇和博客上的帖子也是層出不窮。一時間,搜索技術成為最熱門的技術之一。不過搜索引擎技術并不是一種大眾技術,從其出現開始,就一直是一種高門檻的技術,他的后臺包括學術領域的眾多先進思想和設計,其涉及

7、的學科包括自然語言處理、人工智能、離散數學、排列組合、編譯原理等。因此設計一個性能良好,并且實用性強的搜索引擎并非易事。在互聯網發展的最初階段,網站的數量相對較少,信息查找比較容易。隨著互聯網爆發性地發展,用戶很難找到所需的資料。這時,搜索引擎的需求就出現了,一些為滿足大眾信息檢索需求的專業搜索網站也就應運而生。可見一個高效的功能完善的搜索引擎的重要性。1.2 圖書搜索引擎的可行性分析隨著近年來計算機的飛速發展,人們正式進入了互聯網時代。閑暇無事時人們習慣于上網沖浪,在工作中遇到問題時也會上網查詢資料或是發帖提問尋求大家的幫助。不知不覺人們已經離不開網絡。網絡上有著大量的信息來源,在以前你也許

8、會為了查找一些資料花一整天時間泡在圖書館里一本一本的翻閱。有時甚至還找不到自己想要的信息,實在是事倍功半。而現在到你要查找信息時只需上網在搜索你想要的信息就可以了。這不但節省了大量的人力物力而且還大大提高了辦事的效率。2 系統簡介2.1 項目名稱基于lucene的圖書搜索引擎2.2 開發工具myeclipse+sql server20052.2.1開發工具簡介1. myeclipsemyeclipse是一個機遇java的、開放源碼的、可擴展的應用開發平臺,它為編程人員提供了一流的java繼承開發環境(ide)。它是一個可以用與構建集成web和應用程序開發工具的平臺,本身并不會提供大量的功能,而

9、是通過插件來實現程序的快速開發功能。myeclipse 為eclipse提供了一個大量的java的工具的集合,是eclipse的一個不錯的插件。2. tomcat一個流行的開放源碼的jsp應用服務器程序。它是apache基金會的jakarta項目中的一個核心項目,由apache,sun和其它一些公司及個人共同開發而成。由于有了sun的參與和支持,最新的servlet和jsp規范總能在tomcat中得體現。tomcat服務器具有免費、跨平臺等諸多特性,并且更新的快,現在非常流行。tomcat 是一個輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試jsp 程序的

10、首選。3. sql seversql server的全稱是microsoft sql server,是由美國微軟公司制作并發布的一種性能優越的關系型數據庫管理系統(relational database management system,rdbms),它是一個多關系數據管理系統。它不僅是一個完整的數據庫,而且具有強大的擴展性。它是windows操作系統最為流行的數據庫,比較適合小型、中型或大型應用程序的后臺數據庫。它也適用于電子商務,數據倉庫和在線商業應用程序等。系統從數據庫的基礎概念和應用領域中加強了對數據庫的認識,目前使用的數據庫一般都是關系數據庫管理系統(rdbms),它分別從關系、管

11、理系統(ms)、數據庫三個方面來定義。又從定義數據庫的目標、數據庫的邏輯設計、數據庫的物理設計、數據庫的物理實現、復查構建為數據庫來構建數據庫。sql語言是一種在大多數數據庫中檢索用戶所需數據的通用語言,它不僅在數據的安全性和穩定性上有著非凡的表現,而且在數據處理的能力和效率上也無與倫比,這使它成為目前最為流行的數據查詢語言之一。2.3 搜索引擎簡介本項目是設計基于lucene的垂直搜索引擎。所謂垂直搜索引擎是關注于信息抓取和檢索的系統,與通用搜索引擎相比,數據分析更準確,涉及的內容也更專業。所以課程設計要構建的就是一個面向圖書信息的垂直搜索引擎。系統需要選擇所要關注的行業和領域,進行分析了解

12、,準備垂直數據來源。系統運用網絡爬蟲模塊獲取所需搜索領域的數據,利用文本分析和信息提取程序得到有效的領域信息并進行格式優化存儲和管理。存儲的信息和數據通過全文索引模塊和檢索模塊為用戶提供信息檢索和服務。2.4 相關技術簡介2.4.1 jsp簡介jsp(javaserver pages)是由sun microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。jsp技術有點類似asp技術,它是在傳統的網頁html文件(*.htm,*.html)中插入java程序段(scriptlet)和jsp標記(tag),從而形成jsp文件(*.jsp)。 用jsp開發的web應用是跨平臺的,

13、即能在linux下運行,也能在其他操作系統上運行。jsp技術使用java編程語言編寫類xml的tags和scriptlets,來封裝產生動態網頁的處理邏輯。網頁還能通過tags和scriptlets訪問存在于服務端的資源的應用邏輯。jsp將網頁邏輯與網頁設計和顯示分離,支持可重用的基于組件的設計,使基于web的應用程序的開發變得迅速和容易。 web服務器在遇到訪問jsp網頁的請求時,首先執行其中的程序段,然后將執行結果連同jsp文件中的html代碼一起返回給客戶。插入的java程序段可以操作數據庫、重新定向網頁等,以實現建立動態網頁所需要的功能。 jsp與java servlet一樣,是在服務

14、器端執行的,通常返回該客戶端的就是一個html文本,因此客戶端只要有瀏覽器就能瀏覽。 jsp的1.0規范的最后版本是1999年9月推出的,12月又推出了1.1規范。目前較新的是jsp1.2規范,jsp2.0規范的征求意見稿也已出臺。jsp頁面由html代碼和嵌入其中的java代碼所組成。服務器在頁面被客戶端請求以后對這些java代碼進行處理,然后將生成的html頁面返回給客戶端的瀏覽器。java servlet 是jsp的技術基礎,而且大型的web應用程序的開發需要java servlet和jsp配合才能完成。jsp具備了java技術的簡單易用,完全的面向對象,具有平臺無關性且安全可靠,主要面

15、向因特網的所有特點。 1 jsp技術的強勢 (1)一次編寫,到處運行。在這一點上java比php更出色,除了系統之外,代碼不用做任何更改。(2)系統的多平臺支持。基本上可以在所有平臺上的任意環境中開發,在任意環境中進行系統部署,在任意環境中擴展。相比asp/php的局限性是現而易見的。 (3)強大的可伸縮性。從只有一個小的jar文件就可以運行servlet/jsp,到由多臺服務器進行集群和負載均衡,到多臺application進行事務處理,消息處理,一臺服務器到無數臺服務器,java顯示了一個巨大的生命力。 (4)多樣化和功能強大的開發工具支持。這一點與asp很像,java已經有了許多非常優秀

16、的開發工具,而且許多可以免費得到,并且其中許多已經可以順利的運行于多種平臺之下。 2 jsp技術的弱勢 (1)與asp一樣,java的一些優勢正是它致命的問題所在。正是由于為了跨平臺的功能,為了極度的伸縮能力,所以極大的增加了產品的復雜性。 (2)java的運行速度是用class常駐內存來完成的,所以它在一些情況下所使用的內存比起用戶數量來說確實是“最低性能價格比”了。從另一方面,它還需要硬盤空間來儲存一系列的.java文件和.class文件,以及對應的版本文件。2.4.2 servlet簡介servlet是在服務器上運行的小程序。這個詞是在java applet的環境中創造的,java ap

17、plet是一種當作單獨文件跟網頁一起發送的小程序,它通常用于在客戶端運行,結果得到為用戶進行運算或者根據用戶互作用定位圖形等服務。 服務器上需要一些程序,常常是根據用戶輸入訪問數據庫的程序。這些通常是使用公共網關接口(cgi(common gateway interface))應用程序完成的。然而,在服務器上運行java,這種程序可使用java編程語言實現。在通信量大的服務器上,java servlet的優點在于它們的執行速度更快于cgi程序。各個用戶請求被激活成單個程序中的一個線程,而無需創建單獨的進程,這意味著服務器端處理請求的系統開銷將明顯降低。 最早支持servlet技術的是javas

18、oft的java web server。此后,一些其它的基于java的webserver開始支持標準的servletapi。servlet的主要功能在于交互式地瀏覽和修改數據,生成動態web內容。這個過程為: 客戶端發送請求至服務器端; 服務器將請求信息發送至servlet servlet生成響應內容并將其傳給server。響應內容動態生成,通常取決于客戶端的請求 服務器將響應返回給客戶端 servlet看起來像是通常的java程序。servlet導入特定的屬于java servletapi的包。因為是對象字節碼,可動態地從網絡加載,可以說servlet對server就如同applet對cli

19、ent一樣,但是,由于servlet運行于server中,它們并不需要一個圖形用戶界面。從這個角度講,servlet也被稱為facelessobject。 一個servlet就是java編程語言中的一個類,它被用來擴展服務器的性能,服務器上駐留著可以通過“請求-響應”編程模型來訪問的應用程序。雖然servlet可以對任何類型的請求產生響應,但通常只用來擴展web服務器的應用程序。2.4.3 lucene簡介lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引

20、擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。作為一個開放源代碼項目,lucene從問世之后,引發了開放源代碼社群的巨大反響,程序員們不僅使用它構建具體的全文檢索應用,而且將之集成到各種系統軟件中去,以及構建web應用,甚至某些商業軟件也采用了lucene作為其內部全文檢索子系統的核心。apache軟件基金會的網站使用了lucene作為全文檢索的引擎,ibm的開源軟件eclipse9的2.1版本中也采用了lucene作為幫助子系統的全文索引引

21、擎,相應的ibm的商業軟件web sphere10中也采用了lucene。lucene以其開放源代碼的特性、優異的索引結構、良好的系統架構獲得了越來越多的應用。 lucene是一個高性能、可伸縮的信息搜索(ir)庫。它使你可以為你的應用程序添加索引和搜索能力。lucene是用java實現的成熟的、免費的開源項目,是著名的apache jakarta大家庭的一員,并且基于在apache軟件許可 asf, license。同樣,lucene是當前與近幾年內非常流行的免費的java信息搜索(ir)庫。lucene作為一個全文檢索引擎,其具有如下突出的優點: (1)索引文件格式獨立于應用平臺。luce

22、ne定義了一套以8位字節為基礎的索引文件格式,使得兼容系統或者不同平臺的應用能夠共享建立的索引文件。 (2)在傳統全文檢索引擎的倒排索引的基礎上,實現了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達到優化的目的。 (3)優秀的面向對象的系統架構,使得對于lucene擴展的學習難度降低,方便擴充新功能。 (4)設計了獨立于語言和文件格式的文本分析接口,索引器通過接受token流完成索引文件的創立,用戶擴展新的語言和文件格式,只需要實現文本分析的接口。 (5)已經默認實現了一套強大的查詢引擎,用戶無需自己編寫代碼即使系統可獲得強大的查詢能力,lucene的查詢

23、實現中默認實現了布爾操作、模糊查詢(fuzzy search11)、分組查詢等等。 面對已經存在的商業全文檢索引擎,lucene也具有相當的優勢。 首先,它的開發源代碼發行方式(遵守apache software license12),在此基礎上程序員不僅僅可以充分的利用lucene所提供的強大功能,而且可以深入細致的學習到全文檢索引擎制作技術和面相對象編程的實踐,進而在此基礎上根據應用的實際情況編寫出更好的更適合當前應用的全文檢索引擎。在這一點上,商業軟件的靈活性遠遠不及lucene。 其次,lucene秉承了開放源代碼一貫的架構優良的優勢,設計了一個合理而極具擴充能力的面向對象架構,程序員

24、可以在lucene的基礎上擴充各種功能,比如擴充中文處理能力,從文本擴充到html、pdf13等等文本格式的處理,編寫這些擴展的功能不僅僅不復雜,而且由于lucene恰當合理的對系統設備做了程序上的抽象,擴展的功能也能輕易的達到跨平臺的能力。 最后,轉移到apache軟件基金會后,借助于apache軟件基金會的網絡平臺,程序員可以方便的和開發者、其它程序員交流,促成資源的共享,甚至直接獲得已經編寫完備的擴充功能。最后,雖然lucene使用java語言寫成,但是開放源代碼社區的程序員正在不懈的將之使用各種傳統語言實現(例如.net framework14),在遵守lucene索引文件格式的基礎上

25、,使得lucene能夠運行在各種各樣的平臺上,系統管理員可以根據當前的平臺適合的語言來合理的選擇。2.4.4 heritrix簡介heritrix是一個爬蟲框架,可加入一些可互換的組件。它是一個由java開發的、開源的web網絡爬蟲,使用它從網絡上抓取想要的資源。它的執行是遞歸進行的,主要有以下幾步: 1。在預定的uri中選擇一個。 2。獲取uri 3。分析,歸檔結果 4。選擇已經發現的感興趣的uri。加入預定隊列。 5。標記已經處理過的uri 它是ia的開放源代碼,可擴展的,基于整個web的,歸檔網絡爬蟲工程 。heritrix工程始于2003年初,ia的目的是開發一個特殊的爬蟲,對網上的資

26、源進行歸檔,建立網絡數字圖書館,在過去的6年里,ia已經建立了400tb的數據。heritrix主要有三大部件:范圍部件,邊界部件,處理器鏈 。范圍部件:主要按照規則決定將哪個uri入隊。 邊界部件:跟蹤哪個預定的uri將被收集,和已經被收集的uri,選擇下一個 uri,剔除已經處理過的uri。 處理器鏈:包含若干處理器獲取uri,分析結果,將它們傳回給邊界部件。heritrix 1.0.0包含以下關鍵特性: 1.用單個爬蟲在多個獨立的站點一直不斷的進行遞歸的爬。 2。從一個提供的種子進行爬,收集站點內的精確uri,和精確主機。 3。主要是用廣度優先算法進行處理。 4。主要部件都是高效的可擴展

27、的 5。良好的配置,包括: a。可設置輸出日志,歸檔文件和臨時文件的位置 b。可設置下載的最大字節,最大數量的下載文檔,和最大的下載時間。 c。可設置工作線程數量。 d。可設置所利用的帶寬的上界。 e。可在設置之后一定時間重新選擇。 f。包含一些可設置的過濾機制,表達方式,uri路徑深度選擇等等。 heritrix的局限: 1。單實例的爬蟲,之間不能進行合作。 2。在有限的機器資源的情況下,卻要復雜的操作。 3。只有官方支持,僅僅在linux上進行了測試。 4。每個爬蟲是單獨進行工作的,沒有對更新進行修訂。 5。在硬件和系統失敗時,恢復能力很差。3 系統設計3.1 系統實現流程圖圖3.1系統實

28、現流程圖3.2 系統順序圖圖3.2系統順序圖3.3 系統狀態圖圖3.3體統狀態圖3.4 數據庫設計3.4.1 數據庫建立圖書信息數據庫只需完成對于讀書相關信息的存儲,所以比較簡單,只需建立bookinfo表,如下表:表3.1數據庫設計表列名數據類型允許空是否主鍵idint非主鍵namevarchar(50)非typevarchar(50)contentvarchar(max)urlvarchar(50)imageurlvarchar(50)updatetimevarchar(64)3.4.2 數據庫連接圖3.4數據庫表結構圖一、裝入jdbc驅動程序drivermanager類管理各種數據庫驅動

29、程序,建立新的數據庫連接,以便將java應用程序能夠使用正確的jdbc驅動程序。drivermanager類包含一系列driver類,它們通過調用方法driver.registerdriver對自己進行了注冊。所有driver類都必須包含有一個靜態方法,利用這個靜態方法可以創建該類的實例,然后在加載該實例時向drivermanager類進行注冊。這樣,用戶正常情況下將不會直接調用driver.registerdriver,而是在加載驅動程序時由驅動程序自動調用。可以通過調用方法class.forname(),這種方法可以顯式地加載驅動程序類。如:/裝載并注冊sql server driverc

30、lass.forname(“com.microsoft.jdbc.sqlserver.sqlserverdriver”);java.sql.drivermanager.registerdriver(new com.microsoft.jdbc.sqlserver.sqlserverdriver();二、建立連接建立連接需要使用drivermanager類的靜態方法getconnection(string url,string username,string password)來建立數據庫的連接對象。其中的三個參數,url表示連接數據庫的jdbc url,username表示連接數據庫的用戶名,

31、password表示連接數據庫的密碼。如:/建立sql server driver數據庫連接string url = “ jdbc:microsoft:sqlserver:/:1433 ;databasename=test”;string username = “sa”;string password = “123456”;connection conn = null;tryconn = drivermanager.getconnection(url,username,password);catch(exception e)e.printstacktrace();jbdc u

32、rl的一般格式為:jdbc:drivertype/parametersdrivertype表示驅動程序的類型,parameters通常用來設定數據庫服務器的ip地址、端口號以及數據庫名稱。三、執行sql語句與數據庫建立連接之后,就可以向所連接的數據庫發送sql語句。jdbc提供了3個類,它們由connection來創建這些類的對象。這3個對象分別是statement對象,preparedstatement對象,以及callablestatement對象。它們都可以作為執行sql語句的容器。每一個都專用于發送特定類型的sql語句。1) statement對象用語執行不帶參數的簡單sql語句,由方

33、法createstatement所創建。2)preparedstatement對象用語執行帶參數或不帶參數的預編譯sql語句,由preparedstatement創建。preparedstatement接口繼承自statement接口,其功能更加的強大。在preparedstatement對象所使用的sql語句中,包含了經過預編譯的sql語句,因此可以獲得更高的執行效率,同時使用起來也更加的方便。在preparedstatement對象所使用的sql語句中,可以包含多個用”?”代表的字段,同時也可以是哦那個setxxxx()的方法來設置該字段的內容,從而增強了程序的動態性。3)callable

34、statement對象用于執行對數據庫存儲過程的調用,由方法preparecall所創建。callablestatement用于執行sql存儲過程一組通過名稱來調用(就像函數的調用那樣)的sql語句。四、檢索結果sql語句發送以后,返回的結果通常存放在一個resultset類的對象中,可將resultset對象看做一個表,這個表中包含由sql返回的列名和相應的值,resultset對象中維持了一個指向當前的指針,通過一系列的getxxxx()方法,可以檢索當前行的各個列,并顯示出來。五、關閉連接在對象使用完畢后,應當使用close()方法解除與數據庫的連接,并關閉數據庫。關閉數據庫的語句為:c

35、on.close();3.5 索引建立lucene的索引過程從indexwriter的adddocument方法開始。在lucene的api中,indexwriter的主要職責是向索引中加入文檔,它提供了建立索引的只要外部借口,但是它的具體實現,也就是索引的寫入過程是由documentwriter來完成的。因此,在整個lucene中,最繁瑣的對數據源分詞、計算出現頻率和位置,以及寫索引過程,實際上是發生在documentwriter中的。在documentwriter中完成了向索引的一些情況進行判斷,并作進一步的合并索引等操作。其基本流程步驟如下:1.初始化一個je分詞的mmanalyzer的

36、實例,用于對文本進行中文分詞和文本分隔處理。2.讀取磁盤詞庫文件,將前面所處理的詞庫進行加載,相關的文件存儲位置通過項目中的配置管理類實例propertyconfiguration得到。3.實現addbook方法,以book類型的對象和一個id值為參數,調用bookdocument.buildbookdocument方法處理,生成lucene的document文檔對象。4.處理后的結果調用indexwriter的adddocument方法,加入索引中,完成索引的創建和追加。除此之外項目中的bookindexer類中還提供了optimize()方法和close()方法,分別用來對索引進行優化和關

37、閉索引。索引創建的程序流程圖如圖3.5所示:圖3.5索引創建流程圖3.6 圖書信息綜合處理項目中需要建立一個類,把數據庫操作、索引操作都集中起來。首先它要可以從文本文檔中提取出需要的內容,來構建book對象;然后調用bookjdbc,向數據庫中寫入book相關信息。另外,再調用bookindexer,把book對象加入到索引中。具體的操作步驟如下:1.調用建立的bookjdbc類和bookindexer類,來對具體的圖書信息進行處理。2.在構造函數被調用,并生成一個booktextfileprocessor的實例后,需要調用其initialize方法來初始化bookjdbc類的實例和booki

38、ndexer的實例。3.通過調用setdirectories方法,為其注入所要處理的圖書詳細信息文件所在的目錄,然后調用process方法開始處理圖書信息。程序的流程圖如下頁圖3.6所示:圖3.6數據庫、索引綜合處理流程圖4 系統實現4.1 使用heritrix抓取目標網站4.1.1 選擇目標網站選擇目標網站看似是一個很簡單的過程,但是實際操作起來你就會發現其實不然。首先我們要選擇幾個包含很多圖書信息的網站,并以這些網站來作為heritrix網絡爬蟲爬取信息的鏈接源。在選定了網站之后就要對這些網站的網頁進行分析。因為我們要把包含圖書分類的頁面作為爬取源,所以我們要盡量選擇包含所有圖書分類的頁面

39、,如果有固然好,但是實際操作中你會發現有的網站的圖書分類并不會在一個頁面中顯示出來。這就要求我們對網站頁面源代碼進行仔細分析,找出目錄的路徑以供heritrix進行爬去。必要的時候我們甚至要編寫一些java小程序生成這些路徑。在本項目中我選用新書城網()做為搜索源。但是由于需要遍歷所有的圖書鏈接以實現網絡爬蟲的爬取,我需要編寫java小程序來抽取鏈接。4.1.2 配置heritrix、開始抓取在做好以上的準備工作之后,開始啟動heritrix進行任務的抓取。heritrix的啟動方式有多種,這里選擇的是最常用的webui方式啟動。在myeclipse配置好

40、heritrix,運行org.archive.crawler.heritri這個類。此時,在heritrix的后臺已經對服務的8080端口進行了監聽,在瀏覽器中訪問http:/ww w.localhost:8080,就可以打開heritrix的webui了。如下圖:圖4.1heritrix webui界面下面要做的就是根據新書城網()的網頁特點,開發定制的下載擴展處理模塊。可以完成對鏈接的提取,內容的抽取等功能。定制的網絡爬蟲要求不保存其他無關頁面。因此,需要擴展heritrix,以實現無關頁面過濾的功能。完成所需要的抓取任務。這種擴展實際上就是加入一種u

41、rl選擇策略,將那些不需要的url過濾掉,以保證所抓取的信息為有用的信息。由于heritrix有多個擴展點,在這里,定制爬蟲選擇擴展postprocessors中的frontierschedular來達到需要。針對抓取新書城網()的圖書信息,編寫專門的代碼。根據對新書城網()頁面的分析,網絡爬蟲的url選擇策略需要支持以下約束,即只有當url中包含以下內容時才允許抓取。(1) /book/(2)/bookpic/(3).jpg(4)ro

42、bots.txt(5)dns:其中“/book/”是圖書詳細信息頁面的url前綴,因此必須讓其通過約束,以使得圖書的詳細信息得以保存。“/bookpic/”是圖書詳細信息頁面上的圖書封面圖片,因此對于這樣的url也要讓其通過約束,讓heritrix將它爬取下來,以用在搜索引擎中。“robots.txt”是針對robots策略時發出的url所包含的字符串,因此也應當讓其加入到frontier中。“dns:”是heritrix在做域名解釋時,發出的一個請求url的前綴,很顯然也需要加入到frontier中去。在定義

43、好了frontierschedular后就可以在運行中使用了,現在我們就可以利用已經獲取的抓取列表進行抓取試驗。具體的運行步驟如下:(1)在myeclipse中啟動運行heritrix,等待程序正常輸出系統提示后,表明系統已經開始運行,可以進行配置和抓取。(2)在瀏覽器中輸入http:/localhost:8080/訪問管理界面,輸入已經設置的用戶名和密碼admin:admin,登錄管理界面。(3)創建抓取數據的job,并在modules中選擇“frontierschedulerforbook”選項,代替原先的frontierscheduler。如下圖所示:圖4.2替換frontiersche

44、duler選項(4)更改job中的參數,在setting中設置http-headers參數,設置user-agent中的網址以及from中的郵件地址。如下圖所示:圖4.3設置http-headers(5)job開始后就可以抓取種子,并進行解析,生成大量待抓的url。圖4.2為抓取剛開始后的截圖。圖4.4heritrix抓取開始4.2 抓取內容的處理4.2.1 用htmlparser對網頁內容建立索引htmlparser是一個開源的java庫,提供接口、支持線性和嵌套的解析html文本。htmlparser libaries提供了一系列訪問本地和網絡html資源的api。這些api分兩個層次,分

45、別封裝在htmllexer.jar和htmlparser.jar中。htmlparser提供了提取文本信息的api,使搜索引擎開發者擺脫了繁瑣的正則匹配過程,只需要通過這些api,就可以很方便的提取特定文本,大大提高工作效率。htmllexer.jar提供底層的借口,負責訪問html中的文本、注釋、標簽等節點,并把半結構化網頁轉換成線性的節點。htmlparser.jar包含了htmllexer.jar,封裝了底層的訪問節點的方法,以樹型結構返回所有節點。抓取網站的內容有各種各樣的格式,因為主要是靜態網頁,所以一般格式為.html,為了提高建立索引的精確度本系統采用了第三方的htmlparse

46、r這個工具來解析網頁。繼承htmlparser的基類extractor,來實現對鏡像文件中html文件的解析。在基類中,實現了遞歸遍歷一個目錄、復制圖片、正則匹配等大部分公用的方法。處理后是以文本文件格式存儲的,以便之后分詞和建立索引使用。因為html網頁中包含了大量的格式信息和標記信息。所以在建立索引之前需要進行數據內容的抽取。4.2.2 其他格式文檔的處理在本系統中,對microsoft word、 excel、powerpoint、以及常見的pdf格式文檔也提供了相應的處理類,雖然lucene中沒有包含能夠自動索引非純文本文檔的工具,但是可以使用很多免費的或者商業的工具,這些工具可以幫助

47、我們從媒體文檔中提取出純文本類型的數據。每個類都使用了一個第三方的工具來提取文本,以便之后分詞和建立索引使用。4.3 用lucene為抓取的網站建立索引索引是一種數據結構,它可以使用戶對數據更快的進行存儲和查找。并且它只占用了很少的存儲空間。在lucene中先定義document,然后通過定義field添加一些提供查找的信息。document的add方法將定義的field加入到document中去,最后使用indexwriter的adddocument方法將document寫入索引。4.4 搜索關鍵字在搜索關鍵字的時候將會涉及到如下的幾個關鍵類:4.4.1 indexsearcherindex

48、searcher類用于搜索indexwriter類所創建的索引。這個類是連接索引的重要手段,并提供了一些search方法。可以將indexsearcher類看作一個以只讀方式打開索引的類。在indexsearcher接口中定義了如下的主要方法:void search(weight weight,filter filter,hitcollector results) throws ioexception;/search的重載方法void close() throws ioexception;/關閉searcher,同時也關閉了indexreaderint docfreq(term term) t

49、hrows ioexception;/計算索引中包含有指定的一個term信息的文檔量。int docfreqs(term terms) throws ioexcption;/計算索引中有多少文檔包含有指定的一組term信息int maxdoc() throws ioexception;/返回索引中最大可能具有的document的數量(再加1)topdocs search(weight weight,filter filter,int n) throws ioexception;/search的重載方法document doc(int i) throws ioexception;/取出索引中id

50、號為i的文檔query rewrite (query query) throws ioexception;/對查詢進行rewrite,使之成為原子查詢4.4.2 queryquery是一個抽象父類,它包含了如下一些經常使用的方法:termquery詞條查詢:是lucene中最為簡單,也是最為原始的一種搜索方式。booleanquery布爾查詢:由多個子句和子句間的布爾邏輯所組成的查詢。rangequery范圍搜索:lucene提供了一個稱為rangequery的api來幫助用戶查找一定范圍內的文檔。這種范圍可以是時間、日期、數字大小等。prefixquery前綴搜索:prefixquery是一

51、種前綴查找,在檢索的時候經常要進行某種前綴查找。phrasequery短語搜索:通過phrasequery可以很方便的幫助進行上述的短語查找功能。multiphrasequery多短語搜索:可以對多個短語同時進行檢索。fuzzyquery模糊搜索:可以幫助用戶進行單字的模糊查找。wildcardquery通配符搜索:可以使用通配符來進行檢索。wildcardquery使用非常簡單,首先設定一個帶通配符的字符串,再包裝成term對象,然后將其做為wildcardquery的構造函數的參數傳入。spanquery跨度搜索:在某種跨度范圍內查找關鍵字并匹配文檔。regexquery:由第三方提供的q

52、uery對象,是基于正則表達式的檢索方式。4.4.3 hitshits類是一個存放有序搜索結果指針的簡單容器,并且可以幫助取得lucene搜索的結果。在hits對象內部保持了一個緩存。它用于存放一定數量的文檔。每次用戶要取出文檔時,hits都會先訪問這個緩存。如果緩存中已經具備了這個文檔,那么,它就將文檔直接返回給用戶。如果用戶要訪問的文檔不再這個緩存中,hits就會再次執行查詢。hits有如下的幾個公有接口:/取得當前結果集的數量public final int length()/取得當前結果集中第n個documentpublic final document doc(int n)throws ioexception/取得當前結果集中第n個document的得分public final float score(int n)throws ioexception/取得當前結果集中第n個document的索引的內部id值public final int id(int n) throws ioexception/取得對hits集合的遍歷對象public iterator iterator()4.4.4 termterm是用于搜索的一個基本單元。如同域對象一樣,它包含了一對字符串元素:與域中的域名(name)和域值(value)相對

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論