信息時代的爆炸帶來的是海量數據的發展,而搜索引擎帶來了大浪淘沙的功能。 網民們通過搜索引擎都能夠找到自己所需要的網頁,并且通過搜索引擎還能快速找到幫助自己發展的位置。 而搜索引擎的發展從第一代簡單的搜索,到當前復雜的數據挖掘,這其中的過程如下:
第一代引擎出現在 1994 年。此代的搜索引起內容簡單、搜索的范圍不廣,而且他們對于搜索到的資訊和時間要求都不很嚴格,導致了在搜索過程中,人們經常需要花費大量的耐心來進行檢索,一般檢索的時間要等到10 秒或者更長。 這一代的搜索使用的技術是在線搜索和IR 搜索技術。 根據數據統計,在當時在網絡爬蟲的數據大約每天 1500 次查詢左右。
第二代搜索是建立在第一代搜索的基礎之上的。 由于第一代搜索的速度非常緩慢,第二代搜索在采用新技術---分布式響應方案的基礎上,提升了相應規模和相應速度,通過建立起一個大型、分布式的索引數據庫,每天直接對應各種用戶的需求, 并能夠快速的進行反饋。這種索引快速,導致了用戶數量的不斷增加和擴展。
第三代搜索是在獲取用戶數據上的。 通過搜索引擎充分理解用戶的需求,分析用戶對當前數據的安排和內容,并直接響應出用戶檢索的內容,減少用戶的查詢時間和響應時間。 這種檢索方式,需要充分利用用戶與檢索內容的交互,進行數據挖掘和數據分析,方能實現。
我們當前正處于第二代和第三代搜索之間, 在減少響應速度和響應時間之間,著名的搜索公司 Google 和國內的百度有著自己的發展方向。
在因特網領域,搜索引擎技術得到了廣泛使用,然而他在國內外的含義卻有所不同。 在美國搜索引擎通常指的是基于因特網的搜索引擎, 他們通過網絡機器人程序收集上千萬到幾億個網頁, 并且每一個詞都被搜索引擎索引,也就是我們說的全文檢索。 在美國,他們通過網絡機器人程序收集上千萬到幾億個網頁, 并且每一個詞都被搜索引擎索引,也就是我們說的全文檢索。著名的因特網搜索引擎包括 First Search、Google、HotBot 等。 在中國,搜索引擎通常指基于網站目錄的搜索服務或是特定網站的搜索服務,本人這里研究的是基于因特網的搜索技術。
一、搜索引擎的結構
本文基于瀏覽器/服務器(Browse/Server)結構,使用JSP 作 為開發語言 ,J2EE 作 為開發工具 ,MySQL 作 為數據庫,并在 Tomcat5.0 上進行發布。 由于 JAVA 語言具有可移植、安全性、解釋執行、高性能、動態性,以及稍做修改后就具有跨平臺性的優點, 使得本系統操作方便、快捷。
1、網絡蜘蛛概念
網絡蜘蛛即 Web Spider , 是一個很生動的名字。 假如我們把互聯網比喻成一個蜘蛛網, 那么 Spider 就是在蜘蛛網上爬來爬去的蜘蛛。 通過網頁的鏈接地址, 網絡蜘蛛從網站某一個頁面( 通常是首頁) 開始, 通過讀取網頁的內容, 找到其他網頁的鏈接地址, 然后再通過這些鏈接地址繼續讀取下一個網頁。 這樣一直循環下去, 直到把這一網站所有的網頁都抓取完為止。 如果把整個互聯網當成一個整體網站, 那么網絡蜘蛛就是通過上述原理抓取 Interner 網上的所有網頁。 對于搜索引擎來說, 要抓取互聯網上所有的網頁幾乎是不可能的, 從目前公布的數據來看, 容量最大的搜索引擎也不過是抓取了整個網頁數量的百分之四十左右。 這其中的原因一方面是抓取技術的瓶頸, 無法遍歷所有的網頁, 有許多網頁無法從其它網頁的鏈接中找到; 另一方面是存儲技術和處理技術的問題,如果按照每個頁面的平均大小為 20K 計算(包含圖片) , 100 億網頁的容量是 100 ×2000G 字節, 即使能夠存儲, 下載也存在問題 ( 按照一臺機器每秒下載20K 計算, 需要 340 臺機器不停的下載一年時間 , 才能把所有網頁下載完畢) .
2、網絡蜘蛛的主要技術在抓取網頁時, 網絡蜘蛛一般有廣度優先和深度優先兩種策略。 廣度優先其實就是一種并行處理, 網絡蜘蛛通過起始網頁中鏈接的所有網頁, 選擇其中的一個鏈接網頁, 抓取在此網頁中鏈接的所有網頁,依次擴展,從而提高其抓取速度。 深度優先是指網絡蜘蛛會從起始頁開始, 一個鏈接一個鏈接地跟蹤下去, 處理完這條線路之后再轉入下一起始頁, 繼續跟蹤鏈接。 這一方法的優點是網絡蜘蛛在設計時比較容易。 相對于深度優先來說,廣度優先要常用的多。
目前一般的網站都希望有更多的訪問者訪問, 也就是需要有更多的搜索引擎找到訪問的網頁,也即是全面地抓取自己網站的網頁。 為了讓本網站的網頁更全面地被抓取到, 網站管理員可以建立一個網站地圖, 即 SiteMap. 網絡蜘蛛通過 sitemap.htm 這個入口爬取這個網站的網頁,抓取這些文件后,通過讀取其中的文本信息,提取對搜索引擎的搜索準確性有重要幫助的文檔信息, 同時, 這些信息也利用網絡蜘蛛正確跟蹤其它鏈接。 在搜索引擎中網絡蜘蛛占有重要位置, 對搜索引擎的查全、查準都有影響, 決定了搜索引擎數據容量的大小。 同時,它的好壞還直接影響到搜索結果頁中的死鏈接( 即鏈接所指向的網頁已經不存在) 個數。
二、搜索引擎總體設計
現實環境中,有許多用戶都有搜索服務的需求,例如很多網站都渴望有自己的站內搜索,這當然可以通過數據庫來簡單實現,但是在搜索服務器的負載量很大的情況下,數據庫是無力應付的,而且數據庫簡單的基于字符串匹配的方式也顯得過于呆板, 不能提供更多的高級搜索功能。 有的用戶可能會選擇自己組建開發團隊來開發搜索引擎, 也可能會購買商用的搜索服務器軟硬件來搭建搜索平臺。 不過, 筆者認為普通用戶也可以選擇簡單地購買搜索服務,不需要自己的開發團隊,也不需要自己購買搜索服務軟硬件。 也就是說, 用戶只簡單地提出搜索服務要求,其它一切都交給搜索服務提供商,軟硬件和數據維護與更新都交給服務提供商。
在上述情況下, 一個搜索引擎服務器提供商可以為若干個客戶提供搜索,他們需要根據不同用戶的需求去設計數據的索引策略和搜索策略,同時需要在自己的服務器主機上保存和維護不同用戶的數據。 Solr1.3 優秀的多核心性能正好能滿足這樣的需求, 一方面多核心可以實現多庫, 也就可以實現多個服務并行提供; 另一方面Solr1.3 的各個核心之間的獨立性和可配置性 ,又使得搜索服務提供商可以根據不同用戶的需求來進行個性化的配置。