這個題目來自知乎上的一個問題,我今年初開始做搜索相關的工作,到今天已經整整7個月,于是想借這個題目將自己所理解的搜索引擎原理寫下來。
我不是專業的搜索工程師,日常工作主要是做搜索產品評測,這個身份的缺點是自己的理解會有一些局限性,優點是寫出來的內容比較通俗易懂。
希望通過這些內容能幫助大家更好的理解搜索產品。
搜索引擎的第1步:抓取內容。
百度、360以及搜狗等通用搜索引擎的處理對象是整個互聯網中上千億的網頁,所以搜索引擎需要面對的首要問題是如何將這些網頁下載到自己的服務器上。
進行這一任務的是一種被稱為“網絡爬蟲”的程序,搜索引擎會派出無數的“網絡爬蟲”按照一定的策略(如廣度優先或者深度優先)完成網頁抓取任務。
知乎的搜索是站內搜索,處理對象是自己網站的內容,在用戶完成內容生產的同時,這些內容就存儲到了知乎的服務器上。所以這一步對知乎來說是沒有問題的。
搜索引擎的第2步:建立索引。
索引過程中一個很重要的步驟是分詞,如這句話“化妝品和服裝”,正確的分詞方法應該是[化妝品][和][服裝],如果將“和”、“服”兩個字結合分成“和服”的話那么結果自然就不會相關。分詞背后需要有強大的詞庫儲備(并且需要時時更新),以及強大的語義理解系統(比如上面的例子中,“和服”是一個有意義的詞,但在這個場景下這樣分詞是有問題的)。
搜索引擎會為每個網頁(文檔)建立索引,其中可能包括網頁包含的詞組、詞組出現的位置(比如“北京大學”這個詞,如果拆分成“北京”和“大學”兩個term,那么這兩個term的位置一定要緊挨著,并且北京在前,否則語義會發生極大的變化)和頻率、網頁的內外鏈、甚至qanchor數據(如果用戶搜索“A"這個關鍵詞,點擊了網頁“B",那么 B就是A的qancher)等。這些因子在決定搜索結果排序中都有很大的影響。
因為知乎的獨特性,每個回答對應的索引除了上面提到的部分因素外,還可能會包括贊同數、反對數、感謝數、所屬的話題、回答者(以及擅長的話題)等等。當然包含的因子越多,對搜索引擎的存儲和計算性能等都是巨大的挑戰。
建立索引這個步驟難度較大,即便是通用搜索引擎也在不停的優化。
搜索引擎的第3步:確定排序。
當用戶輸入一個query后,備選結果集合中的每一條結果最終會通過一系列計算過程最終得到一個分數,然后按照分數從高到低排序。一條結果的得分高低主要跟下面幾個因素有關,當然每個因素的權重因子也需要不斷的調整來提升準確性。
1、文本相關
這個很好理解,網頁(問答)中包含的詞組需要和搜索詞一致。
2、用戶行為模型
對知乎中的回答來說,有以下幾個真理:
/點贊多的結果要好于點贊少的結果;
/反對少的結果要好于反對多的結果;
/自己點過贊的結果要好于普通的結果;
/擅長問題所屬領域的回答者的答案要好于普通的回答者;如張三很擅長回答搜索領域相關的問題,李四擅長回答金融領域相關的問題,那么對于一個搜索領域的問題,張三的回答要好于李四的回答。這其中用戶擅長的話題可以采用用戶自己標注或者官方標注的方式,也可以根據用戶的回答記錄智能標注,比如現在很多領域中都會推薦最佳回答者。
/用戶最終有效點擊了的結果要好于用戶沒有點擊或者是無效點擊的結果。所謂有效點擊指的是用戶點擊并且有合理的停留時間,而不是點擊之后很快就走了。
3、網頁質量
在搜索引擎中如果某個網頁被識別為網頁質量差(作弊,廣告多,頁面空短),那么會被嚴重降權甚至屏蔽。
知乎上最近有人涉嫌借助知乎做問答營銷,如這篇文章提到的,這類結果除了依靠用戶舉報外也需要用戶算法來識別。此外抖機靈的回答某種程度上也需要進行打壓。
搜索是個很復雜的產品,技術門檻比較高,其中包含非常多的策略。即便是通用搜索引擎目前也在不斷優化當前的策略,同時也在添加新的策略。比如時效性策略,同義詞策略,網頁質量策略,網站權重策略等等。