實現本身的搜索引擎(一)

搜索引擎的原理其實很簡單,寫出來沒兩頁紙,可是實現中的各類細節寫成的論文能夠堆滿兩個圖書館。算法

讓咱們先從原理提及。api

首先須要用輸入數據建立索引,對於互聯網搜索引擎,輸入數據是一個個由爬蟲從網上抓回來的網頁,通過清洗以後進行內容抽取,而後整理成統一的格式交給索引程序建立索引。
索引由如下幾個基本的組成部分:
1. 倒排索引,這一部分存放"關鍵字"->文檔的映射,通常來講會把同一個關鍵字對應的全部文檔按照統一方法整理成一個排好序的線性結構,以便遍歷和各類AND/OR之類的操做。
2. 正排索引,這一部分存放每一個文檔的各類屬性
索引程序要乾的事就是從源數據中拿出每一個關鍵字和各類屬性,整理成索引文件。文本變成關鍵字的過程叫作關鍵字提取,對於英語等語言,這個過程相對容易,通常就是進行大小寫、全角/半角轉換,拼寫檢查,字根提取等工做,例如源文本中的「goes」,「going」,「went」統一轉換爲「go」等;對於中文來講這個過程會比較麻煩,須要進行分詞,經常使用的分詞方法有單字切分、正/反向最大匹配、n元分詞、隱馬模型等。沒有那一種單一的方法能知足全部需求,因此實際應用中通常會將多種方法結合使用。數據結構

索引建立好以後就能夠搜索了,一個典型的搜索過程有這幾個步驟:
1. 倒排索引的查詢,通常稱爲「全文檢索」,根據輸入的關鍵字序列T1,T2..Tn,在倒排索引中找到對應的文檔鏈,根據查詢需求進行AND或者OR的組合,獲得一個知足條件的結果集,對於典型的全文搜索引擎,這個階段還須要計算每一個文檔的文本相關性以便排序,經常使用的文本相關性算法有TF-IDFBM25VSMLM等。
2. 正排索引過濾,在獲得知足全文檢索的文檔集後,對每一個文檔檢查其屬性是否知足過濾條件,若是不知足則丟棄,剩下的就是最終的結果集。
3. 排序,全文搜索引擎通常的作法是:基於倒排索引查詢獲得的文本相關性,結合正排索引中的各類屬性進行加權,例如給較新的文檔加分等,最終獲得一個分值,而後對結果集進行排序,保留前若干個結果返回給用戶。網站

以上的過程就是全文搜索引擎的大體工做過程,其中複雜之處在於如何評估輸入的查詢條件和文檔之間的匹配程度,文本相關性只能知足一部分需求,還須要其它一些因素來對文檔得分進行調整,例如Google的PageRank就是經過進出的連接對文檔重要性進行評估的一種方法。搜索引擎

垂直搜索引擎的基本工做原理和上述的同樣,可是側重點不一樣,通常來講垂直網站更重視文本以外的各類屬性,例如電商網站會很關注商品的庫存量和售價,若是排序結果將無庫存或者過於昂貴的商品放在最前面會嚴重影響銷售量;本地搜索網站會很關注POI和用戶之間的距離,若是將一家距離用戶很遠的商戶排在結果的前面一樣也會形成很很差的體驗。google

另外還有一個很重要的問題就是索引的更新,對於互聯網搜索引擎來講,通常會採用按期重建的策略,例如google就是每一個幾個小時將一個索引塊整個重建,可是這種策略對於電商網站顯然不行,例如在淘寶上能夠進行拍賣,用戶出價會致使拍賣價格迅速變化,須要在很短期內迅速將這個價格的變化反映到搜索結果中,這就須要一些專門設計的索引結構來支持。spa

下一節咱們將看看搜索引擎中的一些基本數據結構設計

相關文章
相關標籤/搜索