搜索引擎的工作原理是什麼?

關鍵字網頁內查詢嗎?為什麼可以達到如此之快的速度?


竟然上二百了。。。哦耶

======================

搜索引擎原理掃盲

什麼是搜索引擎

搜索引擎是一個幫助用戶搜索他們需要內容的計算機程序。換一種說法,搜索引擎把計算機中存儲的信息與用戶的信息需求(information need)相匹配,並把匹配的結果展示出來。

舉個例子:大黃想賣腎買個iphone裝逼,就查一下價格。它在google的搜索框里輸入了」iphone 6 售價「,點擊搜索按鈕。這裡大黃的關鍵詞「iphone 6 售價」就是他的信息需求。Google在展示出搜索結果的那零點幾秒之間,它的程序在巨大的資料庫里按照關鍵字進行了查找,終於計算出所有關於Iphone價格的網頁。

網路爬蟲

互聯網上的信息存儲在無數個伺服器上,任何搜索引擎要想回答用戶的搜索,首先要把網頁存在自己本地的伺服器上,這靠的就是網路爬蟲。它不停的向各種網站發送請求,將所得到的網頁存儲起來。那麼它怎麼知道往哪發送請求呢?通常的做法是利用網頁之間的鏈接從一個網頁出發,提取出指向其他頁面的鏈接,把它們當成將下次要請求的對象,不停重複這個過程。有很多細節要被考慮。比如避免循環鏈接的網頁;解析網頁文檔(通常是html格式,但也有很多其他格式)提取裡邊的鏈接;當鏈接無法打開時對錯誤進行處理等。

其次,如何高效的爬取數據也是一個很大的挑戰。比如需要有成千上萬個爬蟲程序同時爬取數據,高效的將數據存儲起來以便之後分析等。這種分散式程序的實現是一個相當大的工程。

出於安全等因素考慮,很多網路伺服器都有反惡意爬蟲的功能。儘管他們所採取策略各不相同,共同點是他們目標就是盡量只響應真人用戶的請求。但搜索引擎爬蟲通常不需要擔心這一點,因為大部分網站都希望提高自己的搜索排名,歡迎搜索引擎爬蟲到訪。通常Google等搜索引擎都和網站之間有約定,比如在網頁上加個特殊標籤,告訴爬蟲這個網頁是什麼類型,包含什麼信息等,以便幫助爬蟲更好的獲取該網頁內容。

好了,幾乎整個互聯網的內容都被Google的爬蟲獲得了。Google怎麼幫大黃找到賣iphone 6的網頁呢?

索引

互聯網上的數據千千萬萬,大海撈針的搜索怎麼就這麼快?難道Google發明了什麼逆天科技嗎?其實不是。這都要歸功於搜索引擎的索引了。

如果要你在一本書里找一個關鍵詞,應該怎麼找?假設有充足的時間,最暴力的方法就是從頭到尾看一遍,最後總能找到關鍵詞所在的位置。不過這是不是太麻煩了?有更好的方法嗎?

有。索引就是幫助程序進行快速查找的。大家都用過新華字典。字典前邊的按照偏旁部首查字的部分就是索引。搜索引擎也一樣。這裡要介紹第一個最重要的數據結構:反轉列表(inverted list)。

搜索引擎所擁有的文檔中出現的每一個單詞都擁有一個反轉列表。它記錄了這個單詞在多少文檔中出現,分別是哪些文檔,每個文檔分部出現多少次,分別出現在什麼位置等信息。比如Apple這個詞出現在文檔1,7,19,34,102。其中文檔1中出現了3次,分別在位置20,105,700。這樣當搜索Apple時,Goolge就不用遍歷所有的文檔,只需要查找每個單詞對應的反轉列表就可以知道這個詞在哪裡出現了。每一個網路文檔不僅只有文本信息。它還可能包括URL, 文件名,引用等部分。為了提高搜索質量,搜索引擎需要對文檔的不同部分分別處理,構造反轉列表。每一部分的單詞都要被加入到這個詞屬於此部分的反轉列表裡。

索引除了反轉列表還包含了很多各種數據結構。比如維護文檔ID到實際文檔的Document Manager,存儲每個單詞屬性信息的Term Dictionary,存儲文檔屬性的數據結構等等。

創建索引是個巨大工程。首先是對文檔進行解析和處理。互聯網上的文檔格式各種各樣,對每一種格式的文檔都要有一個對應的解析器程序,這樣才能忽略各種奇怪符號,提取出有用內容。每一個解析器的實現都是一個繁瑣且困難的任務。對於解析後的乾淨文檔,許多重要的自然語言處理演算法就要派上用場。以英語為例,需要進行分詞(tokenzation,將一句話分割成一個個單詞),詞幹提取(stemming, 將文本中出現的單詞還原成它的原型),part-of-speech tagging(識別單詞在一句話中的詞性),創建n-gram模型等操作。因為此文為目的是掃盲,就不深入講解每個操作了。此外還需要識別文檔中的命名實體(named entity),比如將「iphone 6」作為一個詞,而不是 「iphone」 一個, 「6」 一個。上述操作生成的信息都要存儲下來。這樣構造反轉列表時就可以知道每個單詞出現的位置,出現個數等信息。

索引生成程序的一個設計目標就是高效。因此它被儘可能地運行在多個機器上。對於每個機器來說,索引程序一邊掃描輸入文檔,一邊在內存中更新索引的數據結構。當內存中得數據大小超過一定閥值時,這些內容被作為一個塊(block)一次性寫入硬碟文件中。當所有文檔掃描結束後這些塊會再被合併成一個大的反轉文件(Inverted file)。因為每一個塊都是排好序的,合併操作是線性的複雜度。因為數據量太大,Google為了快速處理,發明了 MapReduce。它現在是一個應用非常廣泛的分散式計算框架。MapReduce把一個大的任務分割成許多小任務,並下發給多個Mapper程序,Mapper計算好的中間結果會發給多個Reducer程序繼續處理,得到最終結果。這個計算模型允許成千上萬台機器同時運算,從而極大提高了運算效率。

反轉文件要和訪問機制(access mechanism)一起可以工作。訪問機制定義了如何通過一個單詞找到它所對應的反轉列表。大概可以使用兩種數據結構:b-tree 或 Hash table。

為了提高效率,索引中的單詞和文檔都用整形的ID表示而不是字元串。單詞ID和字元串的映射由Term Dictionary維護,它還存儲了關於此單詞一些其他信息,比如在多少文件中出現(document frequency),在文檔中出現概率(inverse document frequency = total document count/document frequency)。這些信息在搜索排序中會提供關鍵信息。

互聯網內容是不停變化的,這必然導致索引不停被更新。然而建立好的索引中,各個單詞的反轉列表是緊密的拼接在一起的,這使得更新變得非常困難。通常搜索引擎會積攢一批文件後才進行索引的更改,並且把索引分成靜態和動態兩個部分。程序把所有更改都寫入動態部分,並且周期性地將動態部分合併進靜態部分中。搜索時,動態和靜態部分都會被訪問。當從索引中刪除一個文檔時,這個文檔中出現的詞對應的反轉列表都會被修改,開銷極大。於是程序加入了「刪除列表(delete lists)」來記錄所有被刪除的文檔。搜索時會查詢刪除列表來把已經被刪除的文檔從搜索結果中移除。當刪除列表足夠大,垃圾回收機制會被觸發,重新生成索引。

搜索

有了索引,就可以快速找到所需內容了。前邊說過搜索引擎根據用戶的信息需求查找匹配的內容。信息需求來自於用戶輸入。如何理解它有很大學問。簡單的說,大黃的搜索詞「iphone 6 售價」會被解析成一個樹形結構:葉子節點就是一個個關鍵詞,非葉子結點是搜索引擎自己定義的查詢運算符(query operator)。比如大黃的輸入可以被解析成 AND(TERM(iphone 6),TERM(售價) )

這裡要說第到二個重要的數據結構:分數列表(score list)。每個單詞同樣對應一個。它記錄這個單詞所出現的文檔擁有的分數。為方便計算,分數通常是一個大於零小於一的浮點數。在後邊介紹結果排序時會講如何給文檔打分。

在進行搜索時,TERM運算符查詢出每一個單詞對應的反轉列表;AND運算符將每個反轉列錶轉換成分數列表,並且對於每個分數列表中的文檔id集合進行求交集操作,結果是一個新的分數列表,每個文檔對應的分數是該文檔在各個輸入的分數列表中分數的乘積。

除了AND, TERM運算符,搜索引擎一般還會定義許多其他運算符,比如OR用來對文檔集合求並集操作; NEAR(term1, term2)用來查找所有term1 和 term2 相鄰的文檔, WINDOW(5, term1, term2)用來查找term1 和 term2 相隔不超過5個單詞的文檔,WEIGHTED_SUM運算符來對分數進行加權和操作等。如何定義搜索運算符取決於不同的搜索引擎。

搜索引擎用把用戶輸入的搜索字元進行一些類似於創建索引時對文本的處理(tokenization, stemming, stopword removal, entity recognition),然後生成解析樹。這個過程使用了各種技巧,常見的有:

multiple representation model: 即一個文檔的標題, URL,主體等部分被分別處理。比如大黃的搜索會被轉換成:

AND(

WEIGHTED_SUM(0.1, URL(iphone 6), 0.2, TITLE(iphone 6), 0.7, BODY(iphone 6)),

WEIGHTED_SUM(0.1, URL(售價), 0.2, TITLE(售價), 0.7, BODY(售價))

)

或者

WEIGHTED_SUM(

0.1, AND(URL(iphone 6), URL(售價)),

0.2, AND(TITLE(iphone 6), TITLE(售價)),

0.7, BODY(iphone 6), BODY(售價)),

)

Sequential Dependency Model:將搜索詞按照以下三個不同方法生成解析樹,最後把他們加權求和。三個方法分別是:

  • bag of words 匹配,即 AND(「iphone 6」, 售價);

  • N-gram 匹配,即 NEAR(「Iphone 6」, 售價)

  • 短窗口匹配,即 WINDOW(8, 「iphone 6」, 售價)

最後加權求和:

WEIGHTED_SUM(0.7, AND(「iphone 6」, 售價), 0.2, NEAR(「Iphone 6」, 售價), 0.1 WINDOW(8, 「iphone 6」, 售價) )

也可以把以上兩種方法生成的解析樹再進行加權求和來生成最終結果。

搜索引擎也可能會根據查詢的類型選擇不同的方法生成解析樹。具體如何解析是沒有定論的,加權操作中每部分的權重也沒有定論。這需要根據歷史數據做大量實驗最終確定參數。總之,以上技巧最終目標是幫助搜索引擎更好理解用戶的信息需求,以便查找出更高質量的文檔。

排序

到這兒終於該說搜索引擎怎麼給文檔打分了。根據Google的論文Brin Page, WWW 1998,他們計算文檔最終分數是

score(doc, query)=f(IRscore(doc, query), PageRank(doc))

其中IRscore(doc, query)就是文檔doc對於搜索詞query的信息檢索得分,PageRank(doc)是該文檔的 PageRank得分。在論文里他們沒有說函數f是如何實現的。

信息檢索得分(Information Retrieval Score)

假設互聯網裡的所有網頁都包含有用的信息,且它們之間沒有引用,這時打分唯一的依據就是這篇文章是否和查詢相關。信息檢索得分就是這種相關性的衡量。

有很多理論來計算IRscore。比如向量空間(Vector space retrieval model),概率理論(Probabilistic retrieval models),或統計語言模型(Statistical language models)等。這裡不細說具體每個理論是怎麼回事。關鍵要記住的是,它們的公式都和一個簡單演算法的公式非常接近。那就是tf-idf (term frequency–inverse document frequency)。

每個單詞-文檔組合都有一個tf-idf值。tf 表示此文檔中這個單詞出現的次數;df表示含有這個單詞的文檔的數量。通常如果一個單詞在文檔中出現次數越多說明這個文檔與這個單詞相關性越大。但是有的單詞太常用了,比如英文里「the」,「a」,或者中文裡「這裡」,「就是」等,在任何一個文檔中都會大量出現。idf表示一個文檔含有此單詞的概率的倒數,就是用來消除常用詞幹擾的。如果一個詞在越多的文檔中出現,說明這個詞對於某一個文檔的重要性就越低。演算法的公式是:

tfidf = tf * frac{totalDocCount}{df}

搜索引擎如果只考慮tfidf分數,會非常容易被欺騙。因為tfidf只考慮網頁和搜索詞之前的相關性,而不考慮網頁本身的內容質量。比如老中醫可以在自己的網頁上堆滿治療X病的關鍵詞,這樣當有人搜索相關內容時tfidf就會給出高分。PageRank就是專門禰補這個缺陷的。

PageRank 分數

PageRank是Google創始人Larry Page 和 Sergey Brin 當年在斯坦福讀博期間搞出來的一個演算法。憑藉此演算法他們創立Google,迎娶白富美走向人生巔峰的故事早已成為佳話。它的作用就是對網頁的重要性打分。假設有網頁A和B,A有鏈接指向B。如果A是一個重要網頁,B的重要性也被提升。這種機制可靠的懲罰了沒有被別的鏈接指向的欺詐網站。

以下內容涉及數學知識,不感興趣可以跳過。

PageRank是按照以下規則計算分數的。假設有n個網頁,他們的PageRank分數用n*1矩陣vec{r}表示。PageRank定義了一個n*n矩陣B_{pr}表示網頁間的連接關係。

B_{pr}=(1-alpha)M^T+{alpha}E^T

其中n*n矩陣M的每一個元素m_{ij}表示從網頁i跳轉到網頁j的概率。比如網頁i有10個鏈接,其中2個指向網頁j,那麼m_{ij}的值就是0.2。E是一個常量,它是一個n*n矩陣且每個元素都為frac{1}{n}alpha用來將M^T和加權求和。一般設為0.1~0.2之間。

vec{r}的求值是一個迭代過程:

vec{r}^{(k)}=B_{pr}vec{r}^{(k-1)}=B^kvec{r}^{(0)}

這個迭代公式是有意義的。對於網頁i,它的 PageRank得分為:

r_i^{(k)}=sum_{t=1}^{n}{B_{pr}}_{it}*r_{t1}^{(k-1)}=sum_{t=1}^{n}left[ (1-alpha)m_{ti}+frac{alpha}{n} 
ight] r_{t1}^{(k-1)}

因為B_{pr}是由M和E的轉置矩陣加權組成的,所以注意上式中{B_{pr}}_{it}展開後對應的矩陣M的值是m_{ti}(1-alpha)m_{ti}+frac{alpha}{n}是經過平滑後的從網頁t跳轉到網頁i的概率。這樣即使t沒有連接指向i,它的跳轉概率也是frac{1}n。這個公式表示,網頁i的PageRank得分由所有其他網頁的PageRank得分分別乘以其跳轉至網頁i的概率之和得到。k是迭代次數。可以證明當k足夠大時vec{r}^{(k)}會收斂至一個定值。

搜索引擎將查詢結果中的文檔按照得分排序,最終給大黃顯示出所有賣 iphone 6 的網頁。

總結

搜索引擎是各種高深的演算法和複雜的系統實現的完美結合,每一部分都在系統里起到關鍵作用。 洋洋洒洒寫了這麼多也只觸及到皮毛,還有很多內容沒有提及。比如搜索引擎如何評估搜索結果好壞,如何進行個性化搜索,如何進行分類搜索等。以後有機會再分別總結。

本文大部分知識來自卡內基梅隆大學「當年」的課程11-641 Search Engine and Web Mining,說「當年」是聽說現在這個課已經被拆分成兩個搜索引擎和文本挖掘兩個課了。不過授課內容肯定更加豐富了。最後感謝Jamie Callan 教授和 Yiming Yang教授的教導!


1. 搜索引擎是什麼?

搜索引擎是我們從互聯網中獲取信息資源的一種核心工具,它滲透於我們的網路生活中。比如你上網買個商品,查看熱點新聞,看娛樂八卦等等,無非一個關鍵字,一個搜索框的事情。

搜索引擎目前主要分兩種:大型的通用web搜索引擎如百度、谷歌、搜狗搜索、必應等等;相對較小規模的,領域性較強的垂直型搜索引擎如電商平台搜索、資訊平台搜索、視頻網站搜索等等。

2. 搜索引擎的工作原理?

首先,你可以把自己看作一個搜索引擎的開發者。

現在,在你面前,有一堆商品,和一個任務(讓用戶快速找到他們想要的商品)。

那麼,用搜索引擎的思維會怎麼做呢?

簡單的工作流程如下:

(1) 商品打碼。給商品打上唯一的標籤碼,方便管理,按照編碼次序給商品排列製成表。

(2) 商品標籤化。這裡你們看到的標籤可能會聯想到一些比較大概念的標籤如「生活」、「娛樂」、「體育」等等;事實上這個步驟的標籤會直接從商品的信息內容裡面去提取,具體到一些人名、地名、品牌名、氣味、專有名詞等等;換句話說就是,在這一個步驟中,商品信息內容中一切具有獨立表義作用的詞,我們都會把它們提取出來,作為這個商品的關鍵詞。(這就是為什麼我們在只需要搜索框裡面輸入關鍵字就可以進行搜索,因為這樣做可以大概率覆蓋掉你在搜索你想要的信息時你所能想到的Keyword)

(3) 索引構建。經過 (2) 的處理之後,我們肯定是可以得到一堆商品標籤,以及每一個標籤所對應的商品編碼,這個時候我們可以對數據進行整理,最後可以生成一個像「[標籤]——&>[商品編碼集合]」那樣的集合。

這樣一來,一個基本的搜索系統原型就出來了。該系統響應用戶請求的過程如下:

[用戶輸入關鍵字] ————&> [查索引] ———— &>[得到商品編碼] ————&>

[查編碼表找到對應商品] ————&> [返回給用戶]

不妨想像一下,

如果是10個商品,利用人工稍微看一看,查一查表,便可以快速響應用戶的關鍵詞請求了。

如果是百萬級、千萬級、甚至億級的商品量,這時候人工已經不再適用。而且在當今快節奏的網路信息時代里,人們對互聯網響應速度要求越來越高,要承受大規模的用戶請求並且快速響應,這就需要技術接入了。換句話說,就是需要不斷地去強化上述的搜索工作流程。因為數據量變多以後,上述工作流程的每一步細節包括商品儲存、查找、修改、更新、刪除等等,都對工作效率產生了極其重要的影響。

3. 為何可以達到如此之快的搜索效率?

這裡不打算講解一些演算法層面的知識,主要是一些思想上的講述。由前文已經知道,我們要對系統進行強化,提升其工作效率,就必須要對每一個工作細節進行升級和強化,使其在面對海量數據處理時還能保持著高效率的工作能力。這樣就可以將原來的系統原型變成我們如今可見的高效率的搜索引擎了。

不難發現,前文講述這麼多主要是在表達一個觀點:要想事情變得高效,我們需要對這個事情創建「索引」。

簡單地說就是我們要對所做的事情做一些處理,這個處理讓我們這個事情做起來能產生像「查新華字典目錄找到目標字」一樣的效果。要提升搜索效率,就意味著要讓2.(2)中的工作流程越來越快。從而就要對數據儲存、排序、增刪改查操作等一系列工作細節進行升級。

比如說:查找,我們在查找某個關鍵詞的時候,面對海量數據時,逐個去找這是不現實的,有沒有可能我們在處理數據時做一些特別的設計和處理,避免我們在查找時掃描全表的低效率操作?答案是肯定的。而這些特別的設計和處理,你不妨把它看作對這些工作細節的「索引」。這有點像「我們以前上學時看書自己會做筆記幫助理解知識點,以後回頭溫習時可以快速理解知識」這樣的行為的背後思想是相似的。

總體來說,搜索效率之所以如此快速,主要思想是對系統中的每一個工作細節進行「局部創建索引」,背後就是我們常常見到但是一般都看不懂的所謂的演算法和數據結構。如想更深一層進一步去了解這系統背後的所謂的演算法與數據結構等等知識;也可以照著本次答文的思路去逐一進行調研自己想了解的知識。

推薦閱讀

有必要也可以找一些相關書籍來看,這裡簡單推兩本。

  1. 比較基礎的如《這就是搜索引擎:核心技術詳解》
  2. 能進行英文閱讀的朋友可以看看《Introduction to Information Retrieval》,這本將整個信息檢索流程講得比較詳細。


搜索引擎的工作原理

全文搜索引擎的「網路機器人」或「網路蜘蛛」是一種網路上的軟體,它遍歷Web空間,能夠掃描一定IP地址範圍內的網站,並沿著網路上的鏈接從一個網頁到另一個網頁,從一個網站到另一個網站採集網頁資料。它為保證採集的資料最新,還會回訪已抓取過的網頁。網路機器人或網路蜘蛛採集的網頁,還要有其它程序進行分析,根據一定的相關度演算法進行大量的計算建立網頁索引,才能添加到索引資料庫中。我們平時看到的全文搜索引擎,實際上只是一個搜索引擎系統的檢索界面,當你輸入關鍵詞進行查詢時,搜索引擎會從龐大的資料庫中找到符合該關鍵詞的所有相關網頁的索引,並按一定的排名規則呈現給我們。不同的搜索引擎,網頁索引資料庫不同,排名規則也不盡相同,所以,當我們以同一關鍵詞用不同的搜索引擎查詢時,搜索結果也就不盡相同。

和全文搜索引擎一樣,分類目錄的整個工作過程也同樣分為收集信息、分析信息和查詢信息三部分,只不過分類目錄的收集、分析信息兩部分主要依靠人工完成。分類目錄一般都有專門的編輯人員,負責收集網站的信息。隨著收錄站點的增多,現在一般都是由站點管理者遞交自己的網站信息給分類目錄,然後由分類目錄的編輯人員審核遞交的網站,以決定是否收錄該站點。如果該站點審核通過,分類目錄的編輯人員還需要分析該站點的內容,並將該站點放在相應的類別和目錄中。所有這些收錄的站點同樣被存放在一個「索引資料庫」中。用戶在查詢信息時,可以選擇按照關鍵詞搜索,也可按分類目錄逐層查找。如以關鍵詞搜索,返回的結果跟全文搜索引擎一樣,也是根據信息關聯程度排列網站。需要注意的是,分類目錄的關鍵詞查詢只能在網站的名稱、網址、簡介等內容中進行,它的查詢結果也只是被收錄網站首頁的URL地址,而不是具體的頁面。分類目錄就像一個電話號碼薄一樣,按照各個網站的性質,把其網址分門別類排在一起,大類下面套著小類,一直到各個網站的詳細地址,一般還會提供各個網站的內容簡介,用戶不使用關鍵詞也可進行查詢,只要找到相關目錄,就完全可以找到相關的網站(注意:是相關的網站,而不是這個網站上某個網頁的內容,某一目錄中網站的排名一般是按照標題字母的先後順序或者收錄的時間順序決定的)。
搜索引擎並不真正搜索互聯網,它搜索的實際上是預先整理好的網頁索引資料庫。

真正意義上的搜索引擎,通常指的是收集了網際網路上幾千萬到幾十億個網頁並對網頁中的每一個詞(即關鍵詞)進行索引,建立索引資料庫的全文搜索引擎。當用戶查找某個關鍵詞的時候,所有在頁面內容中包含了該關鍵詞的網頁都將作為搜索結果被搜出來。在經過複雜的演算法進行排序後,這些結果將按照與搜索關鍵詞的相關度高低,依次排列。

現在的搜索引擎已普遍使用超鏈分析技術,除了分析索引網頁本身的內容,還分析索引所有指向該網頁的鏈接的URL、AnchorText、甚至鏈接周圍的文字。所以,有時候,即使某個網頁A中並沒有某個詞比如「惡魔撒旦」,但如果有別的網頁B用鏈接「惡魔撒旦」指向這個網頁A,那麼用戶搜索「惡魔撒旦」時也能找到網頁A。而且,如果有越多網頁(C、D、E、F……)用名為「惡魔撒旦」的鏈接指向這個網頁A,或者給出這個鏈接的源網頁(B、C、D、E、F……)越優秀,那麼網頁A在用戶搜索「惡魔撒旦」時也會被認為更相關,排序也會越靠前。

搜索引擎的原理,可以看做三步:從互聯網上抓取網頁→建立索引資料庫→在索引資料庫中搜索排序。

從互聯網上抓取網頁
利用能夠從互聯網上自動收集網頁的Spider系統程序,自動訪問互聯網,並沿著任何網頁中的所有URL爬到其它網頁,重複這過程,並把爬過的所有網頁收集回來。

建立索引資料庫
由分析索引系統程序對收集回來的網頁進行分析,提取相關網頁信息(包括網頁所在URL、編碼類型、頁面內容包含的關鍵詞、關鍵詞位置、生成時間、大小、與其它網頁的鏈接關係等),根據一定的相關度演算法進行大量複雜計算,得到每一個網頁針對頁面內容中及超鏈中每一個關鍵詞的相關度(或重要性),然後用這些相關信息建立網頁索引資料庫。

在索引資料庫中搜索排序
當用戶輸入關鍵詞搜索後,由搜索系統程序從網頁索引資料庫中找到符合該關鍵詞的所有相關網頁。因為所有相關網頁針對該關鍵詞的相關度早已算好,所以只需按照現成的相關度數值排序,相關度越高,排名越靠前。
最後,由頁面生成系統將搜索結果的鏈接地址和頁面內容摘要等內容組織起來返回給用戶。
搜索引擎的Spider一般要定期重新訪問所有網頁(各搜索引擎的周期不同,可能是幾天、幾周或幾月,也可能對不同重要性的網頁有不同的更新頻率),更新網頁索引資料庫,以反映出網頁內容的更新情況,增加新的網頁信息,去除死鏈接,並根據網頁內容和鏈接關係的變化重新排序。這樣,網頁的具體內容和變化情況就會反映到用戶查詢的結果中。

互聯網雖然只有一個,但各搜索引擎的能力和偏好不同,所以抓取的網頁各不相同,排序演算法也各不相同。大型搜索引擎的資料庫儲存了互聯網上幾億至幾十億的網頁索引,數據量達到幾千G甚至幾萬G。但即使最大的搜索引擎建立超過二十億網頁的索引資料庫,也只能佔到互聯網上普通網頁的不到30%,不同搜索引擎之間的網頁數據重疊率一般在70%以下。我們使用不同搜索引擎的重要原因,就是因為它們能分別搜索到不同的內容。而互聯網上有更大量的內容,是搜索引擎無法抓取索引的,也是我們無法用搜索引擎搜索到的。

你心裡應該有這個概念:搜索引擎只能搜到它網頁索引資料庫里儲存的內容。你也應該有這個概念:如果搜索引擎的網頁索引資料庫里應該有而你沒有搜出來,那是你的能力問題,學習搜索技巧可以大幅度提高你的搜索能力。參考:http://zhidao.baidu.com/question/17371538.html


對文字犯困。。。 如果你只是想大概了解到話:以下

Google 自己出了一集視頻 叫 How google works

3分鐘,有個概念,極簡主義的傑作。1. How Google Works

貼個圖,自己感受下。

詳細點的 :


看了這麼多回答,原理通俗來講就是:搜索引擎先在網上找來所有信息(這個過程將永不停息地進行下去)建立一個資料庫,然後對這些信息創建一個索引,當用戶來搜索的時候,直接用自己歸納編排好的索引,找自己資料庫里的信息反饋給用戶


我之前總是這麼給家裡人解釋我的工作:

  • 我把人們搜索網頁的行為,比喻成查字典;人們用關鍵詞查網頁,類比與用拼音(A、B、C)查漢字,並且想知道這個字的意思;

那我們是在做一本大字典,所有的漢字就是所有的網頁;

每個漢字的解釋,就是那個網頁的摘要;

怎麼做呢?

  1. 首先要把全部的漢字收集起來,存起來;這就是搜索引擎的抓取(爬蟲),就是把全部互聯網的網頁抓下來(html頁面文件下載下來);
  2. 然後把每個漢字的意思解釋出來存起來(當然也包括這個字的一些屬性,比如聲母韻母、按動詞名詞,偏旁部首、比劃);這就是網頁存儲,把這個網頁的內容解析出來,主要是摘要、並且附帶一些其他的屬性;
  3. 那麼我們存的漢字結構是:漢字:內容、聲母、韻母、偏僻,這樣的結構,也就是這個字是主鍵、這在搜索引擎中叫正排;
  4. 既然想要通過拼音查漢字,那就要轉變成A:啊、按、唉這種結構,就是拼音A有哪些漢字、B有哪些漢字;這種結構叫做倒排;
  5. ok、正排 轉變為 倒排的過程就是建索引,也叫索引建庫(index build),具體方法就不說了;
  6. 那麼 「啊」 和 「阿」 這兩個字哪個在前面呢?是不是根據人們使用程度什麼原因呢,所以在轉換過程中,還做了排序、去重、屏蔽等等策略來提高同一個關鍵詞的結果的質量。
  7. 轉變好的數據結構,以前是用霍夫曼樹等檢索數據結構,後面發展為倒排拉鏈等,這裡不詳細解釋,總之這坨東西得給人看啊,那麼就要印刷在每一頁上,裝訂成書本;這就是搜索引擎前端,也就是WebServer的結構複雜版,但是網頁畢竟太多了,一本書放不下,我們分裝成多冊、多套,也就是前端的多層、多列架構;
  • 綜述:搜索引擎包括:抓取(爬蟲)、存儲、索引建庫、前端 這四大部分;

這是我自己的理解,不知道算不算原創,反正自己是這麼給老家人解釋的~~


1. 抓取各個網站的內容;

2. 將抓取的內容去噪;

3. 將內容進行索引,以中文為例的話,其中重要一步就是切詞,再高深一點就涉及語義分析;

4. 將索引對應的每個內容進行排序。Google的的排序演算法page rank里的page是取自larry. Page,Google創始人的博士論文(好像是?)

基本原理的話就這麼多。但以上每一塊其實都是坑,埋著無數大牛的論文。


原理簡單講:蜘蛛爬行抓取,建立索引資料庫,用戶搜索,搜索引擎根據相關性和權重等排名演算法,返回結果。

這其中每個階段都涉及很多技術。

推薦一本:這就是搜索引擎 可以大概簡單了解一下。


搜索引擎是呈現網頁的過程


做SEO兩年有餘,自身也積累了一些SEO的經驗。我也和很多的同行交流了許多,從基本概念到優化策略,無所不包。我發現往往是交流到一些最基礎的東西,我們很難準確的說出來。


現在凡事工作室給大家一一整理出來,今天主要是跟大家介紹一下,搜索引擎呈現網路的過程。


搜索引擎的整體架構示意圖:


我們來看一下搜索引擎的架構(上圖):

  1. 網路爬蟲爬行互聯網連接;
  2. 網頁計算去重;
  3. 添加索引;
  4. 內容,鏈接計算;
  5. 網頁排序;
  6. 形成對應詞典,存入cache系統;
  7. 用戶檢索;
  8. 分析內容,調出詞典內容。


這基本上是一個網頁從產生到呈現的過程,當然這個過程很複雜,這裡只是簡單的比擬出來。不過我們可以看到,網路的爬蟲對我們網站是何等的重要,這也是很多賣蜘蛛池的原因吧。


其次是網頁的去重,因為現在百度自身伺服器內部很多的網頁緩存,蜘蛛爬去過得內容百度會經過一系列的計算後去除重複網頁,這裡面有一個比較複雜的演算法,這個以後可以詳細來講。


我們看網頁的排序有兩個方面因素的影響:內容的相似性鏈接分析,大概這就是我們常說的SEO「內容為王,外鏈為皇」理論依據吧。其實網頁排序的影響因素有很多,但是內容和鏈接是基礎的比較重要的影響因素。


網頁排序之後就是生成關鍵詞的詞典存入搜索引擎的Cache系統,一方面可以快速的提供用戶查詢信息,另一方面就是減輕搜索引擎的計算壓力。


這就是整個搜索引擎的基本工作原理。

本文由凡事網路工作室http://www.ifanshi.net原創,轉載請註明出處。


我們熟知的搜索引擎有百度、360、搜狗、谷歌、雅虎、必應、神馬等,那搜索引擎的工作原理是什麼樣的呢?下面武漢seo許飛將為大家詳解搜索引擎的工作原理,希望能夠幫助到新手seo。

搜索引擎優化的一個主要任務就是根據網站的搜索引擎友好性,因此,搜索引擎優化的每個環節都會與搜索引擎工作流程存在必然的聯繫,研究搜索引擎優化實際上是對搜索引擎工作過程進行逆向推理。因此,學習搜索引擎優化應該從了解搜索引擎工作原理開始。

搜索引擎的主要工作包括:頁面抓取、頁面分析、頁面排序及關鍵詞查詢。

1、頁面抓取

頁面抓取就是指搜索引擎通過蜘蛛程序在互聯網上抓取頁面並進行存儲的過程,為搜索引擎開展各項工作提供了數據支持。

2、頁面分析

頁面分析主要是指對抓取回來的網頁進行信息提取處理,包括提取頁面的正文信息,並對正文信息進行分詞等,為後續建立關鍵詞索引及倒排索引提供數據基礎。

3、頁面排序

頁面排序是指搜索引擎結合頁面的內外部因素計算出頁面與某個關鍵詞的相關度,從而得到該關鍵詞相關頁面的排序列表。

4、關鍵詞查詢

搜索引擎接收來自用戶的查詢請求,並對查詢信息進行切詞與匹配,再向用戶返回相應的頁面排序列表。

搜索引擎的抓取策略有那些?

搜素引擎對網頁的抓取實際上就是在互聯網上進行數據採集,這是搜索引擎最基礎的工作。搜索引擎的數據採集能力,直接決定了搜索引擎可提供的信息量及對互聯網覆蓋的範圍,從而影響搜索引擎查詢結果的質量。因此,搜索引擎總是想方設法的提高數據採集能力。

1、頁面抓取流程

在互聯網中,URL是每個頁面的入口地址,搜索引擎蜘蛛程序就是通過url抓取到頁面的。搜索引擎蜘蛛程序從原始url列表出發,通過url抓取並存儲原始頁面,同時,提取原始頁面中的url資源並加入到url列表中,如此不斷循環,就可以從互聯網中獲取足夠多的頁面。

搜索引擎程序通過域名進入網站,從而展開對網站頁面的抓取。換言之,搜索引擎要在互聯網上抓取到頁面的首要任務就是建立一個足夠強大的原始域名列表,在通過域名進入相應的網站,從而抓取這個網站中的頁面。

而對於網站來說,如果想要被搜索引擎收錄,首要的條件就是加入搜索引擎的域名列表,下面向大家介紹兩種常用的加入搜索引擎列表的方法。

①主動向搜索引擎提交你的域名,通過這種主動的方法,讓搜索引擎發現我們的域名,並經行收錄。

②通過與外部網站建立鏈接關係,使搜索引擎可以通過外部網站發現我們的網站,從而實現對網站的收錄。

2、頁面抓取

如果把網站頁面組成的集合看做是一個有向圖,從指定的頁面出發,沿著頁面的鏈接,按某種特定的策略對網站中的頁面進行遍歷。不停的從url列表張移出已經訪問過的url,並存儲原始頁面,同時提取原始頁面中的url信息,在將url分為域名和內部url兩大類,同時判斷url是否被訪問過,將未訪問過的url加入到url列表中。遞歸的掃描url列表,直至耗盡所有的url資源,經過這些工作,搜索引擎就可以建立龐大的域名列表,頁面url列表存儲足夠多的原始頁面。

3、頁面抓取方式

頁面抓取方式是指搜索引擎抓取頁面時所使用的策略,目的是為了能在互聯網中篩選出更多相對重要的信息,頁面抓取方式的指定取決於搜索引擎對網站結構的理解。

常見搜索引擎抓取頁面的方式主要通過廣度優先、深度優先、大站優先、高權重優先、暗網抓取及用戶提交等。

4、如何避免重複性抓取

網站中的重複信息主要包括轉載內容和鏡像內容兩大類。搜索引擎在對頁面進行分析的時候,必須具備識別重複信息的能力,因為大量的重複信息不但佔用巨大的伺服器硬碟空間,而且還會增加用戶尋找信息的時間,降低用戶體驗。

5、網頁更新策略

由於搜索引擎不可能一次性抓取網站中的所有頁面,而且網站中頁面的誰昂也會不斷的變化,內容也在不斷的更新,因此搜索引擎還需要對已經抓取的頁面進行維護和更新,以便能及時獲取頁面中重要的信息,抓取更多的新頁面。常見的頁面維護方式包括:定期抓取、增量抓取、分類定位抓取、歷史更新策略及用戶體驗策略。

①定期抓取也指周期性抓取,即搜索引擎周期性的對網站中已經抓取的頁面經行全面更新。

②增量抓取是通過對已經抓取的頁面經行定時監控,實現對頁面的更新及維護。

③分類定位抓取是指根據頁面的類別或者是性質而指定相應更新周期的頁面監控方式。

④歷史更新頻率策略是網站在過去某段時間內頻繁更新,那麼在將來的某個時間裡也會頻繁更新。

⑤用戶體驗策略是指為了提高搜素引擎用戶體驗而制定的針對性的網頁更新策略。衡量搜索引擎用戶體驗有眾多的指標,而網頁更新的及時性也是其中一項重要的因素。

6、頁面存儲

頁面是搜索引擎對網站經行信息處理的基礎,搜索引擎大部分工作都是在頁面上開展的。但是,僅僅依靠頁面中的內容並不能滿足搜索引擎對數據處理的需求。搜索引擎能否在抓取頁面的過程中獲取到更多、更有價值的信息會直接影響到搜索引擎的工作效率及排序結果的質量。所以,搜索引擎在抓取頁面時,除了存儲原始頁面外,還會附加一系列的信息(例如:文件類型、文件大小等),再把這些信息作為開展某項工作的依據。

本文由武漢SEO許飛提供,https://www.clean78.com 為你提供更多有價值的內容。


簡單說的話

1 先把網頁抓回來

2 處理網頁生成倒排索引

所謂倒排索引就是每個詞對應一個包含大量url的鏈

3 根據查詢詞將多個鏈求交


記得有一本書叫《改變未來的九大演算法》,裡面有說到搜索引擎的原理,科普性質的書,可以翻翻看。


 搜索引擎的工作過程大體上可以分為三個過程:

  (1)爬行和抓取:搜索引擎蜘蛛通過跟蹤鏈接發現和訪問網頁,讀取頁面HTML代碼,存入資料庫。

  (2)預處理:索引程序對抓取來的頁面數據進行文字提取、中文分詞、索引、倒排索引等處理,以備排名程序調用。

  (3)排名:用戶輸入查詢詞後,排名程序調用索引庫數據,計算相關性,然後按一定格式生成搜索結果頁面。

詳細你可以看看作為SEOer,你了解搜索引擎嗎?


搜索引擎我們知道的有百度、360、google等,都是比較知名的搜索引擎,其工作原理是:

首先對互聯網上的網頁進行搜集,然後對搜集來的網頁進行預處理,建立網頁索引庫,實時響應用戶的查詢請求,並對查找到的結果按某種規則進行排序後返回給用戶。搜索引擎的重要功能是對互聯網上的文本信息提供全文檢索。

搜索引擎通過客戶端程序接收來自用戶的檢索請求,現在最常見的客戶端程序就是瀏覽器,實際上它也可以是一個用戶開發的簡單得多的網路應用程序。

用戶輸入的檢索請求一般是關鍵詞轉化為wordID,然後在標引庫中得到docID列表,對docID列表中的對象進行掃描與wordID進行匹配,提取滿足條件的網頁,然後計算網頁和關鍵詞的相關度,並根據相關度的數值將結果返回給用戶。

以上就是搜索引擎的工作原理,未來大智能時代,搜索將顯得更為重要,人工智慧是未來的大趨勢,讓我們一起迎接人工智慧時代,給我們帶來的經濟與文化的變革,不過,在此之前,我們更要明白,人工智慧的主要應用領域介紹,系統闡述了人工智慧在主要應用領域的實際應用! - 人工智慧 多智時代


數學之美一書中有對谷歌搜索演算法的一些介紹,題主可以看看。


這個概念太大了, 建議買一本書參看一下。大致的步驟是 抓取、收錄、檢索、排名


看看這裡寫的搜索引擎工作原理 - Cheshirex


推薦閱讀:

周鴻禕似乎在商場四面樹敵人人喊打,那為什麼奇虎 360 依然發展得那麼好?
如何看待豌豆莢改版加入生活服務搜索??
人肉搜索軟體是什麼原理?
在ElasticSearch中,集群(Cluster),節點(Node),分片(Shard),Indices(索引),replicas(備份)之間是什麼關係?
請問卡飯網是怎麼欺騙搜索引擎的?

TAG:計算機網路 | 搜索引擎 |