ElasticSearch的倒排索引和分析器

概念

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

分析器實際上是將三個功能封裝到了一個包裏:

  1. 字符過濾器
    字符串按順序通過層層 字符過濾器。他們的任務是在分詞前整理字符串,字符過濾器的作用如 去掉HTML,將&轉化爲and等。
  2. 分詞器
    過濾後的字符串被分詞器分爲單個的詞條。
    一個簡單的分詞器遇到空格或者標點可能會將文本拆成詞條。
  3. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章