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

收集
首先是收集,最常見的便是爬蟲,從各個網(wǎng)站中爬取對應(yīng)的資料,根據(jù)網(wǎng)站的爬取順序,我們常常有深度優(yōu)先搜索,廣度優(yōu)先搜索等不同的爬取策略,為了避免爬取重復(fù)的網(wǎng)站,我們可能需要對網(wǎng)站的地址進(jìn)行判重,常用的,我們可以使用布隆過濾器,可以做到非常高效的網(wǎng)站去重。當(dāng)然,現(xiàn)在有一些搜索引擎也是不需要爬蟲的,像淘寶的商品搜索,商家每發(fā)布新的產(chǎn)品,或者用戶發(fā)表新的評論,都會發(fā)布異步的消息隊(duì)列,由搜索引擎訂閱并收集。那么多的基礎(chǔ)元數(shù)據(jù),我們通常需要給他們一個編號,有人說可以用MySQL存儲,用自增主鍵id,那樣一個表會非常大,要知道,網(wǎng)絡(luò)上的網(wǎng)頁何止千千萬萬,我們通常采用NoSql進(jìn)行存儲,同時我們也需要ID生成分配器,給每一個資源一個獨(dú)立的ID。
分析
程序員們都知道,在網(wǎng)頁上我們雖然能看到豐富多彩的文案與圖片,背后都是html格式的代碼,我們需要去掉這些格式,才能獲取到真實(shí)的文本。那么,如何在一個HTML文件中,去掉各種標(biāo)簽?zāi)兀孔詈唵蔚模闶俏谋酒ヅ洌瑸榱思涌炱ヅ涞乃俣龋ǔN覀儠S肁C自動機(jī)等多模文本匹配算法進(jìn)行優(yōu)化,可以快速的去掉HTML頁面上的各種標(biāo)簽。
索引
那么多的網(wǎng)頁,我們查詢的時候,不可能每一個網(wǎng)頁都去遍歷,找到是否包含這個關(guān)鍵字。通常,我們采用的一個技術(shù),便是倒排索引,什么是倒排索引的,最簡單來說,就是記錄每一個單詞,在哪里出現(xiàn)過。舉個簡單例子,文章1的內(nèi)容包含了“我和我的祖國,一刻都不能分割”,文章2的內(nèi)容包含了“祝偉大祖國70周年生日快樂,繁榮富強(qiáng)”,文章3包含了“國慶節(jié)要放假了,程序員可以休息了”。那么,單詞“祖國”的倒排索引上面就會有1,2表示,在第1,2號文章上出現(xiàn)過,單詞“程序員”的倒排索引是3,表示在第3號文件出現(xiàn)過。

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

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