Google如何在一毫秒內找到你想要的上百萬份文檔?

技術文章

我們昨天講了人和計算機在查找一個目標時的一些共同之間,既會使用順序查找,也會使用類似字典查找那樣的二分查找。當然,使用後者需要對所有的數據先排序。無論是哪一種方法,在處理非常大量的數據時,都會顯得力不從心。

 

比如,我們要把北京市所有叫〝李強〞的人找出來,這件事就有點難辦。為什麼呢?因為叫李強的人太多了。研究發現全中國有兩百多萬個叫李強的人,超過人口的千分之一。按照這個比例,在北京市會有 3000 ~ 4000 個李強,把這麼多李強都找到,上面兩種方法就不大靈光了。

 

順序查找顯然不可取,畢竟北京市有 2,000 多萬具有當地戶籍的人。如果我們將所有的人按照姓名排一個序,進行二分查找,是否可行暱。我們假定一個理想狀況,北京市的人口沒有變動,是靜態的, 所有的人也都排好了序。這樣通過二分查找,找到某一個李強只需要25次查找。這看上去不算太多,至少和 2,000 萬人口對比是如此。

 

但是,這只是找到一個,未必是護照上的那一個。由於北京市的人口都排好了次序,因此我們知道其他的李強要嘛排在他前面,要嘛排在他後面,接下來我們只能用順序查找的方法,往前找一遍, 直到把前面的李強都找到,然後再往後找一遍,這樣大約要查看 3,000  ~ 4,000 個戶籍記錄,才可以把所有李強都找全了。講到這裡你可能會覺得這種辦法太機械了,不夠靈巧,做了很多無用功。

 

上述方法還有一個問題,因為數據庫是按照姓名排序的,如果要找到北京市裡面所有從清華大學畢業的人,按照姓名排的序就沒有任何幫助。當然,你可以再把2000萬人的數據庫複製一份,再按照畢業的學校排一次序,然後進行二分查找。不過,如果又有人提出,需要找到北京市所有在騰訊公司工作的人,難不成還需要再有第三個數據庫是按照就職單位排序的?如果Google的搜索引擎是這麼做的,不要說一毫秒內找到上百萬個相關文檔,一個恐怕也找不到,這還不算複製數據庫所浪費的空間。

 

 

然而,上述的需求是信息管理中經常遇到的, 那麼計算機對這個問題會怎麼處理呢?最簡單的辦法就是建立索引。

 

什麼是索引呢,其實計算機裡的索引和很多圖書最後附帶的關鍵詞索引非常類似。在圖書的關鍵詞索引中,會列舉出主要關鍵詞在書中的位置,比如索引寫清楚了計算機”這個詞出現在書中第 2 ~ 5頁, 8 ~ 10 頁和 33 頁。計算機裡面的索引也是類似的。

 

比如我們先把北京市戶籍數據庫中每一個人名的記錄編好號,相當於書的頁碼。它的人名索引是這樣的,索引的每一行是一個名字,後面是叫這個名字的所有人的信息記錄編號。比如,在索引中,叫李強這個名字的人,是數據庫中編號第 2,013,210 到第 2,016,902 的人。這樣,要找出北京市所有的李強,只要先在索引中找到李強這一行,然後根據索引的指示, 到數據庫中,直接調出第2,013,210 到第 2,016,902 個記錄即可。

 

建索引比直接進到數據庫中查找的好處非常多,我們至少可以列舉出下面這些好處:

 

  1. 如果一個數據庫有了索引後,其實不需要進行排序,也可以快速查找到所需要的信息。我們還用找李強這個例子,並不需要所有的李強在數據庫中都放在一起,只要在索引中一一列舉出李強在檔案庫中的記錄號就可以了。比如,李強的記錄號是35, 783, 3499,等等。

 

  1. 由於不需要對數據庫進行排序,當數據庫不斷變動時,維護數據庫的成本就非常低。我們昨天講,要維持一個數據庫有序,成本是很高的,因為每一次增加一些數據,或者刪除了一些數據,都要重新對它進行排序,而排序是件花時間的事清。不需要排序,就省了很多事情。

 

  1. 有了索引,前面提到的要找到在某個單位工作的人,從某個大學畢業, 都很容易解決,因為再按照工作單位建一個索引,按照畢業的學校建一個索引就可以了。每當遇到新的需求,就建立新的索引就好了。

 

  1. 如果做一些複雜的操作,阰如要找到清華大學畢業的李強,只要在人名索引中把李強的記錄編號找到,再從畢業學校索引中,把清華大學對應人員的記錄號找到,重合的號碼,就是那些從清華畢業的李強。

 

介紹完索引,就可以解釋 Google 的搜索為什麼那麼快了。首先,Google把在網絡上所有能找到的文檔(以及圖片、視頻等等內容)下載以後,會對每一個詞建立索引,記錄下來每一個詞都出現在哪一篇文檔(網頁)中的哪一些具體的位置。比如〝得到〞即這個詞出現在第 105 個網頁的第 4, 9, 37個位置,第 403 個網頁的第 9, 40, 77個位置,第 588 個網頁的第 73, 203 個位置, 等等。這樣,當一個互聯網的用戶搜索〝得到〞這個詞的時候,只要在索引中找到這個詞,就能通過一個操作,把互聯網上所有的包含〝得到〞的文本找出來了。

 

網頁搜索的這種做法和你在 Word 中打字時,用 CtrI+F 查找是不一樣的。在 Word 中是不會對每一個詞建索引的,因此查找時是順序查找,一個個來,查找完一遍,計算機實際上是把你輸入的文章也瀏覽了一遍。在網頁搜索中,因為這個數據量實在太大,全世界大約有 1000 億個有意義的網頁,即使每個網頁平均只有 500 個詞,也是 50 萬億個詞,是不可能用順序搜索的。在使用Word寫作時,一篇文章最多不過幾萬字,順序瀏覽一遍還是可以忍受的。

 

其次,當你要搜索一組關鍵詞時,比如搜索同時包合,〝得到〞、〝方法論〞這兩個詞,如果沒有索引,可就麻煩了,即使找到了包含〝得到”這個詞的網頁,還要想辦法看看裡面是否有〝方法論〞這個詞,這非常花時間。如果有了索引,我們知道〝得到〞這個詞出現在第 105, 403, 588 等網頁中,類似地,我們還知道〝方法論〞這個詞出現在403, 545, 1032等網頁中,那麼只要找到這兩個索引的交集,也就是403等等,就可以了,這個操作就簡單很多。

 

如果你要搜索一個長句子,搜索引擎會先把它分割成一個個獨立的詞,然後根據每一個詞的索引找到這個句子。

 

最後,需要說的是,Google在建索引時,是對所有的詞建索引的,而不僅僅是對於一些重要的詞建立索引。因此,Google搜索出來的結果非常全,不會漏掉很多。而大部分其他的搜索引擎,為了節省成本,常常把一些他們認為不重要的詞忽略掉,因此用戶會發現找到的網頁沒有Google找到的多。

 

此外,Google 是對所有語言,所有文字建一個統一的索引,而國內的搜索引擎,會把文本分為中文的,英文的,或者其他什麼文字的,單獨建立索引。這在僅僅做一個市場生意時,起步可能會工作量小一點,運營成本會高點,但是,要想做全球化的生意,就幾乎不可能了。不僅如此,你如果在國內用這些搜索引擎查找外文的東西幾乎找不到

 

了解了索引,你就清楚為什麼搜索引擎非常快。事實上,今天你在網絡上找一篇文章,甚至比你在自己的計算機內部找一篇文章更決。這個現像不僅大家都發現了,而且十多年前比爾蓋茨也因此批評微軟的操作系統做得不好。你可以想像,一個公司裡老大發了狠,下面自然會有人響應,這就導致了微軟第一款強調個人電腦本機搜索的操作系統 Windows Vista 的誕生。不過遺撼的是,Vista是一款非常失敗的產品,其中的原因我們明天會分析。

 

下面,我們總結一下今天的內容要點:

 

  1. 為了方便地查找信息,一個簡單有效的方法就是根據信息的內容,建立索引。從原理上講,計算機的索引和圖書後面的關鍵詞索引很相似,它們都保存著所要找的信息的位置。如果所要找的信息不止一條,它會保留所有的位置。但是所不同的是,書後面關鍵詞的索引只有一種, 而計算機裡的索引常常需要根據應用場景建立很多種。

 

  1. 索引有很多的好處,不僅帶來搜索的效率,而且帶來靈活性,對於同一個數據庫,可以建立各種索引,預按照不同門類的訊息進行查找。一般索引只會根據一個維度的訊息建立,而不會用幾個維度的組合訊息建立,比如,不會建立〝人名 + 畢業學校〞這樣的索引。

 

  1. 善於建索引,不僅是 Google 搜索引擎查找訊息非常快的根本原因,也是保證 Google 的產品在訊息爆炸時代能體現出高質量的原因。事實上在 Google 內,使用索引幾乎成了所有軟體開發的標準。今天一些公司做出來的軟體產品質量不高,一個很重要的原因是開發者對索引的重要性缺乏認識,思路還停留在小數據時代,以至於很多功能的速度奇漫無比。

 

  1. 從索引你可以看出,為什麼計算機需要對裡面的一切東西進行編號,因為沒有編號,就無從建立索引。

 

  1. 索引這件事,不是我們人平時工作會用到的,因為我們人接觸的信息不多。但是,在工作中,把東西整理好,有條不紊,一定是提高效率的好方法。我經常講爛筆頭永遠比最好的頭腦可靠,其實也是這個道理。我們的頭腦就相當於是一個大數據庫,裡面什麼東西都有,你真要找一個東西,其實很困難。在紙上或者筆記本上寫下今天要做的事情,做完一項劃掉一項,是最高效率很好的辦法。

 

 

來源:《吳軍-Google如何在一毫秒內找到你想要的上百萬份文檔? 》

Gimmy
作者: Gimmy
積極的人在每一次憂患中都看到一個機會 而消極的人則在每個機會都看到某種憂患

發表迴響