ES入門系列 — 4 索引及分析器

簡單寫一個ES系列,希望對NewSql、檢索有興趣的同學可以快速入手,爭取在7月份完成該系列文章

 

ES入門系列

這一節介紹索引,作爲一個搜索引擎,索引是搜索的核心元素,之所以搜索引擎這麼快速,問題的關鍵也就是索引是否高效的問題,這裏涉及到索引的IO,已經索引的檢索,比如mysql B+樹、mongodb B-樹,這本質都是數據檢索的側重點不同(至於B+、B-樹的數據結構差異,不瞭解的同學建議先網上科普,有助於存儲知識體系的瞭解)。而我們該系列 Elasticsearch 則是基於倒排索引,我們都知道 Elasticsearch 是基於 Lucence (https://lucene.apache.org/)開發的,lucence 樓主也用過,但現在工作側重點不太涉及,所以這裏就不鋪開講解

 

倒排索引&正排索引

         在解釋什麼是倒排索引,我們先看一個簡單的倒排索引的例子

假如有兩個文檔:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

如果採用正排索引,那很容易理解,就像目錄一樣,你只要找到對應的目錄,就可以看到這個目錄有哪些章節,對尚明2個簡單文檔進行倒排索引如下圖: 

                2個文檔的正排索引

上圖,從左到右你很明顯,可以看到一個文檔有哪些詞語,但是你確如果基於行,如果文檔數量幾千萬,你卻很難知道一些詞存在哪些文檔。所以,我們就需要倒排索引了,爲了創建倒排索引,我們首先將每個文檔的 content 域拆分成單獨的 詞(我們稱它爲 詞條 或 tokens ),創建一個包含所有不重複詞條的排序列表,然後列出每個詞條出現在哪個文檔。

                        2個文檔倒排索引

現在,如果我們想搜索某個詞,比如summer,那麼可以很方便的知道 doc_2 存在該詞。如你搜索 Quick brown,你可以很方便知道doc_1 存在 brown,doc_2 存在Quick brown,僅計算匹配詞條,我們知道明顯doc_2相關性要高一點(當然,關於排序和文檔相關性,樓主還在ES入門系列 — 6 文檔相關性及排序 繼續說明 )

注意:ES內部其實也用有模塊是用到正排索引的,如doc values和fielddata,見ES入門系列 — 6 文檔相關性及排序

 

索引分析器

 

索引映射

 

字段分析器可以從三個層面進行定義:按字段(per-field)、按索引(per-index)或全局缺省(global default)。Elasticsearch 會按照以下順序依次處理,直到它找到能夠使用的分析器。索引時的順序如下:

  • 字段映射裏定義的 analyzer ,否則
  • 索引設置中名爲 default 的分析器,默認爲
  • standard 標準分析器

在搜索時,順序有些許不同:

  • 查詢自己定義的 analyzer ,否則
  • 字段映射裏定義的 search_analyzer ,否則
  • 字段映射裏定義的 analyzer ,否則
  • 索引設置中名爲 default_search 的分析器,默認爲
  • 索引設置中名爲 default 的分析器,默認爲
  • standard 標準分析器

注意:有時在索引時和搜索時使用不同的分析器是合理的。我們可能要想爲同義詞建索引(例如,所有 quick 出現的地方,同時也爲 fast 、 rapid 和 speedy 創建索引)。但在搜索時,我們不需要搜索所有的同義詞,取而代之的是尋找用戶輸入的單詞是否是 quick 、 fast 、 rapid 或 speedy

 

索引操作

 

 

索引注意事項

 

 

待編輯,待完善====

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章