上一篇,咱們介紹了 ES 文檔的基本 CURE 和批量操做。咱們都知道倒排索引是搜索引擎很是重要的一種數據結構,什麼是倒排索引,倒排索引的原理是什麼。數據結構
1 索引過程app
在講解倒排索引前,咱們先了解索引建立,下圖是 Elasticsearch 中數據索引過程的流程。性能
從上圖能夠看到,文檔未在 ES 中進行索引,而是 由 Analyzer 組件對其執行一些操做並將其拆分爲 token/term。而後將這些術語做爲倒排索引存儲在磁盤中。假設咱們有兩個名爲 name 和 age 字段,當要將文檔索引到 ES 時,Analyzers 組件 以某些定界符(有默認定界符,例如空格,句號等)將它們分割開獲取 token,再對每一個 token 應用特定的過濾器。通過分析的這些標記稱爲 term。而後將這些 term 針對該字段)存儲在倒排列表中。搜索引擎
2 倒排索引指針
2.1 正排與倒排索引code
通常在咱們閱讀圖書,咱們會根據目錄快速定位想要閱讀的章節,過了一段時間,你想要的回顧以前某一個知識點,你發現從目錄難以查找到對應的地方,這時你可能就會從索引頁從去查找對應內容索引,從而找到頁碼。blog
搜索引擎其實跟咱們的使用圖書很類似,下面我來對圖書和搜索引擎進行一個簡單的類比,來看一下搜素引擎中正排和倒排索引。索引
2.2 倒排索引的核心組成token
舉個例子,假設咱們有 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 倒排索引包含兩個部分
ES 也能夠指定對某些字段不作索引
3 總結
在以前文章說了 ES 的文檔是基於 JSON 格式,在咱們建立索引的時候,對每個文檔記錄對應索引相關的信息。在對倒排索引進行搜索時,查詢單詞是否在單詞字典,獲取單詞在倒排列表的指針,獲取有該單詞單詞的文檔 Id 列表,經過 ES 的倒排索引,咱們輕易對全文進行快速搜素。