四 搜索引擎的索引系統

目標:存的下,查的塊

1.1 信息

信息是能夠被傳達和理解的信息.

1.2索引

索引也是一種信息,是信息的信息,描述信息的信息.eg目錄

1.3倒排索引,倒排表,臨時倒排文件,最終倒排文件

倒排表是指存放在內存中的能夠追加倒排記錄的倒排索引。倒排表是迷你的倒排索引。

臨時倒排文件是指存放在磁盤中,以文件的形式存儲的不能夠追加倒排記錄的倒排索引。臨時倒排文件是中等規模的倒排索引。

最終倒排文件是指由存放在磁盤中,以文件的形式存儲的臨時倒排文件歸并得到的倒排索引。最終倒排文件是較大規模的倒排索引。

倒排索引作為抽象概念,而倒排表、臨時倒排文件、最終倒排文件是倒排索引的三種不同的表現形式。

1.4 其他概念

索引部分概念很多,因此本章4.2~4.4 節分別介紹全文檢索、文檔編號、正排索引、倒排索引的基本概念。在集中理解索引系統的主要概念后,接下來再了解索引創建中的一些計算細節。

2 全文檢索

全文檢索(full-text retrieval)技術的出現是信息檢索領域的一場革命,它細化了信息檢索的粒度,提供了實現多角度,多側面且全新的信息檢索體驗。因此搜索引擎全面采用了這種嶄新的技術,并使之成為主流的檢索方法。

早期的信息檢索主要通過檢索數據信息的外部特征,例如標題、作者、摘要、附錄及資料的編號等。這樣的檢索系統常見于圖書館的館藏圖書檢索中,它主要存在如下兩個大問題。

(1)檢索結果排序不理想。
(2)只能對標題進行檢索。

出現這些問題是因為沒有考慮到文檔內容(本章使用文檔籠統地代表書籍或者網頁)。全文檢索顧名思義,是對文檔的全部信息進行檢索,這些信息包括標題和正文等。簡單地說,全文檢索的內在本質歸納起來就是如下兩條。

(1)文檔的全部文字參與索引。
(2)檢索結果能夠提供檢索詞出現的實際位置。

在全文檢索的過程中,只需要用戶提供一個或多個檢索關鍵詞,不僅能檢索出命中文本,還能提供關鍵詞出現在文本中的位置.

3.1 文檔編號

一個唯一描述文檔的Id.

檢索在索引的基礎上完成,得到一組匹配關鍵詞的文檔編號.繼而文檔編號在文檔信息庫中取出,通過一系列計算戰士出來,文檔編號發揮重要作用.

3.2 文檔編號的方法

文檔編號需要滿足條件:
(1) 任何一個文檔在其生命周期只有一個編號.
(2) 任何兩個不同文檔編號不同
(3) 編號在計算中盡可能高效,并且便于存儲,越短越好

3.3 游戲編碼

使用這種方法進行編號長度壓縮.對于單調遞增的文件編碼,采用增量整數序列變為"差分編碼"
eg: 1, 16, 17, 35, 420, 23, 2944 表示的文檔編號分別為 ?前n項和.

好處:序列中的數字都比較小,便于存儲
壞處:獲取某個編碼需要從頭累加,且一旦卻是數據塊,那么后邊的編碼將無法計算

另一種變長編碼(ariable Byte Coding)

這時一種字節對齊的編碼方式,將整數轉化為二進制后,以7位為單位分段.每段段尾增加一位0表示最后一段,1表示還有后續段.
采用這種方式的好處是字節對齊,編碼和解碼都比較容易.

所以最終編碼方式為游戲編碼結合變長編碼處理文檔編號.
ps:變長編碼的好處在于,將原先的差分編碼進行優化壓縮,減少小數字占用空間.

4 倒排索引

4.1 經典的倒排索引

經典倒排索引


索引中的三個概念

命中率(Hit) 表示索引詞在文章中出現的位置和字體等信息
正排索引(Forward Index)
倒排索引(Inverted Index)

4.2 正排索引(前向索引)

正排索引
正排索引實例
冗余DocId的正排索引

正排索引是創建倒排索引的基礎.具有以下字段

(1) LocalId表示文檔的局部編號
(2) WordId表示文檔分詞后的編號,也稱"索引詞編號"
(3)NHits表示某個索引詞在文檔中出現的次數
(4)HitList表示某個索引詞在文檔出現的位置,相對于正文的偏移量(基于游戲編碼的差分序列,采用變長編碼的方式處理)

正排索引以文檔編號為視角看待索引詞,也就是通過文檔編號找索引詞.
然而全文檢索的特性是通過關鍵詞來檢索,而不是通過文檔編號來檢索,因此正排不能滿足全文索引要求,但是卻為倒排索引創造了有力條件

4.3 倒排索引

倒排索引字典-記錄表

倒排索引是一種以關鍵字和文件編號結合,并以關鍵詞作為主鍵的索引結構

倒排索引兩部分:
(1)由不同索引詞組成索引表,稱為 "詞典"
(2)由每個索引詞出現過的文檔以及命中位置等信息組成,稱為"記錄表"

倒排索引中的DocId存放順序問題.

三種策略
(1) 按照DocId升序
(2) 按照索引詞出現次數降序
(3) 記錄表分塊存放,塊內按照DocId升序,塊間按照PageRank存放

第三種方案既照顧了(1) 的有序壓縮問題,又照顧了重要文檔優先檢索的需要.

總結:正排索引和倒排索引的關系
本質講,存在這樣兩個空間,一個稱為索引詞空間,一個稱為文檔空間
正排索引理解為定義在文檔空間到索引空間的一個映射.任意一個文檔對應唯一的一組索引詞
倒排索引理解為定義在索引空間到文檔空間的一個映射.任意一個索引詞對應唯一命中文檔
因此,從文檔到正排索引,從正排索引到倒排索引可以理解為這種關系,給出一個索引詞,就可以通過倒排索引得到命中文檔及位置信息

5 數據規模的估計

對于tb數量級的文檔,單純的保存文檔編號,就需要很大一部分空間,家生Hit等信息,那么就問題更大了.所以下邊主要涉及"

6 設計存儲規模的一些計算

6.1 正排表和倒排表的合并

下載系統將抓取的網頁存放在網頁庫中,分析系統在分析后得到網頁對象發送給索引系統.因此,索引系統一直得到這樣的網頁對象

正排表
倒排表
正排表與倒排表合并的結構

注:正排表和倒排表合并就是將正排表的數據追加到倒排表的數據過程,追加后,正排表不保留.而倒排在內存中存儲一定的記錄后,成批順序寫入磁盤,成為臨時倒排文件

臨時倒排文件

6.2 多個臨時倒排文件的歸并

方法:
(1) 拉鏈法和二路歸并
(2) 拉鏈法和多路歸并

歸并的方法:
(1) 從頭開始讀取兩個臨時倒排文件的一部分(eg每次讀取10MB)
(2) 分別對DocId進行解壓,將解壓的差分序列還原成原始差分序列
(3) 進行歸并操作
(4) 歸并結果進行壓縮
(5) 寫入歸并后的臨時倒排文件1&2中

這種開鏈法采用的是處理大文件的一種通用思路,即每次僅取出大文件的一部分在內存中進行計算.

注:對于2路歸并,需要log(2)64,這樣對于一個大文件,會有太多的臨時文件產生.所以影響效率.于是使用多路歸并更好點

6.3 倒排索引分布式存儲

兩種方案
多索引節點(多主機)方法:加快倒排文件創建速度;提高檢索效果

按照DocId進行劃分結果稱為"局部倒排文件"
按照WordId 進行劃分結果稱為"全局倒排文件"

注:全局/局部都是相對于索引詞來講的.

局部方案
全局方案

全局方案好處:索引一個詞,可能只需要訪問全部包含索引詞的節點,

減少了磁盤I/O,當檢索兩個詞時,那么可以做到并發執行(兩個節點),如果將索引看作是服務,那么可以做到64個窗口同時提供服務,局部方案則需要單窗口排隊服務

;局部方案則需要訪問所有部分包含索引詞的節點.


缺點:一蹦全崩;等待索引節點全部傳輸,速度慢,低效

局部方案:相對有利點:(1)可靠性高,(2)降低網路負載,提高查詢效率
充分利用網絡寬帶,對于一個索引,并發傳輸
缺點:單窗口排隊

所以:局部方案有利于并發獲取索引節果;全局方案有利于查詢.so 局部方案在查詢結果獲取方面是有優勢的,且可靠性保證,因此業界使用.但當檢索詞相對均勻分布時,那么全局方式在性能上是最佳的

6.4 倒排文件緩存

6.5 倒排索引詞典統計信息的計算

在索引系統中,關于索引詞出現文檔數的統計是在查詢請求發生之前預先計算好的,是倒排表的詞典部分不可分割的一部分.--統計員(全局的)

7 倒排索引文件的創建過程

7.1 創建倒排表
單個索引節點倒排文件的創建過程

計算角度講,臨時倒排文件創建過程包括磁盤讀取(從網頁庫讀取一個文檔),計算(正排計算,歸并),寫入磁盤(寫入臨時倒排文件)

所以可以使用兩個線程并發處理,流水線方式

兩個線程進行并發處理

7.2 計算統計信息

方法1:從正排表開始統計;(耗費一定的內存空間)

方法1,基于全局索引詞出現文檔次數的統計方法

方法2:從臨時文件開始統計;(需要等待最慢的索引節點計算完成后開始計算)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容