作者:LogM
本文原載於 https://segmentfault.com/u/logm/articles,不允許轉載~
本文是《這就是搜索引擎》的讀書筆記
1. 概述
1.2 搜索引擎技術發展史
- 第一代:文本檢索。關鍵詞與網頁內容的相關程度。
- 第二代:鏈接分析。PageRank。
- 第三代:用戶中心。理解用戶需求。
2. 爬蟲
2.1 通用爬蟲框架
2.3 爬蟲質量的評價標準
- 抓取網頁覆蓋率、抓取網頁時新性、抓取網頁重要性
- 爲了同時滿足上述3個標準,google用了多套不同的爬蟲,一些關注時新性,一些關注覆蓋率。
2.4 抓取策略
- 寬度優先遍歷:暴力但有效
- 非完全PageRank:因爲PageRank需要拿到所有的頁面計算纔是準確的,爬蟲抓取的時候沒有看到所有頁面,所以叫"非完全"
- OPIC:改進PageRank,實時計算
- 大站優先
2.5 更新策略
- 歷史參考策略:歷史上變動比較快的,抓取頻繁一點,一般用泊松過程建模
- 用戶體驗策略:保存網頁的多個歷史版本,查看不同歷史版本對用戶點擊的影響。所以用戶點擊不到的頁面,即使更新快,也不用抓取。
- 聚類抽樣策略:更新快的頁面有一些類似的特徵
2.6 暗網抓取
- 抓取常規網頁鏈接不到的信息
2.7 分佈式爬蟲
- 一致性哈希確定每個爬蟲負責哪些url的抓取
3. 索引
3.1 倒排索引的結構
- 單詞字典 + 倒排列表
3.4 建立索引
- 兩遍文檔遍歷法:完全在內存中構建
- 排序法:內存滿時,對中間文件排序後存到磁盤,最後再合併所有的中間文件。整個過程,整個字典都在內存裏,字典有可能過大。
- 歸併法:每個中間文件都是一套倒排索引(含各自的字典),最後再把所有的倒排索引合併。
3.6 動態索引與索引更新
- 完全重建策略:臨時索引與老索引的文檔全部取出重新建索引,重建的代價高,但主流搜索引擎都採用該方式
- 再合併策略:臨時索引與老索引進行索引合併(不是文檔取出重新建索引,而是合併)
- 原地更新策略:再合併策略的升級,臨時索引追加到老索引
3.7 查詢
- 一次一文檔:每個文檔對query中所有詞計算相似度
- 一次一單詞:對query中每個詞計算文檔相似度,每個文檔累加每個query詞的相似度
- 跳躍指針:因爲倒排索引一般是壓縮保存的,跳躍指針幫助快速定位需要的文檔
3.8 多字段索引
有時候需要區分不同的字段來索引,比如"標題"、"正文"、"摘要"等字段。
- 多索引方式:爲每個字段都建立一份倒排索引
- 倒排列表方式:在每個倒排列表的後面追加一個字段,表示該關鍵詞是在哪個字段出現
- 擴展列表方式:用擴展列表標明每個字段的開始和結尾位置,結合倒排列表中關鍵詞的位置,可以知道關鍵詞在哪個字段。實際使用常用這個方法
3.9 短語查詢
- 位置信息索引:利用倒排列表中關鍵詞的位置信息判斷是否組成短語
- 雙詞索引:"首詞"的倒排索引中有指向"下詞"的指針,"下詞"又有指針指向倒排列表
- 短語索引:會導致字典急劇膨脹,一般只用於熱門短語
3.10 分佈式索引
索引體積大,一臺服務器存不下
- 按文檔劃分:按文檔對索引文件進行切分。擴展性、容錯性、對查詢方式的支持都較好
- 按單詞劃分:按單詞字典對索引文件進行切分
4. 索引壓縮
5. 檢索與排序
把與用戶搜索詞最相關的結果排在前面
- 布爾模型
- 向量空間模型:TF-IDF + cosine距離
- 概率檢索模型:BM25
- 語言模型:從文檔生成用戶搜索的概率多大
- 機器學習排序
- 評價標準:準召、P@10、MAP
6. 鏈接分析
6.2 重要的概念模型
- 隨機遊走模型:模擬用戶的瀏覽行爲,PageRank
- 子集傳播模型:從一個特殊子集出發,將權重傳遞到其他網頁,HINTS
7. 雲計算與雲存儲
8. 網頁反作弊
8.1 內容作弊
- 關鍵詞堆砌、熱門關鍵詞、標題作弊、meta信息作弊……
- 內容農場:僱人寫垃圾文章,比機器作弊更難被判定
8.2 鏈接作弊
- 鏈接農場、購買鏈接、購買域名……
8.3 頁面隱藏作弊
- IP Cloaking、User Agent Cloacking、頁面重定向、頁面隱藏……
8.4 web2.0 作弊
- 博客作弊、點評作弊、Tag作弊、個人Profile作弊……
8.5 反作弊的通用思路
- 子集傳播模型:信任傳播模型(如TrustRank)、不信任傳播模型(如BadRank)
- 異常發現模型(如SpamRank)