版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、畢 業(yè) 設 計基于Lucene的全文搜索引擎設計學生承諾書本人鄭重承諾:所呈交的論文是本人在導師的指導下獨立進行研究所取得的研究成果。除了文中特別加以標注引用的內容外,本論文不包含任何其他個人或集體已經發(fā)表或撰寫的成果作品。
2、160; 作者簽名:年 月 日摘 要Web搜索引擎技術是當今網絡信息處理領域的一個熱點和難點。Web可以看作是一個龐大的分布式網絡數(shù)據(jù)庫,對于這樣一個信息量飛速增長的數(shù)據(jù)庫,如果人工地去檢索和分類將是一項非常巨大的工程,而搜索引擎技術則能夠幫助我們更容易地從Web中獲取所需信息。本文闡述了一個全文檢索系統(tǒng)的原理及其設計和實現(xiàn)過程。該系統(tǒng)基于B/S模式的JavaWeb平臺架構實現(xiàn),使用MySQL作
3、為系統(tǒng)的數(shù)據(jù)庫,并采用Heritrix,Lucene等優(yōu)秀的開源框架實現(xiàn)對某網頁手機產品信息的檢索。系統(tǒng)還利用Struts,Hibernate,Spring等流行的Java開發(fā)框架以及面向接口編程很好地實現(xiàn)了對系統(tǒng)的解耦合。在前端使用具備較強UI表現(xiàn)功能的Extjs作為輔助實現(xiàn)了Ajax應用。本文首先介紹了課題研究背景,然后對系統(tǒng)涉及到的相關技術做了較為詳細的說明,最后根據(jù)軟件工程的開發(fā)方法逐步實現(xiàn)系統(tǒng)的功能。關鍵詞:Web 搜索 手機 Lucene 框架 Ajax目 錄1 前言11.1 研究目的和意義11.2 課題研究的背景21.3 國內外研究概況22 相關理論知識32.1 Web爬蟲Her
4、itrix介紹32.2 Ajax(Asynchronous JavaScript and XML)技術32.3 Struts介紹42.4 Hibernate介紹62.5 Spring介紹72.6 分詞技術83 概要設計93.1 系統(tǒng)模塊圖93.2 網頁爬蟲模塊93.2.1 Heritrix的體系結構圖103.2.2 架構分析103.3 網頁分析與提取模塊113.4 索引建立模塊123.5 Web搜索模塊144 詳細設計154.1 Web爬蟲的配置和擴展154.2 網頁的分析與數(shù)據(jù)提取164.3 索引的建立與數(shù)據(jù)庫設計204.3.1 實體對象設計214.3.2 將數(shù)據(jù)文件轉化為對象224.3.3
5、 將對象持久化到數(shù)據(jù)庫234.3.4 建立索引244.4 Web系統(tǒng)模塊和搜索模塊設計264.4.1 搜索模塊設計274.4.2 Web系統(tǒng)模塊設計285 用戶手冊以及測試結果295.1 系統(tǒng)運行準備295.2 使用Heritrix抓取網頁295.3 網頁數(shù)據(jù)提取345.4 建立索引和初始化數(shù)據(jù)庫355.5 搜索366 總結396.1 系統(tǒng)存在的問題396.2 開發(fā)過程出現(xiàn)的問題406.3 心得體會40致 謝42參 考 文 獻43Abstract44仲愷農業(yè)技術學院畢業(yè)論文(設計)成績評定表451 前言1.1 研究目的和意義在構建一個信息類 Web 站點的時候,站點的全文搜索功能是必備的功能之
6、一。一般站點的信息內容都存儲在各種數(shù)據(jù)庫系統(tǒng)中,并使用數(shù)據(jù)庫提供的檢索和查詢功能構建網站的搜索功能。但隨著信息的累積,使用數(shù)據(jù)庫中的類like%keyword%查詢構成的數(shù)據(jù)檢索性能將急劇下降,因此,只使用數(shù)據(jù)庫查詢進行全文檢索并不是一個好的解決方案。Lucene是一個基于Java技術的全文索引引擎工具包,它可以方便地嵌入到各種應用中實現(xiàn)針對應用的全文索引/檢索功能。例如 Lucene可以快速實現(xiàn)一個簡單、功能強大的數(shù)據(jù)全文檢索系統(tǒng)。Lucene富有彈性的軟件架構可以使我們方便地對其功能進行擴充,以快速實現(xiàn)一個通用網站的全文搜索引擎。該搜索引擎的實現(xiàn)既可以避免使用數(shù)據(jù)庫的Likekeyword
7、查詢帶來的低效性和影響數(shù)據(jù)庫的其他正常使用等問題,也可以避免使用其他大型搜索引擎的站內搜索功能所遇到的更新慢、數(shù)據(jù)不準確、無法控制輸出格式等問題。由于數(shù)據(jù)庫索引不是為全文索引設計的,因此,使用like "%keyword%"時,數(shù)據(jù)庫索引是不起作用的,在使用like查詢時,搜索過程又變成類似于一頁頁翻書的遍歷過程了,所以對于含有模糊查詢的數(shù)據(jù)庫服務來說,LIKE對性能的危害是極大的。如果是需要對多個關鍵詞進行模糊匹配:like"%keyword1%" and like "%keyword2%" .其效率也就可想而知了。所以建立一個高效
8、檢索系統(tǒng)的關鍵是建立一個類似于科技索引一樣的反向索引機制,將數(shù)據(jù)源(比如多篇文章)排序順序存儲的同時,有另外一個排好序的關鍵詞列表,用于存儲關鍵詞=>文章映射關系,利用這樣的映射關系索引:關鍵詞=>出現(xiàn)關鍵詞的文章編號,出現(xiàn)次數(shù)(甚至包括位置:起始偏移量,結束偏移量),出現(xiàn)頻率,檢索過程就是把模糊查詢變成多個可以利用索引的精確查詢的邏輯組合的過程。從而大大提高了多關鍵詞查詢的效率,所以,全文檢索問題歸結到最后是一個排序問題。由此可以看出模糊查詢相對數(shù)據(jù)庫的精確查詢是一個非常不確定的問題,這也是大部分數(shù)據(jù)庫對全文檢索支持有限的原因。Lucene最核心的特征是通過特殊的索引結構實現(xiàn)了傳
9、統(tǒng)數(shù)據(jù)庫不擅長的全文索引機制,并提供了擴展接口,以方便針對不同應用的定制。1.2 課題研究的背景Lucene是Apache軟件基金的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便的在目標系統(tǒng)中實現(xiàn)全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。Lucene的原作者是Doug Cutting,他是一位資深全文索引/檢索專家,曾經是V-Twin搜索引擎的主要開發(fā)者,后在Excite擔任高級系統(tǒng)架構設計師,目前從
10、事Internet底層架構的研究。作為一個開放源代碼項目,Lucene從問世之后,引發(fā)了開放源代碼社群的巨大反響,程序員們不僅使用它構建具體的全文檢索應用,而且將之集成到各種系統(tǒng)軟件中去,以及構建Web應用,甚至某些商業(yè)軟件也采用了Lucene作為其內部全文檢索子系統(tǒng)的核心。Apache軟件基金會的網站使用了Lucene作為全文檢索的引擎,IBM的開源軟件Eclipse的2.1版本中也采用了Lucene作為幫助子系統(tǒng)的全文索引引擎,相應的IBM的商業(yè)軟件WebSphere中也采用了Lucene。Lucene以其開放源代碼的特性、優(yōu)異的索引結構、良好的系統(tǒng)架構獲得了越來越多的應用。Lucene作
11、為一個全文檢索引擎,其具有如下突出的優(yōu)點:(1)索引文件格式獨立于應用平臺。Lucene定義了一套以8位字節(jié)為基礎的索引文件格式,使得兼容系統(tǒng)或者不同平臺的應用能夠共享建立的索引文件。(2)在傳統(tǒng)全文檢索引擎的倒排索引的基礎上,實現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達到優(yōu)化的目的。(3)優(yōu)秀的面向對象的系統(tǒng)架構,使得對于Lucene擴展的學習難度降低,方便擴充新功能。(4)設計了獨立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創(chuàng)立,用戶擴展新的語言和文件格式,只需要實現(xiàn)文本分析的接口。(5)已經默認實現(xiàn)了一套強大的查
12、詢引擎,用戶無需自己編寫代碼即使系統(tǒng)可獲得強大的查詢能力,Lucene的查詢實現(xiàn)中默認實現(xiàn)了布爾操作、模糊查詢(Fuzzy Searc)、分組查詢等等。1.3 國內外研究概況在國內Lucene的應用相對不成熟,很多研究只是處在理論研究階段,對于企業(yè)級的應用就更少。在國外,Lucene的應用相對廣泛,也有比較大型而且成熟的企業(yè)級應用。例如有大名鼎鼎的Java開放開發(fā)平臺Eclipse。在Eclipse平臺中的文檔幫助系統(tǒng)是基于Lucene的一個大型的檢索系統(tǒng)。它可以快速準確的定位Java API 中的某個Class或者方法,是一個成熟的Lucene應用。2 相關理論知識2.1 Web爬蟲Heri
13、trix介紹Heritrix是一個由Java開發(fā)的,開源的的Web網絡爬蟲,用戶可以使用它從網絡上抓取想要的資源。Heritrix最出色之處在于它的可擴展性,開發(fā)者可以擴展它的各個組件,來實現(xiàn)自己的抓取范圍。2.2 Ajax(Asynchronous JavaScript and XML)技術Ajax的全稱是異步的Javascript和XML。Ajax并不是一種新技術,它是靈活綜合應用Javascript和XML之后產生的一種新的技巧。使用Ajax技術開發(fā)的Web應用主要是能夠改善用戶的體驗。在一般的 Web 應用程序中,用戶填寫表單字段并單擊 Submit 按鈕。然后整個表單發(fā)送到服務器,服
14、務器將它轉發(fā)給處理表單的腳本,腳本執(zhí)行完成后再發(fā)送回全新的頁面。該頁面可能是帶有已經填充某些數(shù)據(jù)的新表單的 HTML,也可能是確認頁面,或者是具有根據(jù)原來表單中輸入數(shù)據(jù)選擇的某些選項的頁面。當然,在服務器上的腳本或程序處理和返回新表單時用戶必須等待。屏幕變成一片空白,等到服務器返回數(shù)據(jù)后再重新繪制。這就是交互性差的原因,用戶得不到立即反饋,因此感覺不同于桌面應用程序。Ajax 基本上就是把 JavaScript 技術和 XML Request 對象放在 Web 表單和服務器之間。當用戶填寫表單時,數(shù)據(jù)發(fā)送給一些 JavaScript 代碼而不是 直接發(fā)送給服務器。相反,JavaScript 代
15、碼捕獲表單數(shù)據(jù)并向服務器發(fā)送請求。同時用戶屏幕上的表單也不會閃爍、消失或延遲。換句話說,JavaScript 代碼在幕后發(fā)送請求,用戶甚至不知道請求的發(fā)出。更好的是,請求是異步發(fā)送的,就是說 JavaScript 代碼(和用戶)不用等待服務器的響應。因此用戶可以繼續(xù)輸入數(shù)據(jù)、滾動屏幕和使用應用程序。然后,服務器將數(shù)據(jù)返回 JavaScript 代碼(仍然在 Web 表單中),后者決定如何處理這些數(shù)據(jù)。它可以迅速更新表單數(shù)據(jù),讓人感覺應用程序是立即完成的,表單沒有提交或刷新而用戶得到了新數(shù)據(jù)。JavaScript 代碼甚至可以對收到的數(shù)據(jù)執(zhí)行某種計算,再發(fā)送另一個請求,完全不需要用戶干預!這就是
16、 XML Request 的強大之處。它可以根據(jù)需要自行與服務器進行交互,用戶甚至可以完全不知道幕后發(fā)生的一切。結果就是類似于桌面應用程序的動態(tài)、快速響應、高交互性的體驗,但是背后又擁有互聯(lián)網的全部強大力量。圖1 傳統(tǒng)web應用模型與Ajax模型對比2.3 Struts介紹Struts是Apache組織的一個項目,像其它的Apache組織的項目一樣,它也是開放源碼項目。Struts是一個比較好的MVC(Model-View-Controller)框架,提供了對開發(fā)MVC系統(tǒng)的底層支持,它采用的主要技術是Servlet、JSP和custom tag library。圖2 Struts UML圖作
17、為一個MVC的框架,Struts對Model、View和Controller都提供了對應的實現(xiàn)組件,對應上面的UML圖,下面分別進行介紹,并且看看它們是如何結合在一起的。1.Controller:控制器的作用是從客戶端接受請求,并且選擇執(zhí)行相應的業(yè)務邏輯,然后把響應結果送回到客戶端。在Struts中Controller功能由圖中ActionServlet和ActionMapping對象構成:核心是一個Servlet類型的對象ActionServlet,它用來接受客戶端的請求。ActionServlet包括一組基于配置的ActionMapping對象,每個ActionMapping對象實現(xiàn)了一個
18、請求到一個具體的Model部分中Action處理器對象之間的映射。 2.Model: MVC系統(tǒng)中的Model部分從概念上可以分為兩類-系統(tǒng)的內部狀態(tài),和改變系統(tǒng)狀態(tài)的動作。Struts為Model部分提供了Action和ActionForm對象:所有的Action處理器對象都是開發(fā)者從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理邏輯,調用業(yè)務邏輯模塊,并且把響應提交到合適的View組件以產生響應。Struts提供的ActionForm組件對象,它可以通過定義屬性描述客戶端表單數(shù)據(jù)。開發(fā)者可以從它派生子類對象,利用它和Struts提供的自定義標記庫結合可以實現(xiàn)
19、對客戶端的表單數(shù)據(jù)的良好封裝和支持,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行數(shù)據(jù)交互。通過ActionForm組件對象實現(xiàn)了對View和Model之間交互的支持。Struts通常建議使用一組JavaBean表示系統(tǒng)的內部狀態(tài),根據(jù)系統(tǒng)的復雜度也可以使用像Entity EJB 和 Session EJB等組件來實現(xiàn)系統(tǒng)狀態(tài)。Struts建議在實現(xiàn)時把"做什么"(Action)和"如何做"(業(yè)務邏輯)分離。這樣可以實現(xiàn)業(yè)務邏輯的重用。 3.View:Struts應用中的View部分是通過JSP技術實現(xiàn)的
20、。Struts提供了自定義的標記庫可以使用,通過這些自定義標記可以非常好地和系統(tǒng)的Model部分交互,通過使用這些自定義標記創(chuàng)建的JSP表單,可以實現(xiàn)和Model部分中的ActionForm的映射,完成對用戶數(shù)據(jù)的封裝,同時這些自定義標記還提供了像模板定制等多種顯示功能。 Struts框架的處理流程清楚的體現(xiàn)了MVC系統(tǒng)的特點。Struts Controller ActionServlet處理客戶請求,利用配置的ActionMapping對象把請求映射到Action處理器對象進行處理。Action處理對象訪問ActionForm中的數(shù)據(jù),處理和響應客戶請求,它還調用后臺的Bean組件,這些組件
21、封裝了具體的業(yè)務邏輯。Action處理器對象根據(jù)處理結果通知Controller,Controller進行下一步的處理。2.4 Hibernate介紹Hibernate 是一個JDO工具。它的工作原理是通過文件把值對象和數(shù)據(jù)庫表之間建立起一個映射關系,這樣,我們只需要通過操作這些值對象和Hibernate提供的一些基本類,就可以達到使用數(shù)據(jù)庫的目的。例如,使用Hibernate的查詢,可以直接返回包含某個值對象的列表(List),而不必向傳統(tǒng)的JDBC訪問方式一樣把結果集的數(shù)據(jù)逐個裝載到一個值對象中,為我們的編碼工作節(jié)省了大量的勞動。Hibernate提供的HQL是一種類SQL語言,它和 EJ
22、BQL一樣都是提供對象化的數(shù)據(jù)庫查詢方式,但HQL在功能和使用方式上都非常接近于標準SQL。圖3 Hibernate的工作原理2.5 Spring介紹Spring 是一個開源框架,是為了解決企業(yè)應用程序開發(fā)復雜性而創(chuàng)建的??蚣艿闹饕獌?yōu)勢之一就是其分層架構,分層架構允許您選擇使用某個組件,同時為 J2EE 應用程序開發(fā)提供集成的框架。圖4 Spring框架結構圖組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯(lián)合實現(xiàn)。每個模塊的功能如下: · 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠
23、模式的實現(xiàn)。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規(guī)范與實際的應用程序代碼分開。 · Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業(yè)服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。 · Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供
24、了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。 · Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數(shù)據(jù)庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數(shù)量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。 · Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBat
25、is SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。 · Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數(shù)綁定到域對象的工作。 · Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現(xiàn)。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText
26、 和 POI。 Spring 框架的功能可以用在任何 J2EE 服務器中,大多數(shù)功能也適用于不受管理的環(huán)境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業(yè)務和數(shù)據(jù)訪問對象。毫無疑問,這樣的對象可以在不同 J2EE 環(huán)境 (Web 或 EJB)、獨立應用程序、測試環(huán)境之間重用。2.6 分詞技術分詞就是將一段文本信息拆分成多個詞。在眾多語言之中,中文分詞是最困難的。眾所周知,英文是以詞為單位的,詞和詞之間是靠空格隔開,而中文是以字為單位,句子中所有的字連起來才能描述一個意思。例如,英文句子I am a student,用中文則為:“我是一個學生”。計算機可以很簡單通過空格知
27、道student是一個單詞,但是不能很容易明白“學”、“生”兩個字合起來才表示一個詞。把中文的漢字序列切分成有意義的詞,就是中文分詞,有些人也稱為切詞。我是一個學生,分詞的結果是:我 是 一個 學生。因此做好中文分詞對于一個中文檢索系統(tǒng)來說是至關重要的。圖5顯示了分詞在一個檢索系統(tǒng)中的地位。圖5 檢索系統(tǒng)架構3 概要設計3.1 系統(tǒng)模塊圖本系統(tǒng)主要由四個模塊組成,分別是Web爬蟲模塊,網頁分析與數(shù)據(jù)提取模塊,索引建立模塊,Web搜索模塊。如各個模塊之間的依賴關系如下圖:圖6 檢索系統(tǒng)模塊及其依賴關系3.2 網頁爬蟲模塊Heritrix采用了模塊化的設計,它由一些核心類(core classes
28、)和可插件模塊(pluggable modules)構成。核心類可以配置,但不能被覆蓋,插件模塊可以由第三方模塊取代。3.2.1 Heritrix的體系結構圖圖7 heritrix的體系結構圖3.2.2 架構分析CrawlController(下載控制器):整個下載過程的總的控制者,整個抓取工作的起點,決定整個抓取任務的開始和結束。從Frontier獲取URI,傳遞給線程池(ToePool)中的ToeThread處理。Frointier(邊界控制器):主要確定下一個將被處理的URI,負責訪問的均衡處理,避免對某一web服務器造成太大的壓力。它保存著crawl的狀態(tài):(1)發(fā)現(xiàn)的URI(URIs
29、 have been discovered)(2)正在被處理的URI(URIs are being processed (fetched))(3)已經處理的URI(URIs have been processed)TeoThread(處理線程):Heritrix是多線程的,每一個URI被一個ToeThread處理。Processor(處理器):圖8 處理器的整個結構圖許多Processor組成一個處理鏈(processor chains)中,每一個處理鏈對URI進行一系列的處理。(1)Pre-fetch processing chain(預處理鏈):主要根據(jù)robot協(xié)議,DNS以及下載范圍控
30、制信息判斷當前URI是否應當處理。(2)Fetch processing chain(抓取處理鏈):從遠程服務器獲取數(shù)據(jù)(3) Extractor processing chain(抽取處理鏈):從網頁中抽取新的URI(4)Write/index processing chain(寫處理鏈):負責把數(shù)據(jù)寫入本地磁盤(5)Post-processing chain(后置處理鏈):由CrawlStateUpdater,LinksScoper,F(xiàn)rontierScheduler構成。3.3 網頁分析與提取模塊在提取網頁數(shù)據(jù)的時候,是使用Java庫HtmlParser來提取網頁信息的。HtmlPars
31、er采用了經典的Composite模式,通過RemarkNode、TextNode、TagNode、AbstractNode和Tag來描述HTML頁面各元素。圖9 htmlparser對html頁面處理的數(shù)據(jù)結構3.4 索引建立模塊使用Lucene建立索引,主要使用到Document,F(xiàn)ield,IndexWriter等幾個類和接口。Document在Lucene中代表一種邏輯文件。Lucene本身無法對物理文件建立索引,而只能識別并處理Document類型的文件。在某些時候可以將每個Document與一個物理文件進行對應,用一個Document來代替一個文件,然而更多時候,Document和
32、物理文件沒有關系,它是作為一種數(shù)據(jù)源的集合,向Lucene提供原始的要索引的內容。Lucene從Document取出相關的數(shù)據(jù)源,并根據(jù)屬性配置進行相應的處理。Document文件名文件名文件名文件名 物理文件物理文件物理文件物理文件圖10 Document與多個文件的數(shù)據(jù)源在Lucene中,數(shù)據(jù)源是由一個被稱為Field的類來表示的。通常情況下可以直接通過Field的構造函數(shù)來創(chuàng)建一個Field類型的對象。這個Field類型主要是用來標識當前的數(shù)據(jù)源的各種屬性,存儲來自數(shù)據(jù)源的數(shù)據(jù)內容。Lucene在對每個Field進行處理時,會充分考慮到數(shù)據(jù)源的各種屬性,以此做出不同的處理。LuceneD
33、ocumentFieldFieldField圖11 Document與Field的關系在用戶構建完Document并為其加入合適的Field后,就需要Lucene來為其建立索引了。在Lucene中,IndexWriter主要作用是對索引進行創(chuàng)建,加入Document,合并各種索引斷,以及控制與索引相關的各方面,它是Lucene的索引的主要操作者。圖12 IndexWriter的初始化過程3.5 Web搜索模塊Lucene里面與搜索相關的API多數(shù)都被包含在org.apache.Lucene.search包中。其中,最重要的是IndexSearcher類。IndexSearcher在執(zhí)行其任何操
34、作前,必須獲得一個索引目錄。搜索代碼如下:/初始化一個IndexSearcherIndexSearcher searcher = new IndexSearcher("c:/");/構建一個Term對象Term term = new Term("bookname","女");/構建一個Query對象Query query = new TermQuery(term);/檢索Hits hits = searcher.search(query);/顯示查詢結果for(int i = 0;i<hits.length();i+)Syste
35、m.out.println(hits.doc(i);在上面的代碼中還涉及到兩個類:Query類和Hits類。Query便是一個查找請求。此處使用TermQuery類對其進行初始化,它表示查找“bookname”域中,包含“女”這個關鍵字的文檔。Hits表示查找結果。通過它可以訪問檢索到的Document。當用戶進去搜索主頁,并進行搜索的時候,時序圖如下:圖13搜索時序圖ProductsDao:實體Products的數(shù)據(jù)庫操作接口,負責將數(shù)據(jù)信息寫入,修改,刪除,查找。SearchDao:索引的操作接口,負責根據(jù)關鍵字從索引中搜索出對象Product的Id。SearchService:整個Web
36、服務的接口,負責調用ProductDao和SearchDao。4 詳細設計4.1 Web爬蟲的配置和擴展作為一個優(yōu)秀的網頁抓取軟件,Heritrix的優(yōu)點在于可以自定義Heritrix的抓取任務和擴展它的功能使之能夠適合我們要展開的抓取任務。所以我們要通過擴展FrontierScheduler來抓取特定的內容。FrontierScheduler是一個PostProcessor,它的作用是將在Extractor中所分析得出的鏈接加入到Frontier中,以待繼續(xù)處理。擴展FrontierScheduler需要繼承org.archive.crawler.postprocessor.Frontier
37、Scheduler這個類,并且重寫schedule這個方法。public class FrontierSchedulerForYounetMoblie extends FrontierScheduler private static final long serialVersionUID = -8835919182532315927L;SuppressWarnings("unused")private static Logger LOGGER = Logger.getLogger(FrontierSchedulerForYounetMoblie.class.getName(
38、);/ 構造函數(shù)public FrontierSchedulerForYounetMoblie(String name) super(name);protected void schedule(CandidateURI caUri) / 取得URL的字符串String url = caUri.toString();try / URL選擇策略if (url.indexOf("mobile.younet /files/") != -1| url.indexOf("mobile.younet /img/") != -1| url.indexOf("r
39、obots.txt") != -1| url.indexOf("dns:") != -1) getController().getFrontier().schedule(caUri); else return; catch (Exception e) e.printStackTrace(); finally 以上代碼就是我們擴展的FrontierScheduler使得Heritrix只能抓取站點 :/mobile.younet /filest/和 :/mobile.younet /img/兩個目錄下面的內容。對于以外的內容是不會被抓取下來的。當擴展完畢的時候,還要
40、在Heritrix的模塊配置文件processor.options添加聲明自定義配置my.postprocessor.FrontierSchedulerForYounetMoblie|FrontierSchedulerForYounetMoblie4.2 網頁的分析與數(shù)據(jù)提取對于本檢索系統(tǒng),主要是將手機產品信息做為數(shù)據(jù)信息提供給使用者搜索,并返回相關產品信息。所以當我們要對抓取下來的網頁進行分析提取數(shù)據(jù)的時候主要是手機的相關信息。比如:手機的圖片,手機的參數(shù)還有就是產品的連接。根據(jù)頁面信息設計了兩個類用于從頁面中提取我們需要的信息。圖14 網頁信息提取類圖如上圖所示,Extractor是一個抽
41、象類,里面有一個抽象方法extract。對于不同的網頁結構我們需要提取不同的數(shù)據(jù),就需要不同的實現(xiàn)方式。所以類ExtractYounetMobile繼承Extractor并實現(xiàn)抽象方法,實現(xiàn)對網頁信息的提取。圖15 標題節(jié)點內容提取流程圖public void extract() BufferedWriter bw = null;/定義三個過濾器NodeFilter title_filter = new AndFilter(new TagNameFilter("div"),new HasAttributeFilter("class", "mo_
42、tit");NodeFilter attribute_filter = new AndFilter(new TagNameFilter("p"),new HasChildFilter(new AndFilter(new TagNameFilter("span"),new HasAttributeFilter("class", "gn_sp1 blue1");NodeFilter img_filter = new AndFilter(new TagNameFilter("span"),n
43、ew HasChildFilter(new TagNameFilter("img");/ 提取標題信息try / Parser根據(jù)過濾器返回所有滿足過濾條件的節(jié)點/ 迭代逐漸查找NodeList nodeList = this.getParser().parse(title_filter);NodeIterator it = nodeList.elements();StringBuffer title = new StringBuffer();while (it.hasMoreNodes() Node node = (Node) it.nextNode();String n
44、ames = node.toPlainTextString().split(" ");for (int i = 0; i < names.length; i+)title.append(namesi).append("-");title.append(new Date().getTime();/ 創(chuàng)建要生成的文件bw = new BufferedWriter(new FileWriter(new File(this.getOutputPath()+ title + ".txt");/ 獲取當前提取頁的完整URL地址int sta
45、rtPos = this.getInputFilePath().indexOf("mirror") + 6;String url_seg = this.getInputFilePath().substring(startPos);url_seg = url_seg.replaceAll("", "/");String url = " :/" + url_seg;/ 寫入當前提取頁的完整URL地址bw.write(url + NEWLINE);/產品地址bw.write(names0 + NEWLINE);/品牌bw
46、.write(names1 + NEWLINE);/型號/ 重置Parserthis.getParser().reset();Parser attNameParser = null;Parser attValueParser = null;/定義兩個過濾器,屬性過濾器和值過濾器NodeFilter attributeName_filter = new AndFilter(new TagNameFilter("span"), new HasAttributeFilter("class", "gn_sp1 blue1");NodeFilt
47、er attributeValue_filter = new AndFilter(new TagNameFilter("span"), new HasAttributeFilter("class", "gn_sp2");String attName = ""String attValue = ""/ 迭代逐漸查找nodeList = this.getParser().parse(attribute_filter);it = nodeList.elements();while (it.hasMor
48、eNodes() Node node = (Node) it.nextNode();attNameParser = new Parser();attNameParser.setEncoding("GB2312");attNameParser.setInputHTML(node.toHtml();NodeList attNameNodeList = attNameParser.parse(attributeName_filter);/獲得屬性節(jié)點attName = attNameNodeList.elements().nextNode().toPlainTextString(
49、);attValueParser = new Parser();attValueParser.setEncoding("GB2312");attValueParser.setInputHTML(node.toHtml();NodeList attValueNodeList = attValueParser.parse(attributeValue_filter);/獲得屬性值節(jié)點attValue = attValueNodeList.elements().nextNode().toPlainTextString();/將屬性和對應的值寫入文件bw.write(attName
50、.trim() + attValue.trim();bw.newLine();/ 重置Parserthis.getParser().reset();String imgUrl = ""String fileType = ""/ 迭代逐漸查找 產品圖片nodeList = this.getParser().parse(img_filter);it = nodeList.elements();while (it.hasMoreNodes() Node node = (Node) it.nextNode();ImageTag imgNode = (ImageT
51、ag) node.getChildren().elements().nextNode();imgUrl = imgNode.getAttribute("src");/圖片類型fileType = imgUrl.trim().substring(imgUrl.lastIndexOf(".") + 1);/ 生成新的圖片的文件名String new_iamge_file = StringUtils.encodePassword(imgUrl,HASH_ALGORITHM)+ "." + fileType;/ 利用miorr目錄下的圖片生成
52、的新的圖片this.copyImage(imgUrl, new_iamge_file);bw.write(SEPARATOR + NEWLINE);/將圖片信息寫入文件bw.write(new_iamge_file + NEWLINE);4.3 索引的建立與數(shù)據(jù)庫設計 在建立索引之前,我們需要將從網頁分析提取出來的數(shù)據(jù)文件轉化為實體,并將實體存入數(shù)據(jù)庫,然后再建立索引。圖16 建立索引流程圖4.3.1 實體對象設計圖17 實體類圖表1 實體類說明表名稱Product字段字段說明字段類型備注Id產品id主鍵char(32)主鍵Category產品類別varchar(20)Name產品名稱varc
53、har(20)Type產品型號varchar(20)Content產品參數(shù)信息longtextSummary產品信息摘要varchar(255)OriginalUrl產品鏈接varchar(255)ImageUri產品圖片varchar(255)Updatetime建索時間varchar(255)4.3.2 將數(shù)據(jù)文件轉化為對象圖18 對象的提取過程4.3.3 將對象持久化到數(shù)據(jù)庫數(shù)據(jù)的持久化是采用Hibernate技術開發(fā)的,并將Hibernate的所有配置都交給以Spring為基礎的BeanFactory管理。我們定義了ProductDao來作為數(shù)據(jù)的持久化操作接口。圖19 數(shù)據(jù)的持久化操
54、作接口以及實現(xiàn)類類圖接口代碼如下:public interface ProductDao /* * 添加產品信息 * param product * throws Exception */public void create(Product product) throws Exception;/* * 按id獲得產品信息 * param id * return * throws Exception */public Product read(String id) throws Exception;/* * 刪除產品信息 * param product * throws Exception */
55、public void delete(Product product) throws Exception;/* * 更新產品信息 * param product * throws Exception */public void update(Product product) throws Exception;/* * 獲得所有產品信息 * return * throws Exception */public Collection<Product> queryAll() throws Exception;4.3.4 建立索引圖20 建立索引的兩個類圖 ProductDocument類
56、主要是通過一個Product實例,構建并返回一個Lucene的Document實例。ProductIndexer接收ProductDocument返回的Document實例,并將其寫入索引。ProductDocument.java代碼如下:/* * 索引文檔對象 * * author ghanguog * */public class ProductDocument / 當前產品在數(shù)據(jù)庫中的idprivate static final String PRODUCT_ID = "productid"/ 產品被簡歷索引的時間private static final String INDEX_TIME = "indextime"/ 產品原始頁面的URLprivate static final String PRODUCT_URL = "producturl"/ 產品的分類private static final String CATEGORY = &
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年高效能玻璃鋼化糞池采購協(xié)議范本版B版
- 2024自用房屋租賃合同
- 2025年違約借款合同糾紛解決途徑3篇
- 二零二五年度新能源汽車OEM制造與零部件供應合同3篇
- 2025廠房土地買賣合同中對環(huán)境友好型建筑標準的約定3篇
- 2025年度森林資源管理與測繪合同范本3篇
- 2024網絡安全與信息保密合同
- 二零二四三方詢價采購合同-國際物流運輸服務采購2篇
- 2024石料礦山資源整合與開采合同3篇
- 二零二五版全國CHS技術交流與合作合同3篇
- 勞務投標技術標
- 研發(fā)管理咨詢項目建議書
- 濕瘡的中醫(yī)護理常規(guī)課件
- 轉錢委托書授權書范本
- 一種配網高空作業(yè)智能安全帶及預警系統(tǒng)的制作方法
- 某墓園物業(yè)管理日常管護投標方案
- 蘇教版六年級數(shù)學上冊集體備課記載表
- NUDD新獨難異 失效模式預防檢查表
- 內蒙古匯能煤電集團有限公司長灘露天煤礦礦山地質環(huán)境保護與土地復墾方案
- 22S702 室外排水設施設計與施工-鋼筋混凝土化糞池
- 2013日產天籟全電路圖維修手冊45車身控制系統(tǒng)
評論
0/150
提交評論