1 背景
做搜索引擎有有2年時間了,算是有個基本的入門。決定寫一個系列博客,記錄下自己所認識的搜索引擎,也希望對新入行的朋友有些幫助。
2 概述
搜索與推薦
互聯網上有海量的信息,從互聯網上獲取信息或娛樂,最主要的2個途徑就是搜索和推薦。
-
搜索:是用戶主動去查詢與獲取自己想要的信息,用戶有明確的意圖,知道自己想要什么。基本所有app的首頁,都會有一個搜索框,提供搜索功能。
-
推薦:web或app主動向用戶推薦他可能感興趣的內容,用戶從被推薦的內容中,挑選自己感興趣的內容觀看,是一個偏被動的過程。新浪官網首頁,淘寶首頁等這些頁面提供的大量信息,都是推薦,有些是非個性化的,有些是個性化的。今日頭條的信息流,也是典型的個性化推薦產品。
搜索與推薦的最大差異,就是主動與被動。
搜索領域
當前搜索推薦都涉及互聯網的各個領域,可以簡單的粗分成這2類
- 綜合領域:像百度、google、搜狗、360等,搜索全網內容,一般叫大搜。一般搜索的內容是互聯網上的網頁,多數是通過爬蟲獲取到,通過網頁的標題和正文來搜索。
- 垂直領域:像視頻、音樂、電商、小說等,只搜索特定領域的內容,一般叫垂搜或小搜。垂域搜索的數據,往往是非常結構化的,比如淘寶里的商品,優酷里的影片信息等,與網頁相比,文本偏短。
除此之外,還有像地圖、酒店、機票等各種垂直領域的搜索。每個領域都有自己的一些特殊業務訴求。
搜索功能
一般搜索產品都至少包括2個功能:
- suggest(智能提示或聯想):用戶在搜索框輸入過程中,下拉列表展現的補全結果,猜用戶想搜索的內容,用戶一旦點擊,就可以立即發起搜索請求,減少用戶輸入動作,提高用戶體驗。
- 搜索:用戶在搜索框輸入完內容,點擊搜索按鈕或回車,看到完整搜索結果。
- 相關搜索(related searches):google和百度搜索結果頁的底部,都有展示相關搜索,即搜索query_a的用戶,也喜歡搜索query_b, query_c等。
suggest和相關搜索技術相對簡單些,可以算是搜索的一個子集,所以后面不再多介紹。
幾個基本概念
首先介紹幾個縮寫基本概念:
-
縮寫
-
query:搜索關鍵字,也叫keyword
-
doc:被搜索的內容,比如一個網頁,一部影響,一件商品,在索引里是一條記錄,都叫一個doc
-
QU:query understanding,查詢理解,即對query進行分析,得到一些用戶意圖相關的信息,輔助檢索
-
index:索引
-
term:query分詞后,每個詞,稱為一個term
-
-
正排索引:以doc作為key,以這個doc包含的term或屬性信息作為value,就是常規的數據庫存儲結構。便於通過docId,查詢這個doc的屬性信息。想像一下,如果要檢索出所有包含“apple”的網頁,需要將索引里所有doc遍歷一遍。
-
倒排索引:與正排相反,以term作為key,以包含這個term的所有doc的ID作為value,構建出的KV結構。如果要檢索出包含“apple”的網頁,只需要以apple作為key,一把就能取出所有包含apple這個詞的網頁。
3. 流程和架構
搜索引擎的在線檢索架構如圖1所示。主要包含以下幾個模塊:查詢理解(QU),基礎檢索,精排(重排),摘要(高亮、飄紅)。除此之外,可能還會有運營干預之類的模塊。
垂搜與大搜的架構基本一致。相比大搜,垂搜在某些模塊上會簡化。比如摘要,垂搜會比大搜簡單很多。

- 倒排索引:
下面簡單介紹下每個模塊的功能
3.1 檢索服務(編排)
圖1中的檢索服務,實際上是個編排模塊,接受端側的搜索請求,負責整個在線檢索的流程串通,本身沒有實質性的功能。所以,也是其中最簡單的一個模塊。
編排模型會依次調用查詢理解、基礎檢索、精排、摘要這4個模塊,每一個模塊的輸出,作為下一個模塊的輸入。
3.2 查詢理解(QU)
QU的功能,是對用戶輸入的query進行分析,以支撐后續的搜索排序效果。
QU的主要功能包括:
-
分詞:搜索|是|什么
-
實體識別:人名、地名、影片名、機構名、歌曲名等等
-
意圖/需求識別:常見的意圖類型包括:問答、新聞、軟件下載、視頻、小說等
-
同義詞識別:
-
查詢改寫:
-
糾錯:搜索陰晴 -> 搜索引擎
-
詞權重計算:計算query分詞后,每個term的權重是多少
-
核心詞選擇:query分詞后,哪些詞是必須命中的,即核心詞只要沒命中這個內容就不會被搜索出來
-
緊密度分析:query中,相鄰兩個詞之間的緊密關系,是否需要連續命中
QU中很多模塊的效果,依賴於NLP能力,例如分詞、實體識別、意圖識別等。像糾錯、改寫等,也強依賴於用戶的行為日志。
3.3 基礎檢索
基礎檢索(粗排)是做第一輪檢索,從全量索引中召回網頁候選集(例如top1000),並做一個排序。整個搜索的過程,就像是一個漏斗篩選的過程,基礎檢索是第一次篩選,如果沒有被篩選出來,就不會成為本次的搜索結果。
由於基礎檢索涉及的網頁量非常大,對性能要求高,所以一般只用少量最重要的特征,相對簡單的策略來做召回。不亦使用太多的特征和太復雜的模型。
檢索的過程主要分2步,
-
根據query的核心詞term,從倒排索引中取出倒排拉鏈。每個核心詞對應一個倒排拉鏈,多個核心詞的拉鏈取交,得到基礎檢索的一個候選集合。
-
對候選集中的每個doc,計算它與query的匹配分數以及doc本身的質量得分,合並后得到一個總的分數並做降序排序。最終,再按一個閾值(例如1000)做截斷,作為基礎檢索的結果。
一個網頁是否能被基礎檢索召回,主要取決於幾個因素:1)doc是否滿足term倒排求交條件;2)doc與query的相關性得分;3)doc本身的質量(靜態特征,與query無關)
3.4 精排
精排是對基礎檢索召回的結果,做一個更精准的排序。由於基礎檢索召回的數量有限(1000條以內),相比粗排,精排需要處理的doc數量少了很多,就可以用更豐富的特征,更復雜的算法模型(LTR),以得到更精准的排序效果。
除了使用排序模型,精排也可以使用一些人工策略來調權。
在精排之后,也會根據運營干預的策略,對結果做進一步的調整干預。
最終,根據翻頁參數,只返回10或15條結果給上游。
3.5 摘要
精排返回的結果,還要補充些信息,才能在終端界面上展示。例如淘寶搜索結果,需要展示商品的圖片、標題、銷量等一系列信息。
一般的垂直領域,只要把doc的幾個屬性展示出來即可。網頁搜索比較特殊,一般網頁正文很長,但是最終展示的只有簡短的三兩行文字片段。這個片段,就是網頁的摘要信息。摘要模塊的主要目標,主要就是從網頁正文中,抽取出匹配最好的那一兩個片段,並把與query匹配的那些詞標紅,讓用戶直觀的看到這個網頁與query的匹配關系。
4 結束語
上述是在線檢索的一個基本流程,每一個模塊展開,都有大量的內容。后續展開詳解。