上一篇,我們介紹了 ES 檔案的基本 CURE 和批量操作,我們都知道倒排索引是搜索引擎非常重要的一種資料結構,什么是倒排索引,倒排索引的原理是什么,
1 索引程序
在講解倒排索引前,我們先了解索引創建,下圖是 Elasticsearch 中資料索引程序的流程,

從上圖可以看到,檔案未在 ES 中進行索引,而是 由 Analyzer 組件對其執行一些操作并將其拆分為 token/term,然后將這些術語作為倒排索引存盤在磁盤中,假設我們有兩個名為 name 和 age 欄位,當要將檔案索引到 ES 時,Analyzers 組件 以某些定界符(有默認定界符,例如空格,句號等)將它們分割開獲取 token,再對每個 token 應用特定的過濾器,經過分析的這些標記稱為 term,然后將這些 term 針對該欄位)存盤在倒排串列中,
2 倒排索引
2.1 正排與倒排索引
一般在我們閱讀圖書,我們會根據目錄快速定位想要閱讀的章節,過了一段時間,你想要的回顧之前某一個知識點,你發現從目錄難以查找到對應的地方,這時你可能就會從索引頁從去查找對應內容索引,從而找到頁碼,


搜索引擎其實跟我們的使用圖書很相似,下面我來對圖書和搜索引擎進行一個簡單的類比,來看一下搜素引擎中正排和倒排索引,
-
圖書
- 正排索引-目錄頁
- 倒排索引-索引頁
-
搜索引擎
- 正排索引-檔案 Id 到檔案內容和單詞的關聯
- 倒排索引-單詞到檔案 Id 的關系
2.2 倒排索引的核心組成
舉個例子,假設我們有 3 個檔案:
Doc 1:breakthrough drug for schizophrenia
Doc 2:new schizophrenia drug
Doc 3:new approach for treatment of schizophrenia
經過分析,檔案中的術語如下
| 檔案 | 分詞結果 |
|---|---|
| Doc 1 | breakthrough,drug,for,schizophrenia |
| Doc 2 | new,schizophrenia,drug |
| Doc 3 | new,approach,for,treatment,of |
倒排串列的元資料結構:
(DocID;TF;<POS>)
其中:
-
DocID:出現某單詞的檔案ID
-
TF(詞頻):單詞在該檔案中出現的次數
-
POS:單詞在檔案中的位置
則它們生成的倒排索引
| 單詞 | 逆向檔案頻率 | 倒排串列(DocID;TF; |
|---|---|---|
| breakthrough | 1 | (1;1;<1>) |
| drug | 2 | (1;1;<2>),(2;1;<3>) |
| for | 2 | (1;1;<3>),(3;1;<3>) |
| schizophrenia | 2 | (1;1;<4>),(2;1;<2>) |
| new | 2 | (2;1;<1>),(3;1;<1>) |
| approach | 1 | (3;1;<2>) |
| treatment | 1 | (3;1;<4>) |
| of | 1 | (3;1;<5>) |
-
ES 倒排索引包含兩個部分
-
單詞詞典 (Term Dictionary),索引最小單位,記錄所有檔案的單詞,記錄單詞到倒排串列的關聯關系
- 單詞詞典一般都會非常多,通過 B+ 樹或 Hash 表方式以滿足高性能的插入與查詢
-
倒排串列(Posting List)-由倒排索引項(Posting)組成
- 檔案 ID
- 詞頻 TF,該單詞在檔案中出現的次數,用于相關性評分
- 位置(Position),單詞在檔案中分詞的位置,用于陳述句搜索(phrase query)
- 偏移(Offset),記錄單詞的開始結束位置,實作高亮顯示
-

ES 也可以指定對某些欄位不做索引
- 優點:節省存盤空間
- 缺點:欄位無法被搜索
3 總結
在之前文章說了 ES 的檔案是基于 JSON 格式,在我們創建索引的時候,對每一個檔案記錄對應索引相關的資訊,在對倒排索引進行搜索時,查詢單詞是否在單詞字典,獲取單詞在倒排串列的指標,獲取有該單詞單詞的檔案 Id 串列,通過 ES 的倒排索引,我們輕易對全文進行快速搜素,
系列文章
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?
【Elasticsearch 7 探索之路】(二)檔案的 CRUD 和批量操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/44442.html
標籤:大數據
上一篇:Hive表的幾種存盤格式
