搜索引擎工作原理

搜索引擎的工作過程大體可以分爲三個階段:
1.對網頁進行抓取建庫
搜索引擎蜘蛛通過抓取頁面上的鏈接訪問其他網頁,將獲得的HTML代碼存入數據庫
2.預處理
索引程序對抓取來的頁面數據進行文字提取、中文分詞、索引等處理,爲後面排名程序使用時做準備。
3.給搜索結果進行排名
用戶輸入關鍵詞後,排名程序調用索引庫數據,計算數據和關鍵詞的相關性,然後按照一定格式生成搜索結果頁面。

↑用到了大概三個程序,蜘蛛、索引程序、排名程序

對網頁進行爬行、抓取、建庫

如果我們要從一個頁面進入另一個頁面,我們需要在頁面上點擊這個超鏈接跳轉到新的頁面,這個鏈接指向另一個網頁,相當於這個網頁的入口
clipboard.png

或者如果我們知道這個網頁的url地址,就算我們沒有在頁面上看到鏈接到該網頁的可點擊的超鏈接,也可以通過在地址欄輸入url地址轉到該頁面
clipboard.png

當我們在一個網站發佈了自己的文章,這篇文章會產生一個新的獨一無二的url地址,當人們點擊這個地址,它不會跳轉到其他人寫的文章頁面,而是你寫的特定的那一篇。
可以看出,所有頁面,都會產生一個url地址使我們可以訪問它。

整個互聯網是由相互鏈接的頁面組成的,如果一個網頁,沒有任何一個頁面鏈接它,我們也不知道這個網頁的地址,就算這個頁面真實存在,它也會像一個孤島一樣,我們無法訪問到這個頁面。

日常生活中我們有多個搜索引擎可以使用,比如百度、谷歌、搜狗、bing等。
不同的搜索引擎就算查詢同一個內容返回出來的結果都不一樣,這是因爲各個公司給內容進行排序的計算方式都是不一樣的,哪個頁面該排到第一頁/哪個網頁該排到最後一頁/哪個網頁根本就不應該展示出來都是有他們公司自己的評判標準,這些排名算法具體的內容基本都不會對外公開,避免被其他公司搜索引擎公司知道,因爲排名算法是每個搜索引擎公司的核心競爭力。

爲什麼排名算法是每個搜索引擎公司的核心競爭力?

一般人們都會看哪個搜索引擎搜索出來的結果更符合TA自己的需求(相關性更高)就會選擇長期使用哪一個。
比如,你在搜索輸入框裏輸入【空調】兩個字想查詢關於空調的信息,結果搜索結果頁給你返回的內容第一頁竟然是一些電視機/馬桶/衣櫃之類的銷售鏈接,這樣相關性不高的網頁越多,對你的使用體驗就越差,最好的體驗是,你搜索【空調】後,返回的頁面裏全是關於空調的信息,這樣節約了你獲取信息的時間成本,使你更方便的獲取想要的資訊。

而排名算法就是爲了讓返回的結果儘量符合用戶查詢的內容的一種算法,他會對網頁進行排名,把覺得對用戶最有價值的網頁排在前面,比如第一頁第一個,用戶能最快的看到這個網頁,把相關性較差不重要的網頁排在後面。把那些沒有用的沒有價值的頁面直接不展示出來,經過對這些網頁的排序,讓用戶儘量在只看第一頁的情況下就能找到自己想要的資訊,解決掉自己的問題。

所以搜索引擎公司只要能對網頁進行合理的排序,帶給用戶最大的方便,讓用戶感覺到返回的內容都很精準,正好是他們想要的內容,那麼用戶就會持續使用這個搜索引擎,所以如何對這些網頁進行排序的計算方式就是每個搜索引擎公司的公司機密了。

爬行抓取搜索引擎工作的第一步,目的是完成數據收集的任務。

當用戶在搜索框輸入想查詢的內容後,所有展示出來的網頁都是需要先經過搜索引擎的收集才能展示出來的,只有收集了,才能通過分析網頁中的內容,對這些網頁的價值和相關性進行一個判斷,經過對網頁的排序之後再返回給用戶,用戶在搜索結果頁上看到的所有網頁,都是已經被搜索引擎收集進數據庫中的網頁。

而那些互聯網上沒有被搜索引擎收集到的網頁(搜索引擎不是什麼網頁都會放進數據庫,每個搜索引擎都有自己的一個標準,就是什麼樣的網頁纔會被收集到數據庫中。就像人類吃東西一樣,只吃自己認爲該吃的食物),就變成了永遠無法訪問的孤魂野鬼。

注:網頁和網站的區別需要注意,蜘蛛在判斷需不需要收集進索引數據庫的是以網頁爲單位的。

比如整個淘寶是一個網站,但是淘寶中某一個商品的詳情頁面纔算網頁,還比如你現在所看的這篇文章所在的這一個頁面纔算網頁

所以,整個淘寶網站的頁面那麼多,蜘蛛在收集網頁時,就算收集了A商品那頁詳情頁面,但不代表B商品詳情頁面也被收集進索引數據庫了,蜘蛛會對每個頁面進行評判,只有該頁面到達他的標準了,認爲可以收集到索引數據庫裏了,纔會把這個頁面添加進去,而不是它認爲淘寶這個網站很有價值,就把整個網站裏所有頁面全部收錄進去了,SEO裏有個概念叫做收錄率,指的是頁面的收錄率,而不是網站的收錄率。

蜘蛛
搜索引擎用來爬行和訪問頁面的程序叫做蜘蛛/爬蟲(spider),或機器人(bot)。

蜘蛛訪問網站頁面的流程和人們在瀏覽器上訪問頁面的流程差不多,蜘蛛訪問頁面時,會發出頁面訪問請求,服務器會返回HTML代碼,蜘蛛把收到的HTML代碼存入原始頁面數據庫

互聯網上的頁面這麼多,爲了提高爬行和抓取的速度,搜索引擎會同時使用多個蜘蛛對頁面進行爬行。

理論上來說,互聯網上的所有頁面(這裏指的是通過超鏈接互聯鏈接在一起的頁面,而不是那種雖然這個頁面存在,但是沒有任何網頁用超鏈接指向他),蜘蛛都可以沿着頁面上的超鏈接將所有頁面爬行一遍,但是蜘蛛不會這麼做,蜘蛛的時間有限,它會用效率最高的方式找到互聯網上它覺得最有價值的網頁。
如果一個網站的頁面普遍質量較低,蜘蛛就會認爲這是一個低質網站,讓用戶閱讀這類沒有價值的網頁是沒有必要的,對於這類網頁,它會減少爬行的頻率,將重點放在其他質量更高的網站,去其他更有價值的網站上收集網頁存入數據庫。

但是蜘蛛不是全能,它也有評判錯誤的時候,比如蜘蛛不會收集空短頁面,也就是內容空洞毫無營養,主體內容又短的頁面,蜘蛛不會浪費數據庫的空間放入這些網頁。

但是一個頁面究竟是不是真正的無價值網頁,蜘蛛判斷成功的正確率並不是100%,就像一個登錄驗證網頁,確實沒有比那些傳遞知識的網頁更有價值,但是這是大部分網站一個必不可少的一個頁面,嚴格來說並不是低質頁面,但是如果蜘蛛爬行到了這個頁面,它並不理解人類眼中的驗證頁面是一個怎樣的存在,他只覺得,內容短,沒什麼豐富的內容,好,那就是無價值的網頁了,它就像有一個專門用來記錄的小本本一樣,嗯,A網站,有一個低質頁面,給這個網站評價好還是不好我還要在考慮一下,如果這樣的低質頁面多了,蜘蛛就會覺得你的網站整體質量較低,慢慢的就不愛到你網站上抓取網頁了。

所以爲了避免這種情況,不讓蜘蛛抓取這些網頁是最好的辦法,我們可以在項目根目錄創建一個txt文件,這個文件叫什麼是有約定俗成的,文件名必須爲 robots.txt,我們在文件裏面規定好蜘蛛可以爬行/不能爬行哪些網頁就行(具體寫法可以百度)。

當蜘蛛訪問任何一個網站的時候,第一件事就是先訪問這個網站根目錄下的robots.txt文件,如果文件裏說了禁止讓蜘蛛抓取XX文件/XX目錄,蜘蛛就會按照文件裏規定的那樣,只抓取可以抓取的頁面。

蜘蛛的分類
每個搜索引擎公司都有自己的蜘蛛,這些蜘蛛喜好不一,喜歡抓取什麼類型的網頁要看他們的主人,也就是要看搜索引擎公司他們的想法,雖然這些蜘蛛統稱爲蜘蛛,但他們屬於不同的主人,當然名字肯定是不一樣的。

在日誌文件中可以看到有哪些公司的蜘蛛來訪問過網站(user-agent那個)

蜘蛛主要分爲下面幾個:

  • 百度蜘蛛 Baiduspider
  • 谷歌蜘蛛 Googlebot
  • 有道蜘蛛 YodaoBot
理論上來說,隨便找一個頁面,順着這個頁面,蜘蛛可以將互聯網上所有的頁面都爬一遍

實際上這樣確實是可行的(除去那些沒有被任何一個網頁所指向的頁面),而蜘蛛是如何做到的呢?

比如,蜘蛛先從A頁面開始,它爬行到A頁面上,它可以獲取到A頁面中所有的超鏈接,蜘蛛再順着這個鏈接進入到鏈接所指向的頁面,再獲取到這個頁面上所有的超鏈接進行爬行抓取,這樣一來,所有用超鏈接所關聯上的網頁便可以被蜘蛛都爬行一遍。

蜘蛛在爬行時,也是有自己的爬行策略的,就像吃西瓜,把整個西瓜切一半切成一個半圓體,我們選擇吃西瓜的方式可以深度優先,隨便從中間還是邊緣開始吃都行,比如先從中間吃,西瓜中間底下全部挖乾淨了再圍着中間的圓圈慢慢往外面擴散。
clipboard.png

或者廣度優先,從中間或者是邊緣隨便哪裏開始都行,把表面一層挖完了西瓜再進行下一個深度的挖取。

蜘蛛的爬行策略
蜘蛛的爬行策略和挖西瓜一樣,都是兩種方式

  • 深度優先
  • 廣度優先

深度優先如下圖
clipboard.png

蜘蛛先從A頁面開始爬行,發現該頁面總共有3個超鏈接,A1、B1、XX,蜘蛛選擇先從A1頁面爬行下去,它在A1頁面發現了一個唯一的超鏈接A2,便沿着A2向下,以此類推,等爬到最底下,也就是A4頁面,A4整個頁面上沒有任何超鏈接,再也無法往下爬行了,它便返回到B1開始爬行,這就是深度優先。

廣度優先如下
clipboard.png
這次這是一個利用廣度優先策略的蜘蛛,它先從A頁面出發,現在A頁面有3個鏈接,A1、B1、C1,它會先把A1、B1、C1先爬一遍,也就是第一層發現的超鏈接全部爬行完,然後再進入第二層,也就是A1頁面。把A1頁面中所有的超鏈接全部爬行一遍,保證廣度上全部鏈接是都完成爬行了的。

無論是深度優先還是廣度優先,蜘蛛都可以通過這兩個策略完成對整個互聯網頁面的爬行。
當然,由於蜘蛛的帶寬資源和時間有限的問題,蜘蛛不會選擇爬完所有頁面,它實際收集到的頁面知識互聯網的一小部分,在條件限制的情況下,蜘蛛通常會深度優先和廣度優先混合使用,廣度優先保證了儘可能照顧到多的網站,而廣度優先保證了儘可能照顧到一部分網站中的內頁。

吸引蜘蛛抓取頁面
可以看出,在實際情況中,蜘蛛不會爬行、抓取互聯網上所有的頁面,既然如此,蜘蛛所要做的就是儘量抓取重要頁面,而SEO人員要做的,就是吸引蜘蛛的注意,讓蜘蛛更多的抓取自己家網站的頁面。

對於蜘蛛來說,頁面擁有哪些特徵會被看作是重要頁面呢,主要有以下這幾方面因素:
1.網站和頁面權重
質量高,資格老的網站被認爲權重較高,這種網站上頁面的爬行深度也會比較高,所以這種網站網頁被收錄的機會會更多。

2.頁面更新度
如A網頁的數據之前在蜘蛛爬行後已經被保存在數據庫中了,當蜘蛛第二次爬行A網頁時,會將A網頁此時的數據和數據庫中的數據進行對比,如果蜘蛛發現A網頁的內容更新了,就會認爲這個網頁更新頻率多,蜘蛛抓取這個頁面的頻率也會更加頻繁,如果頁面和上次儲存的數據完全一樣,就說明頁面是沒更新,蜘蛛就會減少自己爬行該頁面的頻率。

3.高質量的外鏈
張三是班上公認的人品好爲人公正的學霸,李四是班上惹人討厭最愛撒謊的學生,張三給大家說王五這個人真的很聰明爲人也很善良,其他同學都會認爲王五肯定是這樣,李四給其他同學說王五這個人很好,其他同學基本不會相信李四的鬼話。

同樣一句話,從不同人的嘴裏說出來,造成的結果、影響都不一樣。

鏈接的引用也是這樣,比如在一個蜘蛛認爲的高質量頁面中,頁面在最後引用了一個鏈接,指向你的頁面,那麼這個高質量頁面的引用,在蜘蛛判斷你的網頁是否是高質量網頁時,也會產生一定的影響,被高質量網頁引用的多了(超級多的大佬誇你人好),那麼蜘蛛在判斷你頁面時產生的影響也就更大(同學也覺得你就是人好)。

4.與首頁的距離
一般來說自己網站被其他網站引用最多的頁面就是首頁,所以它的權重相比來說是最高的,比如A頁面是A網站的首頁,可以得出的結論是,離A網頁更進的頁面,頁面權重也容易更高,比如A頁面上的超鏈接更容易被蜘蛛爬行,更容易獲得蜘蛛的抓取,那些沒被蜘蛛發現的網頁,權重自然就是0。

還有一點比較重要的是,蜘蛛在爬行頁面時會進行一定程度的複製檢測,也就是當前被爬行的頁面的內容,是否和已經保存的數據有重合(當頁面內容爲轉載/不當抄襲行爲時就會被蜘蛛檢測出來),如果一個權重很低的網站上有大量轉載/抄襲行爲,蜘蛛很可能不會再繼續爬行。

之所以要這麼做也是爲了用戶的體驗,如果沒有這些去重步驟,當用戶想要搜索一些內容時,發現返回的結果全都是一模一樣的內容,會大大影響用戶的體驗,最後導致的結果就是這個搜索引擎絕對不會有人再用了,所以爲了用戶使用的便利,也是爲了自己公司的正常發展。

地址庫
互聯網上的網頁這麼多,爲了避免重複爬行和抓取網頁,搜索引擎會建立地址庫,一個是用來記錄已經被發現但還沒有抓取的頁面,一個是已經被抓取過的頁面。

待訪問地址庫(已經發現但沒有抓取)中的地址來源於下面幾種方式:
1.人工錄入的地址
2.蜘蛛抓取頁面後,從HTML代碼中獲取新的鏈接地址,和這兩個地址庫中的數據進行對比,如果沒有,就把地址存入待訪問地址庫。
3.站長(網站負責人)提交上去的想讓搜索引擎抓取的頁面。(一般這種效果不大)

蜘蛛按照重要性從待訪問地址庫中提取URL,訪問並抓取頁面,然後把這個URL地址從待訪問地址庫中刪除,放進已訪問地址庫中。

文件存儲
蜘蛛會將抓取的數據存入原始頁面數據庫。
存入的數據和服務器返回給蜘蛛的HTML內容是一樣的,每個頁面存在數據庫裏時都有自己的一個獨一無二的文件編號。

預處理

我們去商場買菜時,會看到蔬菜保險櫃裏的這些蔬菜被擺放的整整齊齊,這裏舉的例子是那些用保鮮膜包好有經過包裝的蔬菜。
clipboard.png

最後呈現在顧客面前的就是上面這張圖那樣,包裝完好,按照不同的分類擺放有序,顧客一眼就能很清楚的看到每個區域分別是什麼蔬菜。

在最終完成這個結果之前,整個流程大概也是三個步驟:
1.選出可以售賣的蔬菜
從一堆蔬菜中,選出可以拿去售賣的蔬菜。

2.預處理
此時你面前擺放的就是全部可以拿去售賣的蔬菜了,但是如果,今天就要把這些蔬菜放到蔬菜保險櫃中的話,你今天才開始對這些蔬菜進行整理會浪費大量的時間(給蔬菜進行包裝等),說不定顧客來了蔬菜還沒整理好。
所以你的解決方法是,提前將這些可以拿去售賣的蔬菜提前包裝好,存放在倉庫裏,等保險櫃中的蔬菜缺少了需要補貨時,花個幾分鐘時間跑去倉庫把蔬菜拿出來再擺放再貨架上就行了。(我猜的,具體商場裏的流程是怎麼樣的我也不知道,爲了方便後續的理解用生活上的例子進行說明效果會更好)

3.擺放上保險櫃
也就是上面最後一段內容那樣,當需要補貨時,從倉庫裏拿出包裝好的蔬菜,按照蔬菜的類別擺放到合適的位置就可以了,這個就是最後的排序步驟。

回到搜索引擎的工作流程中,這個預處理的步驟就和上面商場預處理步驟的作用一樣。

當蜘蛛完成數據收集後,就會進入到這個步驟。

蜘蛛所完成的工作,就是在收集了數據後將數據(HTML)存入原始頁面數據庫。
而這些數據,不是用戶在搜索後,直接用來進行排序並展示在搜索結果頁的數據。

原始頁面數據庫中的頁面數量都是在數萬億級別以上,如果在用戶搜索後對原始頁面數據庫中的數據進行實時排序,讓排名程序(每個步驟所使用的程序不一樣,收集數據的程序叫蜘蛛,排名時所用的程序是排名程序)分析每個頁面數據與用戶想搜索的內容的相關性,計算量太大,會浪費太多時間,不可能在一兩秒內返回排名結果。

因此,我們需要先將原始頁面數據庫中的數據進行預處理,爲最後的排名做好準備。

提取文字
我們存入原始頁面數據庫中的,是HTML代碼,而HTML代碼中,不僅有用戶在頁面上直接可以看到的文字內容,還有其他例如js,AJAX等這類搜索引擎無法用於排名的內容。

首先要做的,就是從HTML文件中去除這些無法解析的內容,提取出可以進行排名處理步驟的文字內容

比如下面這段代碼

<html>
<head>
    <meta charset="utf-8">
    <meta name="description" content="這是一個描述內容"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
    <link rel="icon" type="image/png" sizes="32x32" href="//static001.infoq.cn/static/infoq/www/img/InfoQ-share-icon2.jpg">
    <title>軟件工程師需要了解的搜索引擎知識</title>
    <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
    <script type="text/x-mathjax-config">
      MathJax.Hub.Config({
        showProcessingMessages: false,
        messageStyle: "none",
        tex2jax: {
          inlineMath: [['$','$'], ['\\(','\\)']],
          displayMath: [ ["$$","$$"] ],
          skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code', 'a']
        }
      });
      MathJax.Hub.Register.MessageHook("End Process", function (message) {
        var eve = new Event('mathjaxfini')
        window.dispatchEvent(eve)
      })
    </script>
</head>
<body>
<div id="app">hi</div>
<img alt="Google" src="/images/test.png" 
</body>
</html>

可以看出整個HTML中,真正屬於文字內容的信息只有兩句

這是一個描述內容
軟件工程師需要了解的搜索引擎知識
hi
Google

搜索引擎最終提取出來的信息就是這四句,用於排名的文字也是這四句。
可以提取出來的文字內容大概就是,Meta標籤中的文字、img標籤alt屬性中的文字、Flash文件的替代文字、鏈接錨文字等。

中文分詞
分詞是中文搜索引擎特有的步驟,搜索引擎存儲/處理頁面/用戶搜索時都是以爲基礎的。

I'm fine, and you?

中文和英文等語言單詞不同,在使用英文時各個單詞會有空格分隔,搜索引擎可以直接把每一個句子劃分爲多個英文單詞的集合。而對中文來說,詞彙和詞彙之間是沒有任何分隔符可以對各詞彙進行分隔的。

比如這句話裏的詞就是連接在一起的

對於這種情況,搜索引擎首先需要分辨哪幾個字組成一個詞,如 我喜歡吃【水果】,或者哪些字本身就是一個詞,如 這裏有【水】,

再如下面這句話

你好,這是一篇關於搜索引擎的文章

搜索引擎會將這一段文字拆解成一個個詞彙,大概如下

你好
這是
一篇
關於
搜索引擎
的
文章

搜索引擎將這段文字拆解成了7個詞彙(我瞎猜的,具體多少個我也不知道,每個搜索引擎分詞的方法都不一樣)

中文分詞的方法基本上有兩種:

  • 基於詞典匹配
  • 基於統計

1.基於詞典匹配
將需要分析的一段漢字與一個時間創建好的詞典中的詞條進行匹配,如果在這段漢字中掃描到詞典中已有的詞條則匹配成功。
這種匹配方式最簡單,但匹配的正確程序取決於這個詞典的完整性和更新情況。

2.基於統計
一般是通過機器學習完成,通過對海量網頁上的文字樣本進行分析,計算出字與字相鄰出現的統計概率,幾個字相鄰出現越多,就越可能形成一個詞。
這種優勢是對新出現的詞反應更快速。

實際使用中的分詞系統都是兩種方法同時混合使用。

去停止詞
不管是英文還是中文,頁面中都會有一些出現頻率很高的&對內容沒有任何影響的詞,如中文的【的】、【啊】、【哈】之類,這些詞被稱爲停止詞。
英文中常見的停止詞有[the]/[a]/[an]等。

搜索引擎會去掉這些停止詞,使數據主題更突出,減少無謂的計算量。

去掉噪聲詞
大部分頁面裏有這麼一部分內容對頁面主題沒什麼貢獻,比如A頁面的內容是一篇關於SEO優化的文章,關鍵詞是SEO,但是除了講解SEO這個內容的主體內容外,共同組成這個頁面的還有例如頁眉頁腳廣告等區域
clipboard.png

在這些部分出現的詞語可能和頁面內容本身的關鍵詞並不相關。
比如導航欄中如何出現【歷史】這個詞,導航欄上想要表達的實際是歷史記錄之類的意思,搜索引擎可能會把他誤以爲是XX國家歷史,XX時代歷史之類這種層面的【歷史】,搜索引擎所理解的和頁面本身內容想表達的完全不相關,所以這些區域都屬於噪聲,在搜索引擎分析一個頁面的時候,它們只會對頁面主題起到分散作用。

搜索引擎的排名程序在對數據進行排名時不能參考這些噪聲內容,我們在預處理階段就需要把這些噪聲時別出來並消除他們。

消除噪聲的方法是根據HTML的標籤對頁面進行分塊,如頁眉是header標籤,頁腳是footer標籤等等,去除掉這些區域後,剩下的纔是頁面主體內容。

去重
也就是去掉重複的網頁,同一篇文章經常會重複在不同網站/同一個網站的不同網址上。爲了用戶的體驗,去重步驟是必須的,搜索引擎會對頁面進行識別&刪除重複內容,這個過程稱爲蛆蟲和

去重的方法是先從頁面主體內容中選取最有代表性的一部分關鍵詞(經常是出現頻率最高的關鍵詞,由於之前已經有了去停止詞的步驟,因此在這時出現頻率最高的關鍵詞可能就真的是整個頁面的關鍵詞了),然後計算這些關鍵詞的數字指紋。

通常我們在頁面中選取10個關鍵詞就可以達到比較高的計算準確性了。

典型的指紋計算方法如MD5算法(信息摘要算法第五版)。這類指紋算法的特點是,輸入(也就是上面提取出來的關鍵詞)只要有任何微小的變化,都會導致計算出的指紋有很大差距。

比如我們用兩個數相乘,第一組和第二組的不同僅僅是第一個數字 0.001 的差別,最終生成的結果卻千差萬別。
clipboard.png

瞭解了搜索引擎的去重算法後,就會發現那些在文章發佈者眼裏的原創內容實際對搜索引擎來說就是非原創,比如簡單的增加/刪除【的】【地】等這些去停止詞、調換段落順序、混合不同文章等操作,在搜索引擎進行去重算法後,都會被判斷爲非原創內容,因爲這些操作並不會改變文章的關鍵詞。
(比如我寫的這篇筆記裏的一些段落就是‘借鑑’了一下,我是從書裏看的不是在網頁上直接瀏覽的,如果搜索引擎在對我這篇文章進行文字提取、分詞、消噪、去重後,發現剩下的關鍵詞和已收錄的某個網頁數據的內容都匹配上了,就會認爲我是僞原創甚至非原創,最終影響的就是我這篇文章在搜索引擎工作原理這個關鍵詞上的排名)

正向索引
正向索引可以簡稱爲索引。
經過上述各步驟(提取、分詞、消噪、去重)後,搜索引擎最終得到的就是獨特的、能反映頁面主體內容的、以詞爲單位的內容。

接下來由搜索引擎的索引程序提取關鍵詞,按照分詞程序劃分好的詞,把頁面轉換爲一個由關鍵詞組成的集合,同時還需要記錄每一個關鍵詞在頁面上的出現頻率、出現次數、格式(如是出現在標題標籤、黑體、h標籤、還是錨文字等)、位置(如頁面第一段文字等)。

搜索引擎的索引程序會將頁面和關鍵詞形成的詞表結構存儲進索引庫。
簡化的索引詞表形式如圖
clipboard.png

每個文件都對應一個文件ID,文件內容被表示成一串關鍵詞的集合。
實際上在搜索引擎索引庫中,關鍵詞也已經轉換爲關鍵詞ID,這樣的數據結構被稱爲正向索引。

倒排索引
正向索引不能直接用於排名,假設用戶搜索關鍵詞【2】,如果只存在正向索引,排名程序需要掃描所有索引庫中的文件,找出包含關鍵詞【2】的文件,再進行相關性計算。
這樣的計算量無法滿足實時返回排名結果的要求。

我們可以提前對所有關鍵詞進行分類,搜索引擎會將正向索引數據庫重新構造爲倒排索引,把文件對應到關鍵詞的映射轉換爲關鍵詞到文件的映射,如下圖
clipboard.png

在倒排索引中關鍵詞是主鍵,每個關鍵詞都對應着一系列文件,比如上圖第一排右側顯示出來的文件,都是包含了關鍵詞1的文件。

這樣當用戶搜索某個關鍵詞時,排序程序在倒排索引中定位到這個關鍵詞,就可以馬上找出所有包含這個關鍵詞的文件。

給搜索結果進行排名

經過前面的蜘蛛抓取頁面,對數據預處理&索引程序計算得到倒排索引後,搜索引擎就準備好可以隨時處理用戶搜索了。

用戶在搜索框輸入想要查詢的內容後,排名程序調用索引庫的數據,計算排名後將內容展示在搜索結果頁中。

搜索詞處理
搜索引擎接收到用戶輸入的搜索詞後,需要對搜索詞做一些處理,然後才進入排名過程。

搜索詞處理過程包括如下幾個方面:
1.中文分詞
和之前預處理步驟中的分詞流程一樣,搜索詞也必須進行中文分詞,將查詢字符串轉換爲以詞爲單位的關鍵詞組合。
分詞原理和頁面分詞時相同。

2.去停止詞
同上。

3.指令處理
上面兩個步驟完成後,搜索引擎對剩下的內容的默認處理方式是在關鍵詞之間使用【與】邏輯。

比如用戶在搜索框中輸入【減肥的方法】,經過分詞和去停止詞後,剩下的關鍵詞爲【減肥】、【方法】,搜索引擎排序時默認認爲,用戶想要查詢的內容既包含【減肥】,也!注意這個也!!!也包含【方法】!
只包含【減肥】不包含【方法】,或者只包含【方法】不包含【減肥】的頁面,都會被認爲是不符合搜索條件的。

文件匹配
搜索詞經過上面的處理後,搜索引擎得到的是以詞爲單位的關鍵詞集合。

進入的下一個階段-文件匹配階段,就是找出含有所有關鍵詞的文件。

在索引部分提到的倒排索引使得文件匹配能夠快速完成,如下圖
clipboard.png

假設用戶搜索【關鍵詞2 關鍵詞7】,排名程序只要在倒排索引中找到【關鍵詞2】和【關鍵詞7】這兩個詞,就能找到分別含有這兩個詞的所有頁面文件。
經過簡單計算就能找出既包含【關鍵詞2】,也包含【關鍵詞7】的所有頁面:【文件1】和【文件6】。

初始子集的選擇
找到包含所有關鍵詞的匹配文件後,還不能對這些文件進行相關性計算,因爲在實際情況中,找到的文件經常會有幾十萬幾百萬,甚至上千萬個。要對這麼多文件實時進行相關性計算,需要的時間還是挺長的。

實際上大部分用戶只喜歡查看前面兩頁,也就是前20個結果,後面的真的是懶都懶得翻!

對於google搜索引擎來說,最多隻會給用戶返回1000個搜索結果,如下(100頁,每頁10條結果)
clipboard.png

而百度搜索引擎,最多隻會返回760條結果
clipboard.png

所以搜索引擎只需要計算前1000/760個結果的相關性,就能滿足要求。

由於所有匹配文件都已經具備了最基本的相關性(這些文件都包含所有查詢關鍵詞),搜索引擎會先篩選出1000個頁面權重較高的一個文件,通過對權重的篩選初始化一個子集,再對這個子集中的頁面進行相關性計算。

相關性計算
用權重選出初始子集之後,就是對子集中的頁面計算關鍵詞相關性的步驟了。

計算相關性是排名過程中最重要的一步。

影響相關性的主要因素包括如下幾個方面:
(1)關鍵詞常用程度。
經過分詞後的多個關鍵詞,對整個搜索字符串的意義貢獻並不相同。
越常用的詞對搜索詞的意義貢獻越小,越不常用的詞對搜索詞的意義貢獻越大。舉個例子,假設用戶輸入的搜索詞是“我們冥王星”。“我們”這個詞常用程度非常高,在很多頁面上會出現,它對“我們冥王星”這個搜索詞的辨識程度和意義相關度貢獻就很小。找出那些包含“我們”這個詞的頁面,對搜索排名相關性幾乎沒有什麼影響,有太多頁面包含“我們”這個詞。
而“冥王星”這個詞常用程度就比較低,對“我們冥王星”這個搜索詞的意義貢獻要大得多。那些包含“冥王星”這個詞的頁面,對“我們冥王星”這個搜索詞會更爲相關。
常用詞的極致就是停止詞,對頁面意義完全沒有影響。
所以搜索引擎對搜索詞串中的關鍵詞並不是一視同仁地處理,而是根據常用程度進行加權。不常用的詞加權係數高,常用詞加權係數低,排名算法對不常用的詞給予更多關注。
我們假設A、B兩個頁面都各出現“我們”及“冥王星”兩個詞。但是“我們”這個詞在A頁面出現於普通文字中,“冥王星”這個詞在A頁面出現於標題標籤中。B頁面正相反,“我們”出現在標題標籤中,而“冥王星”出現在普通文字中。那麼針對“我們冥王星”這個搜索詞,A頁面將更相關。
(2)詞頻及密度。一般認爲在沒有關鍵詞堆積的情況下,搜索詞在頁面中出現的次數多,密度越高,說明頁面與搜索詞越相關。當然這只是一個大致規律,實際情況未必如此,所以相關性計算還有其他因素。出現頻率及密度只是因素的一部分,而且重要程度越來越低。
(3)關鍵詞位置及形式。就像在索引部分中提到的,頁面關鍵詞出現的格式和位置都被記錄在索引庫中。關鍵詞出現在比較重要的位置,如標題標籤、黑體、H1等,說明頁面與關鍵詞越相關。這一部分就是頁面SEO所要解決的。
(4)關鍵詞距離。切分後的關鍵詞完整匹配地出現,說明與搜索詞最相關。比如搜索“減肥方法”時,頁面上連續完整出現“減肥方法”四個字是最相關的。如果“減肥”和“方法”兩個詞沒有連續匹配出現,出現的距離近一些,也被搜索引擎認爲相關性稍微大一些。
(5)鏈接分析及頁面權重。除了頁面本身的因素,頁面之間的鏈接和權重關係也影響關鍵詞的相關性,其中最重要的是錨文字。頁面有越多以搜索詞爲錨文字的導入鏈接,說明頁面的相關性越強。
鏈接分析還包括了鏈接源頁面本身的主題、錨文字周圍的文字等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章