網際網路
好訊息是,網上有無數
網頁提供主題極為多樣的信息。壞訊息是,這些網頁大都是由製作者隨便命名的,而且幾乎全都存儲在不知何名的
伺服器上。當你需要了解特定主題時,您怎么知道應當閱讀哪些網頁呢?像大多數人一樣,您要使用
網際網路搜尋引擎。
任務
儘管各種搜尋引擎的工作方式有所不同,但它們都要完成兩個基本任務:
關鍵字
基於關鍵字來搜尋網際網路——或其中的一部分。 生成一份索引,保存所搜尋的詞語,以及相應地址。 允許用戶在索引中查找詞語或詞語組合。 早期搜尋引擎的索引僅包括數十萬個的
網頁或文檔,每天受理的查詢可能只有一兩千次。如今,頂級搜尋引擎的索引列表涵蓋數億個網頁,每天回響數千萬次查詢。在本文中,我們將會講解這些基本任務是如何完成,以及網際網路搜尋引擎是如何整合信息以幫助我們在網上找到所需內容。
搜尋引擎
大多數人談及網際網路搜尋引擎時,實際上指的是
全球資訊網搜尋引擎。在全球資訊網成為網際網路最引人注目的部分之前,早就有搜尋引擎幫助人們查找網上信息了。如“
gopher”和“Archie”等程式可以生成索引,存儲在接入網際網路的各個
伺服器上的檔案信息,極大縮短了查找程式和文檔的時間。上世紀八十年代末,要想從網際網路上獲得有價值的信息,就必須知道如何使用 gopher、Archie、Veronica以及其它類似程式。
大多數網際網路用戶只限於搜尋全球資訊網,所以本文只討論面向
網頁內容的
搜尋引擎。
工作原理
步驟原理
搜尋引擎在有能力告訴你檔案或文檔存儲在何處之前,必須先找到它們。為了在現有的數億
網頁中找到信息,搜尋引擎使用了一種特殊的
軟體機器人,稱之為
蜘蛛程式,以此生成在網站上查詢到的詞語列表。蜘蛛程式建立詞語列表的過程被稱為
爬網。(將網際網路的一部分稱為網路有些缺點——大量工具以蜘蛛命名就是其一。)為了建立並維護一份有用的詞語列表,搜尋引擎的蜘蛛程式需要遊歷大量網頁。
如何爬尋
通常起點是那些
訪問量很大的
伺服器和熱門
網頁。
蜘蛛程式從一個很受歡迎的網站開始,檢索網頁上的詞語並追蹤在該網站上找到的每個連結。這樣,蜘蛛程式迅速開始了旅行,爬遍網上絕大多數經常訪問的網站。
谷歌實例
谷歌起始
Google的前身是一個
學術搜尋引擎。在介紹該系統開發過程的論文中,
google創始人
塞吉·布林(Sergey Brin)和勞倫斯·佩奇(Lawrence Page)舉例說明了他們的
蜘蛛程式工作得有多快。他們最初開發的系統使用多個蜘蛛程式——通常是三個。每個蜘蛛程式可以同時打開300個連結。最多可以同時使用四個蜘蛛程式,此時該系統每秒可以遊歷100多個
網頁,生成大約600KB的數據。
運行原理
訪問記錄
網頁中的詞語 詞語所在位置 出現在標題、副標題、元標記以及其他相對重要的位置的詞語,會被記錄下來,這些詞語往往是日後用戶搜尋時經常使用的。Google蜘蛛程式的設計旨在檢索網頁中的每一個重要單詞(對於英文來說,還要濾掉冠詞a、an和the等)。其他蜘蛛程式採用不同的方法。
這些方法通常是為了儘量加快蜘蛛程式的速度,或使用戶可以更有效地進行搜尋,或二者兼而有之。例如,有些蜘蛛程式會追蹤標題、副標題和連結中的詞語,以及網頁中最常用的100個詞和文章前20行中的每一個詞。據說
Lycos就是使用這種方法
爬網的。
其他實例
如比
AltaVista,則反其道而行之,檢索
網頁中的每一個字,包括a、an、the以及其他“不重要”的詞。人們完善這種方法的幹勁從未減弱,而另一些系統則通過其它方法與之抗衡。比如關注網頁的不可見部分,即
元標記。
元標記
定義
元標記允許
網頁所有者來設定檢索網頁的關鍵字或概念。這很有用,特別是在網頁中的詞語有多個含義的時候——元標記可以引導搜尋引擎在這些詞的幾種可能含義中選擇正確的一項。
引起問題
過分依賴元標記有一個危險:粗心或不負責任的
網頁所有者會添加一些對應熱門話題的元標記,但是與網頁實際內容沒有任何關係。為了防止此種事情發生,
蜘蛛程式會比對元標記和網頁內容,剔除那些與網頁詞語不符的元標記。
上述方法均基於一個假設,也就是網頁所有者希望自己的網頁被納入搜尋引擎的
搜尋列表。但有些情況下,網頁所有者並不希望它們出現在主流搜尋引擎中,或是不希望蜘蛛程式訪問網頁。比如,假設有一款網頁遊戲,每當部分頁面被顯示或者新連結被點擊時,遊戲就會生成新的
動態頁面。如果
網路蜘蛛程式進入網頁,繼而開始追蹤所有新網頁的連結,遊戲很可能將這些操作錯認為是由一名操作速度極快的玩家執行的,從而失去控制。為了避免此類情況,人們制定了一套
拒絕蜘蛛協定。該協定如果嵌入
網頁開頭的元標記部分,就會告訴
蜘蛛程式遠離該頁面——既不要檢索網頁上的詞語,也不要試圖追蹤網頁上的連結。
蒐集方法
一旦
蜘蛛程式完成了
網頁信息收集工作(我們應當注意,這是一項永遠不可能真正完成的工作——網頁不斷更新的特性意味著蜘蛛程式需要不斷
爬網),搜尋引擎就必須以一種有效方式存儲這些信息。要讓收集到的數據可供用戶使用,涉及兩個關鍵環節:
索引方法
在最簡單的情況下,搜尋引擎只需存儲詞語和詞語所在地址。實際上,這樣做會限制搜尋引擎的用途,因為這種方式無法區別詞語在
網頁中是被重點使用,還是略一提及,也無法區別詞語是使用一次還是多次,或該網頁上是否含有其它包括該
關鍵字的網頁的連結。換句話說,這樣做將無法建立
排名表,無法把最有用的網頁放在查詢結果列表的頂端。
為了獲得更多有用信息,大多數搜尋引擎存儲的信息不僅僅是詞語和
網址,還可能存儲著該字在網頁中出現的次數。搜尋引擎可能會為每個詞條指定一個
權重,按照詞語出現在文檔開頭、網頁副標題、連結、元標記或標題的順序,權重依次增大。各商業搜尋引擎指定索引中詞語權重的公式有所不同。這從一個側面解釋了為什麼使用不同搜尋引擎來搜尋相同關鍵字,卻會產生不同的搜尋結果列表,
網頁排列順序也有所不同。
信息組合
如果忽略搜尋引擎存儲的額外信息的準確組合,將這些數據進行
編碼可以節省存儲空間。比如,最初的
Google論文描述了使用兩個
位元組(每個位元組8
比特)來存儲權重信息——單詞是不是大寫、字號大小、位置以及其他用來為數據確定級別的信息。每個因素大概占據兩位元組中的兩三個比特(8比特=1位元組)。因此,大量信息便能以一種
壓縮率極高的方式存儲下來。信息被壓縮之後,就可以建立索引了。
建立索引
索引的唯一目的是儘快找到信息。有好幾種方法可以建立索引,但是最有效的方法是建立
散列表。通過
散列法,運用公式給每個詞賦予一個數值。該公式可以把詞條平均分配給預定數目的分區。此種數值分配不同於根據字母表分配,這是散列表的有效性的關鍵所在。
在英語中,以某些字母開頭的單詞較多,而以其他字母開頭的單詞較少。例如,您會發現,字典的M部就比X部厚得多。這種不均衡意味著查找一個以“常見”字母開頭的單詞,要比查找不常見字母開頭的單詞花費更多時間。散列法平衡了這種區別,並且縮短了查找某一詞條的平均時間。它還將索引和實際詞條分開。散列表中含有經過
散列函式轉換生成的數字和一個指向實際數據的指針,(這樣)不論什麼方式,只要它讓實際數據最有效地存儲起來,實際數據都可以用這種方式得到分類排序。通過高效的索引和有效的存儲方式,即使用戶進行了一次複雜的查詢,也能迅速查找到結果。
通過索引進行搜尋需要用戶進行一次查詢,並通過搜尋引擎提交。查詢可以相當簡單,最少僅需一個詞。建立比較複雜的查詢則需要使用布爾運算符來細化和拓展搜尋項。
布爾運算
AND
AND(與)——以“AND”相連的若干搜尋項必須全部出現在
網頁或文檔中。有些搜尋引擎使用運算符號“+”來代替“AND”。
OR(或)——以“OR”相連的搜尋項必須至少有一項出現在網頁或文檔中。
NOT
NOT(非)——“NOT”之後的搜尋項不能出現在
網頁或文檔中。有些搜尋引擎使用運算符號“-”來代替“NOT”。
FOLLOWED BY(跟隨)——某一搜尋項必須緊隨另一搜尋項。
NEAR(臨近)——某一搜尋項和另一搜尋項的距離必須小於特定詞數。
引號——引號內的詞語應被看作一個完整短語,出現在網頁或文檔中。
引擎組成
搜尋引擎一般由搜尋器、索引器、檢索器和
用戶接口四個部分組成:
搜尋器
其功能是在網際網路中漫遊,發現和蒐集信息;
索引器
其功能是理解搜尋器所搜尋到的信息,從中抽取出索引項,用於表示文檔以及生成文檔庫的索引表;
檢索器
其功能是根據用戶的查詢在
索引庫中快速檢索文檔,進行
相關度評價,對將要輸出的結果排序,並能按用戶的查詢需求合理反饋信息;
用戶接口
其作用是接納用戶查詢、顯示查詢結果、提供個性化查詢項。
robots
robots協定(也稱為爬蟲協定、爬蟲規則、機器人協定等)也就是
robots.txt,網站通過
robots協定告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。
Robots協定是網站國際網際網路界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜尋引擎自覺遵守。一些病毒如
malware(馬威爾病毒)經常通過忽略robots協定的方式,獲取網站後台數據和個人信息。
發展趨勢
自然搜尋
人們的日常交流是使用自然語言而非關鍵(字)詞,因為關鍵(字)詞表達的意思和意圖不完整不準確,反映在搜尋結果上的缺陷是返回信息過多。基於
自然語言搜尋,符合人們的語言習慣,像人與人之間的交流一樣輕鬆、直接、方便,這無疑給用戶提供了巨大的便利。
智慧型搜尋
基於關鍵字搜尋是符號匹配信息,並不能處理關鍵字本身的語義,這就是基於關鍵字搜尋存在一系列缺陷的原因。從這個層面上講,
搜尋引擎的發展趨勢是,把“語言計算技術和人工智慧融合,讓計算機返回的結果富有針對性,將準確信息顯示在前兩三項的搜尋結果之中。讓計算機具有人的智慧型和邏輯分析能力,能夠理解自然語言表達的語義,使搜尋結果與用戶需求實現更精準的匹配,以解決問題的形式把結果返回給用戶。