基于jsp的搜索引擎設計和實現(xiàn)電子信息工程專業(yè)
《基于jsp的搜索引擎設計和實現(xiàn)電子信息工程專業(yè)》由會員分享,可在線閱讀,更多相關《基于jsp的搜索引擎設計和實現(xiàn)電子信息工程專業(yè)(24頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 題目:基于jsp的搜索引擎 摘 要 隨著互聯(lián)網(wǎng)的不斷發(fā)展和日益普及,網(wǎng)上的信息量在迅速地增長,在2004年4月,全球Web頁面的數(shù)目已經(jīng)超過40億,中國的網(wǎng)頁數(shù)估計也超過了3億。 目前人們從網(wǎng)上獲得信息的主要工具是瀏覽器,搜索引擎在網(wǎng)絡中占有舉足輕重的地位,本文將在此深入的對搜索引擎做一個研究與闡述。并且詳細介紹了基于因特網(wǎng)的搜索引擎的系統(tǒng)結構,然后從網(wǎng)絡機器人、索引引擎、Web服務器三個方面進行詳細的說明。為了更加深刻的理解這種技術,本人還親自實現(xiàn)了一個簡單的搜索引擎Damon。 關鍵詞: 1、jsp搜
2、索引擎 2、spider 3、Lucene 目 錄 一、前言 6 二、搜索引擎的歷史淵源 7 三、搜索引擎基本結構 9 (一)網(wǎng)絡機器人 9 (二)索引與搜索 9 (三)Web服務器 10 (四)搜索引擎的主要指標及分析 10 四、網(wǎng)絡機器人? 11 (一)什么是網(wǎng)絡機器人 11 (二)網(wǎng)絡機器人的結構分析 11 (三)Spider程序結構 12 (四)如何提高程序性能 13 五、基于Tomcat的Web服務器jsp搜索引擎程序設計詳解 14 (一)開發(fā)工具、平臺及資源? 14 (二)Lucene開源組件簡介 14 (三)引入基于Tomcat的
3、Web服務器開發(fā)設計 15 (四)用戶接口設計 16 (五)機器人的設計分析 18 (六)關于程序說明 23 六、在Tomcat上部署項目 24 七、總結 25 致謝 26 參考文獻 27 一、前言 在網(wǎng)絡迅速發(fā)展的今天,面臨非常豐富的網(wǎng)絡資源,不論我們是學習、研究、還是工作需要在網(wǎng)絡上能查找到相關的資料信息,人們現(xiàn)在對網(wǎng)絡的依賴程度越來越高,但是如何有效的搜索信息卻是一件困難的事情。但是幸運的是類似于百度、Google這樣的搜索網(wǎng)站的出現(xiàn)能幫助我們解決這樣的問題,使我們可以在網(wǎng)絡中查找自己所需要的信息資源。從理論上講所有的用戶都可以從搜索出發(fā)到達自己想去
4、的網(wǎng)上任何一個地方。并且我們在網(wǎng)絡中可以找到幾乎我們需要的一切的可能的東西,本文從搜索引擎發(fā)展歷史開始,然后詳細介紹了程序中使用的組件Lucene,重點闡述了全文搜索引擎的基本原理、所采用的相關技術,進而引出專題搜索引擎,并且為提高專題性所采取的一些方法。分析了網(wǎng)頁文檔半結構化的數(shù)據(jù)特點以及使用自己編寫的spider程序從Internet上取回綜合的信息經(jīng)過Lucene處理加入索引文件中,最終用戶在客戶端輸入關鍵字后實現(xiàn)將與關鍵字相關信息返回給用戶。 二、搜索引擎的歷史淵源 早在 Web出現(xiàn)之前,互聯(lián)網(wǎng)上就已經(jīng)存在許多讓人
5、們共享的信息資源了。那些資源當時主要存在于各種允許匿名訪問的FTP 站點(anonymous ftp),內(nèi)容以學術技術報告、研究性軟件居多,它們以計算機文件的形式存在,文字材料的編碼通常是PostScript 或者純文本(那時還沒有HTML)。在互聯(lián)網(wǎng)發(fā)展初期,網(wǎng)站相對較少,信息查找比較容易。然而伴隨互聯(lián)網(wǎng)爆炸性的發(fā)展,普通網(wǎng)絡用戶想找到所需的資料簡直如同大海撈針,這時為滿足大眾信息檢索需求的專業(yè)搜索網(wǎng)站便應運而生了。為了便于人們在分散的FTP 資源中找到所需的東西,1990年由蒙特利爾大學學生Alan?Emtage發(fā)明的Archie。雖然當時World?Wide?Web還未出現(xiàn),但網(wǎng)絡中文件
6、傳輸還是相當頻繁的,而且由于大量的文件散布在各個分散的FTP主機中,查詢起來非常不便,因此Alan?Emtage想到了開發(fā)一個可以以文件名查找文件的系統(tǒng),于是便有了Archie。 Archie工作原理與現(xiàn)在的搜索引擎已經(jīng)很接近,它依靠腳本程序自動搜索網(wǎng)上的文件,然后對有關信息進行索引,供使用者以一定的表達式查詢。受其啟發(fā), 1993 年Matthew Gray 開發(fā)了World Wide Web Wanderer,它是 世界上第一個利用HTML 網(wǎng)頁之間的鏈接關系來監(jiān)測Web 發(fā)展規(guī)模的“機器人”(robot )程序?,F(xiàn)代搜索引擎的思路源于Wanderer,不少人在此基礎上對它的蜘蛛程
7、序做了改進。 當時,“機器人”一詞在編程者中十分流行。電腦“機器人”(Computer?Robot)是指某個能以人類無法達到的速度不間斷地執(zhí)行某項任務的軟件程序。由于專門用于檢索信息的“機器人”程序像蜘蛛一樣在網(wǎng)絡間爬來爬去,因此,搜索引擎的“機器人”程序就被稱為“蜘蛛”程序。 1994 年7 月,Michael Mauldin 將John Leavitt 的蜘蛛程序接入到其索引程序中,創(chuàng)建了大家現(xiàn)在熟知的Lycos,成為第一個現(xiàn)代意義的搜索引擎。在那之后,隨著Web上信息的爆炸性增長,搜索引擎的應用價值也越來越高,不斷有更新、更強的搜索引擎系統(tǒng)推出。同年,斯坦福(Stanford)大學的
8、兩名博士生,共同創(chuàng)辦了超級目錄索引Yahoo,并成功地使搜索引擎的概念深入人心。從此搜索引擎進入了高速發(fā)展時期。 隨著互聯(lián)網(wǎng)規(guī)模的急劇膨脹,一家搜索引擎光靠自己單打獨斗已無法適應目前的市場狀況,因此現(xiàn)在搜索引擎之間開始出現(xiàn)了分工協(xié)作,并有了專業(yè)的搜索引擎技術和搜索數(shù)據(jù)庫服務提供商。如國外的Inktomi,它本身并不是直接面向用戶的搜索引擎,但向包括Overture(原GoTo)、LookSmart、MSN、HotBot等在內(nèi)的其他搜索引擎提供全文網(wǎng)頁搜索服務,因此從這個意義上說,它們是搜索引擎的搜索引擎。
9、 三、搜索引擎基本結構 搜索引擎是根據(jù)用戶的查詢請求信息,按照一定算法從索引數(shù)據(jù)中查找符合用戶需求的信息后將結果返回給用戶。一般的搜索引擎由網(wǎng)絡機器人程序、索引與搜索程序、索引數(shù)據(jù)庫等部分組成。 圖3-1結構圖 (一)網(wǎng)絡機器人 網(wǎng)絡機器人也稱為“網(wǎng)絡蜘蛛”(Spider),是一個功能很強的WEB掃描程序。它可以在掃描WEB頁面的同時檢索其內(nèi)的超鏈接并加入掃描隊列等待以后掃描。因為WEB中廣泛使用HTML超鏈接,所以一個Spider程序理論上可以訪問整個WEB頁面。 為了保證網(wǎng)絡機器人遍歷信息的廣度和深度需
10、要設定一些重要的鏈接并制定相關的掃描策略。其設計思想就是將整個網(wǎng)絡看做一顆樹,通過遞歸不斷的將符合條件的頁面的連接拿到進行處理。 (二)索引與搜索 網(wǎng)絡機器人將遍歷得到的頁面存放在臨時數(shù)據(jù)庫中,如果通過SQL直接查詢信息速度將會難以忍受。為了提高檢索效率,需要建立索引(我們學過的SqlServer2005中曾介紹字段添加索引能提高查詢速度這個倍數(shù)是驚人的),用戶輸入搜索條件后搜索程序將通過索引數(shù)據(jù)庫進行檢索然后把符合查詢要求的數(shù)據(jù)返回給用戶。 (三)Web服務器 在Web程序開發(fā)中,使用的Wdb服務器有很多種類,其中比較常見的有,tomcat服務器、WebLogic服務器、還有JBos
11、s服務器,其中tomcat是最比較普遍常用的一個,它以穩(wěn)定的性能,和開源的優(yōu)勢得到了廣大用戶的承認,其實JBoss也是一個開源的但是它的結構比較復雜使用起來不是很靈活,而WebLogic則是一款收費的商業(yè)型的服務器,在我實現(xiàn)的開發(fā)中擇用了簡單使用的tomcat容器作為我web程序的服務器??蛻粢话阃ㄟ^瀏覽器進行查詢,這就需要系統(tǒng)提供Web服務器并且與后臺的搜索邏輯進行交互??蛻粼跒g覽器中輸入查詢條件,Web服務器接收到客戶的查詢條件后在索引數(shù)據(jù)庫中進行查詢處理然后返回給客戶端。 (四)搜索引擎的主要指標及分析 搜索引擎的主要指標有響應時間、準確率、相關度等。這些指標決定了搜索引擎的技術指標
12、。搜索引擎的技術指標決定了搜索引擎的評價指標。好的搜索引擎應該是具有較快的反應速度和準確率的,當然這些都需要搜索引擎技術指標來保障。 (1)準確率:一次搜索結果中符合用戶要求的數(shù)目與該次搜索結果總數(shù)之比 (2)相關度:用戶查詢與搜索結果之間相似度的一種度量 (3)精確度:對搜索結果的排序分級能力和對垃圾網(wǎng)頁的抗干擾能力 四、網(wǎng)絡機器人? (一)什么是網(wǎng)絡機器人 網(wǎng)絡機器人又稱為Spider程序,是一種專業(yè)的網(wǎng)頁爬蟲程序。它能查找大量的Web頁面。從一個簡單的Web入口頁面上開始執(zhí)行,然后通過其超鏈接一次遞歸訪問其他頁面,因此理論上網(wǎng)絡機器人可以掃描互聯(lián)網(wǎng)
13、上的所有頁面。但是實際中并非如此,因為這樣將會耗去大量的時間和金錢,一次所有的企業(yè)基于商業(yè)盈利的角度都不會不停的使用網(wǎng)絡機器人進行搜索WEB頁面。一般來說這些企業(yè)都是定時的進行索引數(shù)據(jù)庫的更新,據(jù)說Google是每隔28天進行一次索引數(shù)據(jù)庫的更新并維護這些大型數(shù)據(jù)庫。 (二)網(wǎng)絡機器人的結構分析 Internet是建立在很多相關協(xié)議基礎上的,而更復雜的協(xié)議又建立在系統(tǒng)層協(xié)議之上。Web就是建立在HTTP ( Hypertext Transfer Protocol ) 協(xié)議基礎上,而HTTP又是建立在TCP/IP ( Transmission Control Protocol / Inter
14、net Protocol ) 協(xié)議之上,它同時也是一種Socket協(xié)議。所以網(wǎng)絡機器人本質(zhì)上是一種基于Socket的網(wǎng)絡程序。 因為Web中的網(wǎng)頁信息都是使用HTML標記語言,因此網(wǎng)絡機器人在檢索網(wǎng)頁時首先就是對HTML標記進行解析。在處理解析之前,先來了解一下HTML中主要數(shù)據(jù)類型。我們在進行解析的時候不用關心所有的標簽,只需要對其中幾種重要的進行解析即可。以下是一些HTML基本的標簽元素。 (1)腳本:一些嵌入HTML標簽中的代碼語言(例如:JavaScript、jsp頁面中的Java代碼等等) (2)注釋:程序員留下的說明文字,對用戶是不可見的(即:) (3)簡單
15、標簽:由單個表示的HTML標簽(例如:
、 等等) ①超連接標簽 超連接定義了WWW通過Internet鏈接文檔的功能。他們的主要目的是使用戶能夠任意遷移到新的頁面,這正是網(wǎng)絡機器人最關心的標簽。 ②圖像映射標簽 圖像映射是另一種非常重要的標簽。它可以讓用戶通過點擊圖片來遷移到新的頁面中。 ③表單標簽 表單是Web頁面中可以輸入數(shù)據(jù)的單元。許多站點讓用戶填寫數(shù)據(jù)然后通過點擊按鈕來提交內(nèi)容,這就是表單的典型應用。 ④表格標簽 表格是HTML的構成部分,通常用來格式化存放、顯示數(shù)據(jù)。 我們在具體解析這些HTML標簽有兩種方法:通過16、JavaTM中的Swing類來解析或者通過組件包中的HTMLParser來解析,本人在實際編程中采用后者使用組件對html進行操作。HTMLParser是一個很優(yōu)秀的開源組件,它有很強大的支持HTML解析的功能,下面我就來介紹一下HTMLParser中的核心組件類。 (1)org.htmlparser.Parser 定義了htmlparser的一些基礎類。其中最為重要的是Parser類。Parser是htmlparser的最核心的類。 (2)org.htmlparser.beans對Visitor和Filter的方法進行了封裝,定義了針對一些常用html元素操作的bean,簡化對常用元素的
17、提取操作。 (3)org.htmlparser.nodes定義了基礎的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。 (4)org.htmlparser.tags定義了htmlparser的各種tag。 (5)org.htmlparser.filters定義了htmlparser所提供的各種filter,主要通過extractAllNodesThatMatch (NodeFilter filter)來對html頁面指定類型的元素進行過濾。 (6)org.htmlparser.visitors定義了htmlparser所提供的各種vi
18、sitor,主要通過visitAllNodesWith (NodeVisitor visitor)來對html頁面元素進行遍歷。 (三)Spider程序結構 網(wǎng)絡機器人必須從一個網(wǎng)頁遷移到另一個網(wǎng)頁,所以必須找到該頁面上的超連接。程序首先解析網(wǎng)頁的HTML代碼,查找該頁面內(nèi)的超連接然后通過遞歸和非遞歸兩種結構來實現(xiàn)Spider程序。 (1)遞歸結構 遞歸是在一個方法中調(diào)用自己本身的程序設計技術。雖然比較容易實現(xiàn)但耗費內(nèi)存且不能使用多線程技術,故不適合大型項目。 (2)非遞歸結構 這種方法使用隊列的數(shù)據(jù)結構,當Spider程序發(fā)現(xiàn)超連接后并不調(diào)用自己本身而是把超鏈接加入到等待隊列中。
19、當Spider程序掃描完當前頁面后會根據(jù)制定的策略訪問隊列中的下一個超鏈接地址。雖然這里只描述了一個隊列,但在實際編程中用到了四個隊列,他們每個隊列都保存著同樣處理狀態(tài)的URL。 等待隊列:在這個隊列中,URL等待被Spider程序處理。新發(fā)現(xiàn)的URL也被加入到這個隊列中 處理隊列: 當Spider程序開始處理時,他們被送到這個隊列中 錯誤隊列: 如果在解析網(wǎng)頁時出錯,URL將被送到這里。該隊列中的URL不能被移入其他隊列中。 完成隊列: 如果解析網(wǎng)頁沒有出錯,URL將被送到這里。該隊列中的URL不能被移入其它隊列中,在同一時間URL只能在一個隊列中,把它稱為URL的狀態(tài)。
20、 圖4-1spider運行過程 以上的圖表示了隊列的變化過程,在這個過程中,當一個URL被加入到等待隊列中時Spider程序就會開始運行。只要等待隊列中有一個網(wǎng)頁或Spider程序正在處理一個網(wǎng)頁,程序就會繼續(xù)他的工作。當?shù)却犃袨榭詹⑶耶斍皼]有任何網(wǎng)頁時,Spider程序就會停止它的工作。 (四)如何提高程序性能 Internet中擁有大量的Web頁面,如果開發(fā)出高效的Spider程序是非常重要的。通過查詢資料我主要研究了使用Java的多線程技術提高性能的技術: 線程是通過程序的一條執(zhí)行路線。多線程是一個程序同時運行多個任務的能
21、力。它是在一個程序的內(nèi)部進行分工合作。 優(yōu)化程序的通常方法是確定瓶頸并改進他。瓶頸是一個程序中最慢的部分,他限制了其他任務的運行。例如:一個Spider程序需要下載十個頁面,要完成這一任務,程序必須向服務器發(fā)出請求然后接受這些網(wǎng)頁。當程序等待響應的時候其他任務不能執(zhí)行,這就影響了程序的效率。如果用多線程技術可以讓這些網(wǎng)頁的等待時間合在一起,不用互相影響,這就可以極大的改進程序性能。 五、基于Tomcat的Web服務器jsp搜索引擎程序設計詳解 (一)開發(fā)工具、平臺及資源? 1、 MyEclipse 6.0開發(fā)工具 2、Sun JDK 1.6.1 3、Tomcat 6.1服務器
22、 4、開源Lucene組件 (二)Lucene開源組件簡介 我在程序設計實現(xiàn)中,使用了lucene開源組件,并未使用數(shù)據(jù)庫做為存放大量信息的索引數(shù)據(jù)庫,最主要的原因就是考慮使用Lucene效率會大大的高于使用普通數(shù)據(jù)庫的性能。因此首先簡單介紹一下Lucene相關的技術。 1、什么是Lucene全文檢索以及引入Lucene的原因 Lucene是Jakarta Apache的開源項目。它是一個用Java寫的全文索引引擎工具包,可以方便的嵌入到各種應用中實現(xiàn)針對應用的全文索引/檢索功能。如果搜索引擎網(wǎng)絡機器人檢索到的網(wǎng)頁信息放到數(shù)據(jù)庫中的話,當用戶在客戶端檢索數(shù)據(jù)的時候,如果數(shù)據(jù)庫中存放著大
23、量數(shù)據(jù)的話,沒有好的數(shù)據(jù)庫檢索策略,數(shù)據(jù)查詢速度大大減慢,而且其搜索引擎的性能也會因此而大打折扣,會導致用戶長期的等待,結果超出用戶的人手時間??紤]以上的原因,我在設計的時候選擇了使用Lucene,將網(wǎng)絡機器人,檢索到的網(wǎng)頁的基本信息交給Lucene處理,經(jīng)過Lucene處理后將搜索到的網(wǎng)頁信息建立相應的索引,并且存放到Lucene創(chuàng)建的索引文件中去,從而在用戶檢索相應的數(shù)據(jù)的時候,免去了從數(shù)據(jù)庫中查詢的步驟,直接從索引文件中獲取所需的信息,這樣程序對文件的IO操作要遠遠大于數(shù)據(jù)庫的檢索的效率。從而提高了程序的性能和用戶的體驗。 2、Lucene的基本介紹 (1)對于Luc
24、ene的感性認識 Lucene的API接口設計的比較通用,輸入輸出結構都很像數(shù)據(jù)庫的表==>記錄==>字段,所以很多傳統(tǒng)的應用文件、數(shù)據(jù)庫等都可以比較方便的映射到Lucene的存儲結構和接口中。總體上看:可以先把Lucene當成一個支持全文索引的數(shù)據(jù)庫系統(tǒng),因此Lucene和數(shù)據(jù)庫在很大程度上有一定的相似度,在Lucene中的索引數(shù)據(jù)源(即:doc(field1,field2...) doc(field1,field2...))很像數(shù)據(jù)庫中的數(shù)據(jù)庫表,而Lucene中的Document類即:(一個需要進行索引的“單元”,一個Document由多個字段組成)很類似與數(shù)據(jù)庫中表中的一條記錄(行)
25、,在Lucene中的Field類則是充當了索引文件中的Decument類的屬性的集合字段,它的作用當然就是相當于數(shù)據(jù)庫的列的屬性,在我們使用Java也好或者是C#也罷查詢數(shù)據(jù)庫的時候,數(shù)據(jù)庫返回的結果集就相當于Lucene結果輸出,也就是Hits類對象了,即:(doc(field1,field2) doc(field1...))在Hits中查詢結果集,匹配是由Document組成相當于數(shù)據(jù)庫中查詢出來的結果集。 (2)Lucene的索引效率 前面提到了,我使用Lucene主要的目的就是為了提高索引數(shù)據(jù)庫中的數(shù)據(jù)查詢速度,下面我們就來看看Lucene的基本的索引原理吧,通常書籍后面常常附關鍵
26、詞索引表(比如:北京:12, 34頁,上海:3,77頁……),感性的講它就像我們常用的字典中的目錄很相似,它能幫讀者較快地找到相關內(nèi)容的頁碼。而數(shù)據(jù)庫索引能夠大大提高查詢的速度原理也是如此,通過書后面的索引查找的速度要比一頁一頁地翻內(nèi)容高多少倍……而索引之所以效率高,另外一個原因是它是排好序的。對于檢索系統(tǒng)來說核心是一個排序問題。 由于數(shù)據(jù)庫索引不是為全文索引設計的,因此,使用like "%keyword%"時,數(shù)據(jù)庫索引是不起作用的,在使用like查詢時,搜索過程又變成類似于一頁頁翻書的遍歷過程了,所以對于含有模糊查詢的數(shù)據(jù)庫服務來說,LIKE對性能的危害是極大的。我曾經(jīng)在Oracle中做
27、過一個實驗,在數(shù)據(jù)庫中使用索引和不使用索引的速度先比,前者是后者速度的將近上百倍,當然這個結果不是唯一的,對于數(shù)據(jù)量越大的數(shù)據(jù)庫中我們使用索引的效率以及能給我們帶來的方便時越為明顯的,如果是需要對多個關鍵詞進行模糊匹配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。所以建立一個高效檢索系統(tǒng)的關鍵是建立一個類似于科技索引一樣的反向索引機制,將數(shù)據(jù)源排序順序存儲的同時,有另外一個排好序的關鍵詞列表,用于存儲關鍵詞==>文章映射關系,這樣檢索過程就是把模糊查詢變成多個可以利用索引的精確查詢的邏輯組合的過程。從而大大提高了多關鍵詞查詢的效率,
28、所以,全文檢索問題歸結到最后是一個排序問題。在本文中我們主要是研究的搜索引擎的效率問題,其實在Lucene中還有很多個人認為很經(jīng)典的技術,比如是分詞技術,還有相關的信息匹配技術等等由于時間和文章篇幅的限制,我在此不多贅述。 (三)引入基于Tomcat的Web服務器開發(fā)設計 Web服務器是在網(wǎng)絡中為實現(xiàn)信息發(fā)布、資料查詢、數(shù)據(jù)處理等諸多應用搭建基本平臺的服務器。Web服務器如何工作:在Web頁面處理中大致可分為三個步驟,第一步,Web瀏覽器向一個特定的服務器發(fā)出Web頁面請求;第二步,Web服務器接收到Web頁面請求后,尋找所請求的Web頁面,并將所請求的Web頁面?zhèn)魉徒oWeb瀏覽器;第三步
29、,Web服務器接收到所請求的Web頁面,并將它顯示出來。這就是一個典型的HTTP請求過程。 Tomcat是一個開放源代碼、運行servlet和JSP Web應用軟件的基于Java的Web應用軟件容器。Tomcat由Apache-Jakarta子項目支持并由來自開放性源代碼Java社區(qū)的志愿者進行維護。Tomcat Server是根據(jù)servlet和JSP規(guī)范進行執(zhí)行的,因此我們就可以說Tomcat Server也實行了Apache-Jakarta規(guī)范且比絕大多數(shù)商業(yè)應用軟件服務器要好。 (四)用戶接口設計 1、客戶端設計 一個良好的查詢界面非常重要,例如Google就以他簡潔的查詢界面
30、而聞名。我在設計的時候也充分考慮了實用性和簡潔性。 圖5-1查詢界面 圖5-2查詢結果 2、服務端設計 主要利用jsp技術實現(xiàn),用戶通過GET方法從客戶端向服務端提交查詢條件,服務端通過Tomcat的jsp接受并分析提交參數(shù),再調(diào)用lucene的開發(fā)包進行搜索操作。最后把搜索的結果以HTTP消息包的形式發(fā)送至客戶端,從而完成一次搜索操作。 實現(xiàn)的關鍵代碼如下: int thispage = (request.getParameter("thispage") == null) ? Integer.parseInt(re
31、quest.getParameter("thispage"));//當前頁碼 long starttime = System.currentTimeMillis(); //拿到用戶請求的查詢內(nèi)容 String queryString = request.getParameter("query"); if ((queryString == null) || queryString.equals("")) { queryString = "dd"; response.sendRedirect("./index.jsp");}
32、 //以下代碼是使用Lucene索引文件進行搜索符合條件的內(nèi)容 IndexFiles indexFiles = new IndexFiles(); String path = request.getRealPath("/") + "index"; //建立符合條件的搜索結果集合存放準備將其返回給用戶 Hits hits = indexFiles.searchIndexContent(path, queryString); System.out.println("一共查到" + hits.length() + "記錄"); l
33、ong endtime = System.currentTimeMillis(); //將搜用戶索條件進行分詞處理 ChineseAnalyzer abc = new ChineseAnalyzer(); TokenStream tokenStream = null; QueryParser parser = new QueryParser("title", new StandardAnalyzer()); Query query = parser.parse(queryString); //將
34、拿到的內(nèi)容進行高亮關鍵字處理 Highlighter highlighter = new Highlighter (new SimpleHTMLFormatter("", ""), newQueryScorer(query));highlighter.setTextFragmenter(new SimpleFragmenter(99));/ (五)機器人的設計分析 1、程序結構圖如下: 圖5-3 spider程序結構 2、程序關鍵代碼實現(xiàn)如下: (1)網(wǎng)絡機器人搜索網(wǎng)頁核心代碼 public void
35、search(Queue queue) { while (!queue.isEmpty()) { // 只要是隊列不為空則網(wǎng)絡機器人工作 url = queue.peek().toString();// 查找列隊 if (!isSearched(searchedsite, url)) { // 查看當前連接是否被掃描過 if (isRobotAllowed(new URL(url))) // 檢查該鏈接是否被允許搜索 processHtml(url); // 分析當前地址的頁面 System.out.println("此頁面禁止爬蟲獲取資源!"); queue.re
36、move(); // 搜索操作完成之后進行出對操作。 * 檢查該鏈接是否已經(jīng)被掃描 *已經(jīng)處理完成的URL列表 *當前處理的URL字符串 public boolean isSearched(List list, String url) { String url_end_ = ""; if (url.endsWith("/")) { // 測試此字符串是否以"/"后綴結束 // 返回指定子字符串("/")在此字符串中最右邊出現(xiàn)處的索引 // (拿到連接地址最右邊的"/"索引) 例如 // 能拿到最右邊的即最后一個"/"的索引位置, // 最終的目的是
37、要拿到"/"之前的連接地址 url_end_ = url.substring(0, url.lastIndexOf("/")); } else { url_end_ = url + "/";} if (list.size() > 0) { // indexOf(Object o) // 返回此列表中第一次出現(xiàn)的指定元素的索引;如果此列表不包含該元素,則返回 -1 // 我們在此不使用循環(huán)進行選重原因就是因為使用index of方法效率要高些, // 因為Java已經(jīng)將它的算法封裝在里面并且進行了優(yōu)化 if (list.indexOf(url) != -1 || l
38、ist.indexOf(url_end_) != -1) { return true; // 如果在list中沒有找到當前要處理的url則表示可以處理 return false; // 否則此鏈接地址已經(jīng)處理過在此不做任何處理 } * 檢查URL是否被允許搜索 private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); // 獲取給出RUL的主機并且使用給定 Locale 的規(guī)則將此 String 中的所有字符都轉換為小寫 //
39、 System.out.println("主機="+host);
// 獲取主機不允許搜索的URL緩存
ArrayList
40、new BufferedReader( new InputStreamReader(robotsFileUrl.openStream())); // 讀robot文件,創(chuàng)建不允許訪問的路徑列表。 while ((line = reader.readLine()) != null) { if (line.indexOf("Disallow:") == 0) { // 是否包含"Disallow:" String disallowPath = line.substring("Disallow:".length()); // 獲取不允許訪問路徑檢查是否有注釋。 int c
41、ommentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) {disallowPath = disallowPath.substring(0, commentIndex);// 去掉注釋}disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } // 在此確隊列中的元素不是為空的 for (Iterator it = disallowList.iterator(); it.hasNext();) { System.out.
42、println("Disallow is :" + it.next()); }// 緩存此主機不允許訪問的路徑。// 將此主機名相對應的禁止訪問的路徑放到定義的map中disallowListCache.put(host, disallowList); 說明: ①以上是網(wǎng)絡機器人的核心算法代碼,運用的是半自動遞歸思想,搜索引擎系統(tǒng)維護人員將定時的執(zhí)行網(wǎng)絡機器人代碼,來更新索引數(shù)據(jù)庫中的內(nèi)容確保用戶能拿到自己所需要的最符合用戶的,最新的消息。 ②值得說明的一點是,在我做這個程序的時候遇見的一個難題吧,在確定URL的時候怎么能知道我們訪問的網(wǎng)站是否允許我們的搜索引擎訪問本網(wǎng)站的內(nèi)容呢,
43、這樣roboots.txt就起到了關鍵的作用,在此我們介紹一下roboots文件. 搜索引擎通過一種程序robot(又稱spider),自動訪問互聯(lián)網(wǎng)上的網(wǎng)頁并獲取網(wǎng)頁信息。我們可以在您的網(wǎng)站中創(chuàng)建一個純文本文件robots.txt,在這個文件中聲明該網(wǎng)站中不想被robot訪問的部分,這樣,該網(wǎng)站的部分或全部內(nèi)容就可以不被搜索引擎收錄了,或者指定搜索引擎只收錄指定的內(nèi)容。 robots.txt文件應該放在網(wǎng)站根目錄下。舉例來說,當robots訪問一個網(wǎng)站(比如)時,首先會檢查該網(wǎng)站中是否存在 網(wǎng)站URL相應的 robots.txt的URL http://www.w3.org/r
44、obots.txt,在robots.txt中 Disallow : 該項的值用于描述不希望被訪問到的一個URL,這個URL可以是一條完整的路徑,也可以是部分的,任何以Disallow開頭的URL均不會被robot訪問到。 例如"Disallow: /help"對/help.html和/help/index.html都不允許搜索引擎訪問,而"Disallow: /help/"則允許robot訪問/help.html,而不能訪問/help/index.html。任何一條Disallow記錄為空,說明該網(wǎng)站的所有部分都允許被訪問, 在"/robots.txt"文件中,至少要有一條Disallow記
45、錄。如果"/robots.txt"是一個空文件,則對于所有的搜索引擎robot, 該網(wǎng)站都是開放的。 (2)網(wǎng)絡機器人解析網(wǎng)頁HTML核心代碼 處理HTML標簽 public void dealTag(Tag tag) throws Exception { NodeList list = tag.getChildren(); if (list != null) { NodeIterator it = list.elements(); while (it.hasMoreNodes()) { Node node = it.nextNode(); parserNode
46、(node); 處理HTML標簽結點 public void parserNode(Node node) throws Exception { // instanceof 用于判斷所拿到的節(jié)點類型是不是標準定義好的節(jié)點類型hen if (node instanceof StringNode) { // 判斷是否是文本結點 StringNode sNode = (StringNode) node; StringFilter sf = new StringFilter(keyword, false); search_key_words = sf.accept(sNode)
47、; if (search_key_words) { count++; } // System.out.println("text is :"+sNode.getText().trim()); } else if (node instanceof Tag) {// 判斷是否是標簽庫結點 Tag atag = (Tag) node; if (atag instanceof TitleTag) {// 判斷是否是標TITLE結點 srb.setTitle(atag.getText()); } if (atag instanceof LinkTag) {// 判斷是否是標
48、LINK結點 LinkTag linkatag = (LinkTag) atag; checkLink(linkatag.getLink(), linklist); / System.out.println("-----------------this is link dealTag(atag); } else if (node instanceof RemarkNode) { // 判斷是否是注釋 } (3)網(wǎng)絡機器人與Lucene結合核心代碼 if (!iswrite) {//切入蜘蛛程序 System.out.println("開始為頁面建立
49、索引" + url + "............
");
IndexFiles.updateURL(path, url);
說明:本代碼是將網(wǎng)絡機器人拿到符合條件的標簽加到Lucene索引文件中,即搜索引擎的索引數(shù)據(jù)庫。
(六)關于程序說明
(1)本人在網(wǎng)絡機器人運用了Java語言開發(fā),主要涉及到了net和io兩個包。
(2)還有Java線程技術,由于時間比較緊迫,本程序只用的了Java中的單線程技術,具體的程序優(yōu)化后期應該能涉及到Java中的線程池技術。
(3)此外還用了第三方開發(fā)包htmlparser組件用于解析HTML網(wǎng)頁標簽。
本程序使用的算法是介于遞歸和非
50、遞歸的半自動遞歸算法,使用遞歸算法的時候,如果有意外可能會導致內(nèi)存溢出,對于本文的程序如果使用非遞歸算法的話有點復雜,會使得程序的性能無法達到最佳的狀態(tài),因為我對非遞歸的算法進行了改造,自己將它命名為半自動的非遞歸算法,是本程序性能達到比較好的狀態(tài)。 六、在Tomcat上部署項目 Tomcat中的應用程序是一個WAR(Web Archive)文件。WAR是Sun提出的一種Web應用程序格式,與JAR類似,也是許多文件的一個壓縮包。這個包中的文件按一定目錄結構來組織:通常其根目錄下包含有Html和Jsp文件或者包含這兩種文件的目錄,另外
51、還會有一個WEB-INF目錄,這個目錄很重要。通常在WEB-INF目錄下有一個web.xml文件和一個classes目錄,web.xml是這個應用的配置文件,它是JavaWeb應用程序的入口點,而classes目錄下則包含編譯好的Servlet類和Jsp或Servlet所依賴的其它類(如JavaBean)。通常這些所依賴的類也可以打包成JAR放到WEB-INF下的lib目錄下,當然也可以放到系統(tǒng)的CLASSPATH中。 在Tomcat中,應用程序的部署很簡單,你只需將你的WAR放到Tomcat的webapp目錄下,Tomcat會自動檢測到這個文件,并將其解壓。你在瀏覽器中訪問這個應用的Jsp
52、時,通常第一次會很慢,因為Tomcat要將Jsp轉化為Servlet文件,然后編譯。編譯以后,訪問將會很快。 七、總結 全文搜索引擎已經(jīng)成為人們在信息化時代中檢索信息不可缺少的工具。本設計將lucene這一開源的搜索引擎框架,結合Java?Web開發(fā)流行的SSH、Ajax等技術,實現(xiàn)一個可以在小型局域網(wǎng)或海量文件存儲的主機上進行數(shù)據(jù)檢索的引擎。并且通過Spring可以實現(xiàn)靈活的配置。為無法使用互連網(wǎng)搜索引擎下的海量數(shù)據(jù)檢索,提供了一個很好的解決方案。 致謝 當我寫完這篇畢業(yè)
53、論文的時候,心情十分激動,感慨很多。從開始進入課題到資料的搜集再到論文的順利完成,整個過程都離不開指導老師、朋友們的熱情幫助,在這里請接受我誠摯的謝意! 首先,我要感謝我的論文指導老師老師。這篇論文的每一步都是在齊老師的悉心指導下完成的。老師為人隨和熱情,正是有了齊老師的無私幫助與熱忱鼓勵,我的畢業(yè)論文才能夠得以順利完成,這里,我要誠摯的向老師說一聲:“謝謝您,齊老師?!? 此外,我要感謝身邊的朋友們。在這次論文寫作過程中,他們對我總是有求必應,幫助我搜集和提供了大量有價值的文獻資料,幫助我理清了論文的寫作思路,對我的論文提出了諸多寶貴的意見和建議。借此機會,我要對各位朋友們的幫助表示真摯
54、的感謝,謝謝你們! 參考文獻 [1]似杰.盤古搜索購物資訊引擎的設計與實現(xiàn)[D].北京工業(yè)大學,2013. [2]李雪利.基于Solr的企業(yè)搜索引擎的研究與實現(xiàn)[D].浙江理工大學,2013. [3]范晨熙.基于Hadoop的搜索引擎的研究與應用[D].浙江理工大學,2013. [4]張菊琴.基于模糊聚類算法及推薦技術的搜索引擎結果排序[D].江西理工大學,2013. [5]裴一蕾,薛萬欣,趙宗,陶秋燕.基于用戶體驗視角的搜索引擎評價研究[J].情報科學,2013,05:94-97+112. [6]雷鳴,劉建國,王建勇,陳葆玨.一種基于詞典的搜索引擎系統(tǒng)動態(tài)更新
55、模型[J].計算機研究與發(fā)展,2000,10:1265-1270. [7]朱亮,顧俊峰,馬范援.基于MobileAgent的搜索引擎關鍵技術研究[J].計算機工程,2000,08:126-129. [8]項珍.基于語義的搜索引擎探討[J].浙江高校圖書情報工作,2008,06:15-20. [9]張杰.基于Web數(shù)據(jù)挖掘的搜索引擎研究[J].信息與電腦(理論版),2013,11:95-96. [10]李豫山.基于聚焦搜索引擎的搜索引擎優(yōu)化策略的研究[J].科技信息,2014,12:10-11. [11]伍大勇.搜索引擎中命名實體查詢處理相關技術研究[D].哈爾濱工業(yè)大學,2012. [12]宋巍.基于主題的查詢意圖識別研究[D].哈爾濱工業(yè)大學,2013. 24
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。