後端技術雜談2:搜索引擎工做原理

本文做者:頓燉
連接:https://www.zhihu.com/question/19937854/answer/98791215
來源:知乎java

本系列文章將整理到我在GitHub上的《Java面試指南》倉庫,更多精彩內容請到個人倉庫裏查看git

https://github.com/h2pl/Java-Tutorialgithub

喜歡的話麻煩點下Star哈面試

本系列文章將整理於個人我的博客:算法

www.how2playlife.com數據庫

該系列博文會介紹常見的後端技術,這對後端工程師來講是一種綜合能力,咱們會逐步瞭解搜索技術,雲計算相關技術、大數據研發等常見的技術喜提,以便讓你更完整地瞭解後端技術棧的全貌,爲後續參與分佈式應用的開發和學習作好準備。編程

若是對本系列文章有什麼建議,或者是有什麼疑問的話,也能夠關注公衆號【Java技術江湖】聯繫我,歡迎你參與本系列博文的創做和修訂。後端

寫在前面

Max Grigorev最近寫了一篇文章,題目是《What every software engineer should know about search》,這篇文章裏指出瞭如今一些軟件工程師的問題,他們認爲開發一個搜索引擎功能就是搭建一個ElasticSearch集羣,而沒有深究背後的技術,以及技術發展趨勢。Max認爲,除了搜索引擎自身的搜索問題解決、人類使用方式等以外,也須要解決索引、分詞、權限控制、國際化等等的技術點,看了他的文章,勾起了我多年前的想法。瀏覽器

不少年前,我曾經想過本身實現一個搜索引擎,做爲本身的研究生論文課題,後來琢磨半天沒有想出新的技術突破點(相較於已發表的文章),因此切換到了大數據相關的技術點。當時沒有寫出來,心中有點小遺憾,畢竟憑藉搜索引擎崛起的谷歌是我心裏渴望的公司。今天我就想結合本身的一些積累,聊聊做爲一名軟件工程師,您須要瞭解的搜索引擎知識。緩存

搜索引擎發展過程

現代意義上的搜索引擎的祖先,是1990年由蒙特利爾大學學生Alan Emtage發明的Archie。即使沒有英特網,網絡中文件傳輸仍是至關頻繁的,並且因爲大量的文件散佈在各個分散的FTP主機中,查詢起來很是不便,所以Alan Emtage想到了開發一個能夠以文件名查找文件的系統,因而便有了Archie。Archie工做原理與如今的搜索引擎已經很接近,它依靠腳本程序自動搜索網上的文件,而後對有關信息進行索引,供使用者以必定的表達式查詢。

互聯網興起後,須要可以監控的工具。世界上第一個用於監測互聯網發展規模的「機器人」程序是Matthew Gray開發的World wide Web Wanderer,剛開始它只用來統計互聯網上的服務器數量,後來則發展爲可以檢索網站域名。

隨着互聯網的迅速發展,天天都會新增大量的網站、網頁,檢索全部新出現的網頁變得愈來愈困難,所以,在Matthew Gray的Wanderer基礎上,一些編程者將傳統的「蜘蛛」程序工做原理做了些改進。現代搜索引擎都是以此爲基礎發展的。

搜索引擎分類

  • 全文搜索引擎

當前主流的是全文搜索引擎,較爲典型的表明是Google、百度。全文搜索引擎是指經過從互聯網上提取的各個網站的信息(以網頁文字爲主),保存在本身創建的數據庫中。用戶發起檢索請求後,系統檢索與用戶查詢條件匹配的相關記錄,而後按必定的排列順序將結果返回給用戶。從搜索結果來源的角度,全文搜索引擎又可細分爲兩種,一種是擁有本身的檢索程序(Indexer),俗稱「蜘蛛」(Spider)程序或「機器人」(Robot)程序,並自建網頁數據庫,搜索結果直接從自身的數據存儲層中調用;另外一種則是租用其餘引擎的數據庫,並按自定的格式排列搜索結果,如Lycos引擎。

  • 目錄索引類搜索引擎

雖然有搜索功能,但嚴格意義上不能稱爲真正的搜索引擎,只是按目錄分類的網站連接列表而已。用戶徹底能夠按照分類目錄找到所須要的信息,不依靠關鍵詞(Keywords)進行查詢。目錄索引中最具表明性的莫過於大名鼎鼎的Yahoo、新浪分類目錄搜索。

  • 元搜索引擎

    元搜索引擎在接受用戶查詢請求時,同時在其餘多個引擎上進行搜索,並將結果返回給用戶。著名的元搜索引擎有InfoSpace、Dogpile、Vivisimo等,中文元搜索引擎中具表明性的有搜星搜索引擎。在搜索結果排列方面,有的直接按來源引擎排列搜索結果,如Dogpile,有的則按自定的規則將結果從新排列組合,如Vivisimo。

相關實現技術

搜索引擎產品雖然通常都只有一個輸入框,可是對於所提供的服務,背後有不少不一樣業務引擎支撐,每一個業務引擎又有不少不一樣的策略,每一個策略又有不少模塊協同處理,及其複雜。

搜索引擎自己包含網頁抓取、網頁評價、反做弊、建庫、倒排索引、索引壓縮、在線檢索、ranking排序策略等等知識。

  • 網絡爬蟲技術

網絡爬蟲技術指的是針對網絡數據的抓取。由於在網絡中抓取數據是具備關聯性的抓取,它就像是一隻蜘蛛同樣在互聯網中爬來爬去,因此咱們很形象地將其稱爲是網絡爬蟲技術。網絡爬蟲也被稱爲是網絡機器人或者是網絡追逐者。

網絡爬蟲獲取網頁信息的方式和咱們平時使用瀏覽器訪問網頁的工做原理是徹底同樣的,都是根據HTTP協議來獲取,其流程主要包括以下步驟:

1)鏈接DNS域名服務器,將待抓取的URL進行域名解析(URL------>IP);

2)根據HTTP協議,發送HTTP請求來獲取網頁內容。

一個完整的網絡爬蟲基礎框架以下圖所示:

整個架構共有以下幾個過程:

1)需求方提供須要抓取的種子URL列表,根據提供的URL列表和相應的優先級,創建待抓取URL隊列(先來先抓);

2)根據待抓取URL隊列的排序進行網頁抓取;

3)將獲取的網頁內容和信息下載到本地的網頁庫,並創建已抓取URL列表(用於去重和判斷抓取的進程);

4)將已抓取的網頁放入到待抓取的URL隊列中,進行循環抓取操做;

  • 索引

從用戶的角度來看,搜索的過程是經過關鍵字在某種資源中尋找特定的內容的過程。而從計算機的角度來看,實現這個過程能夠有兩種辦法。一是對全部資源逐個與關鍵字匹配,返回全部知足匹配的內容;二是如同字典同樣事先創建一個對應表,把關鍵字與資源的內容對應起來,搜索時直接查找這個表便可。顯而易見,第二個辦法效率要高得多。創建這個對應表事實上就是創建逆向索引(inverted index)的過程。

  • Lucene

Lucene是一個高性能的java全文檢索工具包,它使用的是倒排文件索引結構。

全文檢索大致分兩個過程,索引建立 (Indexing) 和搜索索引 (Search) 。

索引建立:將現實世界中全部的結構化和非結構化數據提取信息,建立索引的過程。
搜索索引:就是獲得用戶的查詢請求,搜索建立的索引,而後返回結果的過程。

非結構化數據中所存儲的信息是每一個文件包含哪些字符串,也即已知文件,欲求字符串相對容易,也便是從文件到字符串的映射。而咱們想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即從字符串到文件的映射。二者偏偏相反。因而若是索引總可以保存從字符串到文件的映射,則會大大提升搜索速度。

因爲從字符串到文件的映射是文件到字符串映射的反向過程,因而保存這種信息的索引稱爲反向索引 。

反向索引的所保存的信息通常以下:

假設個人文檔集合裏面有100篇文檔,爲了方便表示,咱們爲文檔編號從1到100,獲得下面的結構

每一個字符串都指向包含此字符串的文檔(Document)鏈表,此文檔鏈表稱爲倒排表 (Posting List)。

  • ElasticSearch

Elasticsearch是一個實時的分佈式搜索和分析引擎,能夠用於全文搜索,結構化搜索以及分析,固然你也能夠將這三者進行組合。Elasticsearch是一個創建在全文搜索引擎 Apache Lucene™ 基礎上的搜索引擎,可是Lucene只是一個框架,要充分利用它的功能,須要使用JAVA,而且在程序中集成Lucene。Elasticsearch使用Lucene做爲內部引擎,可是在使用它作全文搜索時,只須要使用統一開發好的API便可,而不須要了解其背後複雜的Lucene的運行原理。

  • Solr

Solr是一個基於Lucene的搜索引擎服務器。Solr 提供了層面搜索、命中醒目顯示而且支持多種輸出格式(包括 XML/XSLT 和 JSON 格式)。它易於安裝和配置,並且附帶了一個基於 HTTP 的管理界面。Solr已經在衆多大型的網站中使用,較爲成熟和穩定。Solr 包裝並擴展了 Lucene,因此Solr的基本上沿用了Lucene的相關術語。更重要的是,Solr 建立的索引與 Lucene 搜索引擎庫徹底兼容。經過對Solr 進行適當的配置,某些狀況下可能須要進行編碼,Solr 能夠閱讀和使用構建到其餘 Lucene 應用程序中的索引。此外,不少 Lucene 工具(如Nutch、 Luke)也可使用Solr 建立的索引。

  • Hadoop

谷歌公司發佈的一系列技術白皮書致使了Hadoop的誕生。Hadoop是一系列大數據處理工具,能夠被用在大規模集羣裏。Hadoop目前已經發展爲一個生態體系,包括了不少組件,如圖所示。

Cloudera是一家將Hadoop技術用於搜索引擎的公司,用戶能夠採用全文搜索方式檢索存儲在HDFS(Hadoop分佈式文件系統)和Apache HBase裏面的數據,再加上開源的搜索引擎Apache Solr,Cloudera提供了搜索功能,並結合Apache ZooKeeper進行分佈式處理的管理、索引切分以及高性能檢索。

  • PageRank

谷歌Pagerank算法基於隨機衝浪模型,基本思想是基於網站之間的相互投票,即咱們常說的網站之間互相指向。若是判斷一個網站是高質量站點時,那麼該網站應該是被不少高質量的網站引用又或者是該網站引用了大量的高質量權威的站點。

  • 國際化

坦白說,Google雖然作得很是好,不管是技術仍是產品設計,都很好。可是國際化確實是很是難作的,不少時候在細分領域仍是會有其餘搜索引擎的生存餘地。例如在韓國,Naver是用戶的首選,它自己基於Yahoo的Overture系統,廣告系統則是本身開發的。在捷克,咱們則更多會使用Seznam。在瑞典,用戶更多選擇Eniro,它最初是瑞典的黃頁開發公司。

國際化、個性化搜索、匿名搜索,這些都是Google這樣的產品所不能徹底覆蓋到的,事實上,也沒有任何一款產品能夠適用於全部需求。

本身實現搜索引擎

若是咱們想要實現搜索引擎,最重要的是索引模塊和搜索模塊。索引模塊在不一樣的機器上各自進行對資源的索引,並把索引文件統一傳輸到同一個地方(能夠是在遠程服務器上,也能夠是在本地)。搜索模塊則利用這些從多個索引模塊收集到的數據完成用戶的搜索請求。所以,咱們能夠理解兩個模塊之間相對是獨立的,它們之間的關聯不是經過代碼,而是經過索引和元數據,以下圖所示。

對於索引的創建,咱們須要注意性能問題。當須要進行索引的資源數目很少時,隔必定的時間進行一次徹底索引,不會佔用很長時間。但在大型應用中,資源的容量是巨大的,若是每次都進行完整的索引,耗費的時間會很驚人。咱們能夠經過跳過已經索引的資源內容,刪除已不存在的資源內容的索引,並進行增量索引來解決這個問題。這可能會涉及文件校驗和索引刪除等。另外一方面,框架能夠提供查詢緩存功能,提升查詢效率。框架能夠在內存中創建一級緩存,並使用如 OSCache或 EHCache緩存框架,實現磁盤上的二級緩存。當索引的內容變化不頻繁時,使用查詢緩存更會明顯地提升查詢速度、下降資源消耗。

搜索引擎解決方案

  • Sphinx

俄羅斯一家公司開源的全文搜索引擎軟件Sphinx,單一索引最大可包含1億條記錄,在1千萬條記錄狀況下的查詢速度爲0.x秒(毫秒級)。Sphinx建立索引的速度很快,根據網上的資料,Sphinx建立100萬條記錄的索引只需3~4分鐘,建立1000萬條記錄的索引能夠在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

  • OmniFind

OmniFind 是 IBM 公司推出的企業級搜索解決方案。基於 UIMA (Unstructured Information Management Architecture) 技術,它提供了強大的索引和獲取信息功能,支持巨大數量、多種類型的文檔資源(不管是結構化仍是非結構化),併爲 Lotus®Domino®和 WebSphere®Portal 專門進行了優化。
下一代搜索引擎

從技術和產品層面來看,接下來的幾年,甚至於更長時間,應該沒有哪一家搜索引擎能夠撼動谷歌的技術領先優點和產品地位。可是咱們也能夠發現一些現象,例如搜索假期租房的時候,人們更喜歡使用Airbub,而不是Google,這就是針對匿名/個性化搜索需求,這些需求是谷歌所不能徹底覆蓋到的,畢竟原始數據並不在谷歌。咱們能夠看一個例子:DuckDuckGo。這是一款有別於大衆理解的搜索引擎,DuckDuckGo強調的是最佳答案,而不是更多的結果,因此每一個人搜索相同關鍵詞時,返回的結果是不同的。

另外一個方面技術趨勢是引入人工智能技術。在搜索體驗上,經過大量算法的引入,對用戶搜索的內容和訪問偏好進行分析,將標題摘要進行必定程度的優化,以更容易理解的方式呈現給用戶。谷歌在搜索引擎AI化的步驟領先於其餘廠商,2016年,隨着Amit Singhal被退休,John Giannandrea上位的交接班過程後,正式開啓了自身的革命。Giannandrea是深度神經網絡、近似人腦中的神經元網絡研究方面的頂級專家,經過分析海量級的數字數據,這些神經網絡能夠學習排列方式,例如對圖片進行分類、識別智能手機的語音控制等等,對應也能夠應用在搜索引擎。所以,Singhal向Giannandrea的過渡,也意味着傳統人爲干預的規則設置的搜索引擎向AI技術的過渡。引入深度學習技術以後的搜索引擎,經過不斷的模型訓練,它會深層次地理解內容,併爲客戶提供更貼近實際需求的服務,這纔是它的有用,或者可怕之處。

Google搜索引擎的工做流程

貼個圖,本身感覺下。

詳細點的 :

相關文章
相關標籤/搜索