簡單寫一個ES系列,希望對NewSql、檢索有興趣的同學可以快速入手,爭取在7月份完成該系列文章
ES入門系列
- ES入門系列 — 1 windows系統安裝Elasticsearch
- ES入門系列 — 2 Elasticsearch介紹
- ES入門系列 — 3 走進elasticsearch
- ES入門系列 — 4 索引
- ES入門系列 — 5 查詢語法
- ES入門系列 — 6 文檔相關性及排序
這一節介紹索引,作爲一個搜索引擎,索引是搜索的核心元素,之所以搜索引擎這麼快速,問題的關鍵也就是索引是否高效的問題,這裏涉及到索引的IO,已經索引的檢索,比如mysql B+樹、mongodb B-樹,這本質都是數據檢索的側重點不同(至於B+、B-樹的數據結構差異,不瞭解的同學建議先網上科普,有助於存儲知識體系的瞭解)。而我們該系列 Elasticsearch 則是基於倒排索引,我們都知道 Elasticsearch 是基於 Lucence (https://lucene.apache.org/)開發的,lucence 樓主也用過,但現在工作側重點不太涉及,所以這裏就不鋪開講解
倒排索引&正排索引
在解釋什麼是倒排索引,我們先看一個簡單的倒排索引的例子
假如有兩個文檔:
- The quick brown fox jumped over the lazy dog
- Quick brown foxes leap over lazy dogs in summer
如果採用正排索引,那很容易理解,就像目錄一樣,你只要找到對應的目錄,就可以看到這個目錄有哪些章節,對尚明2個簡單文檔進行倒排索引如下圖:
上圖,從左到右你很明顯,可以看到一個文檔有哪些詞語,但是你確如果基於行,如果文檔數量幾千萬,你卻很難知道一些詞存在哪些文檔。所以,我們就需要倒排索引了,爲了創建倒排索引,我們首先將每個文檔的 content
域拆分成單獨的 詞(我們稱它爲 詞條
或 tokens
),創建一個包含所有不重複詞條的排序列表,然後列出每個詞條出現在哪個文檔。
現在,如果我們想搜索某個詞,比如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
索引操作
索引注意事項
待編輯,待完善====