我們常說阿里的運營,騰訊的產品,百度的技術。這背后是對百度技術的肯定,我們都知道,百度是靠搜索引擎起家,搜索引擎與電商與社交產品有明顯的區別,有著非常強的技術驅動性。今天我們就來學習學習,搜索引擎大致是怎么組成的,背后的算法與數據結構是怎么樣的,作為一個程序員,我們能否實現自己簡單的搜索引擎呢?
一個經典的搜索引擎,無論是谷歌、百度、微信的搜一搜還是淘寶的搜索,都離不開下面這這個基本過程,收集、分析、索引、查詢。我們今天一個一個來介紹這背后的經典算法與數據結構。

收集
首先是收集,最常見的便是爬蟲,從各個網站中爬取對應的資料,根據網站的爬取順序,我們常常有深度優先搜索,廣度優先搜索等不同的爬取策略,為了避免爬取重復的網站,我們可能需要對網站的地址進行判重,常用的,我們可以使用布隆過濾器,可以做到非常高效的網站去重。當然,現在有一些搜索引擎也是不需要爬蟲的,像淘寶的商品搜索,商家每發布新的產品,或者用戶發表新的評論,都會發布異步的消息隊列,由搜索引擎訂閱并收集。那么多的基礎元數據,我們通常需要給他們一個編號,有人說可以用MySQL存儲,用自增主鍵id,那樣一個表會非常大,要知道,網絡上的網頁何止千千萬萬,我們通常采用NoSql進行存儲,同時我們也需要ID生成分配器,給每一個資源一個獨立的ID。
分析
程序員們都知道,在網頁上我們雖然能看到豐富多彩的文案與圖片,背后都是html格式的代碼,我們需要去掉這些格式,才能獲取到真實的文本。那么,如何在一個HTML文件中,去掉各種標簽呢?最簡單的,便是文本匹配,為了加快匹配的速度,通常我們會常用AC自動機等多模文本匹配算法進行優化,可以快速的去掉HTML頁面上的各種標簽。
索引
那么多的網頁,我們查詢的時候,不可能每一個網頁都去遍歷,找到是否包含這個關鍵字。通常,我們采用的一個技術,便是倒排索引,什么是倒排索引的,最簡單來說,就是記錄每一個單詞,在哪里出現過。舉個簡單例子,文章1的內容包含了“我和我的祖國,一刻都不能分割”,文章2的內容包含了“祝偉大祖國70周年生日快樂,繁榮富強”,文章3包含了“國慶節要放假了,程序員可以休息了”。那么,單詞“祖國”的倒排索引上面就會有1,2表示,在第1,2號文章上出現過,單詞“程序員”的倒排索引是3,表示在第3號文件出現過。

查詢
當我們用關鍵字進行查詢的時候,我們首先去索引上面查詢這個單詞在哪些文章上面出現過。緊接著,便是排序,排序是搜索引擎一個非常牛逼的技術,那么多的文章,一個關鍵字可能包含了幾百萬的文章,怎么進行排序的呢?有幾種非常簡單的方法,例如關鍵詞出現的次數,越多說明權重越高,或者是創建的時間,越新權重越高,當然也有一些其他的排序方法,例如競價等等。
現代的搜索引擎,一般還會用AI進行武裝,我們一般用深度學習,對搜索結果去建立神經網絡,如果用戶點擊了,就說明搜索出來的結果用戶更喜歡,從而達到不斷訓練,越來越聰明的作用。

總結
好了,今天我們就分享到這里,有興趣的程序員同學,可以嘗試自己實現一個簡單的搜索引擎。相信你會對其中的算法與數據結構有更深一步的認識。歡迎大家關注我,共同學習,共同進步。大家的支持是我繼續嘮嗑的動力。同名公眾號(沙茶敏碎碎念)