概念
ElasticSearch使用一種稱之爲 倒排索引 的數據結構,實現快速的全文索引。
一個倒排索引由 文檔中所有不重複的詞 + 包含對應的詞的文檔列表 組成。
倒排索引舉例
比如有兩個文檔,有如下內容:
1. The quick brown fox jumped over the lazy dog
2. Quick brown foxes leap over lazy dogs in summer
爲了創建倒排索引,
第一步工作 —— 分詞(分出來的單獨的詞,我們稱之爲“詞條”或“token”);
第二部工作 —— 創建一個包含不重複詞條的排序列表,並列出該詞條出現在哪個文檔。結果如下所示:
Term Doc_1 Doc_2
-------------------------
Quick | | X
The | X |
brown | X | X
dog | X |
dogs | | X
fox | X |
foxes | | X
in | | X
jumped | X |
lazy | X | X
leap | | X
over | X | X
quick | X |
summer | | X
the | X |
------------------------
這就是乞丐版本的倒排索引。
如果我們想搜索quick brown,我們只需要查找包含各個詞條的文檔:
Term Doc_1 Doc_2
-------------------------
brown | X | X
quick | X |
------------------------
Total | 2 | 1
兩個文檔都匹配,但是第一個文檔比第二個的匹配度更高,如果我們使用 僅計算匹配詞條數量 的 簡單相似性算法,我們可以說,查詢的相關性第一個文檔比第二個文檔更佳。
但是當前的倒排索引有一些問題:
- Quick和quick以獨立的詞條出現,然而用於認爲它們是同一個詞;
- fox和foxs相似,它們有相同的詞根;
- jumped和leap雖然沒有相同的詞根,但是它們的意思相近,是同義詞。
所以:
使用我們乞丐版的倒排索引搜索+Quick +fox不會得到任何文檔(+前綴表示這個詞必須存在)。但是用戶覺得,第一個文檔包含quick fox,第二個文檔包含Quick foxes。這兩個文檔都滿足的需求。爲了滿足常規需求,我們必須優化乞丐版倒排索引,如:
- 將索引Term全部轉爲小寫;
- 複數單詞只提取詞根作爲Term。如foxes只提取fox;
- jump和leap是同義詞,可只索引jump。
Term Doc_1 Doc_2
-------------------------
brown | X | X
dog | X | X
fox | X | X
in | | X
jump | X | X
lazy | X | X
over | X | X
quick | X | X
summer | | X
the | X | X
------------------------
此時我們搜索+Quick +fox還是會失敗,因爲索引中已經沒有Quick了。所以我們還得對搜索條件做同樣的標準化處理,才能匹配到兩個文檔。
分詞和標準化的過程稱之爲分析。
分析和分析器
分析包含如下過程:
- 首先,將文本切分成適合於倒排索引的獨立的詞條(分詞);
- 之後,將詞條統一化爲標準格式以提高可搜索性,或者recall
分析器實際上是將三個功能封裝到了一個包裏:
- 字符過濾器
字符串按順序通過層層 字符過濾器。他們的任務是在分詞前整理字符串,字符過濾器的作用如 去掉HTML,將&轉化爲and等。 - 分詞器
過濾後的字符串被分詞器分爲單個的詞條。
一個簡單的分詞器遇到空格或者標點可能會將文本拆成詞條。 - Token過濾器
詞條按順序通過每個Token過濾器,這個過程可能會改變詞條(小寫化Quick),刪除詞條(“a”,‘’an",“the”之類的無用詞),增加詞條(jumped和leap這種同義詞)。
ElasticSearch提供了開箱可用的預包裝分析器。
ElasticSearch內置分析器
"Set the shape to semi-transparent by calling set_trans(5)"
標準分析器
ElasticSearch默認使用的分析器。分析各種語言文本最常用的選擇。它根據Unicode聯盟定義的 單詞邊界劃分文本,刪除絕大多數標點,最後將詞條小寫。
set, the, shape, to, semi, transparent, by, calling, set_trans, 5
簡單分析器
簡單分析器在任何不是字母的地方分割文本,將詞條小寫。
set, the, shape, to, semi, transparent, by, calling, set, trans
空格分析器
在空格的地方分割文本。
Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
語言分析器
特定語言分析器可以分析很多語言(https://www.elastic.co/guide/en/elasticsearch/reference/5.6/analysis-lang-analyzer.html),他們可以考慮制定語言的特點(如英語分析器附帶了一組無用詞過濾器,過濾a,the等)
set, shape, semi, transpar, call, set_tran, 5