【Elasticsearch 7 探索之路】(四)Analyzer 分析


上一篇,什么是倒排索引以及原理是什么。本篇講解 Analyzer,了解 Analyzer 是什么 ,分詞器是什么,以及 Elasticsearch 內置的分詞器,最后再講解中文分詞是怎么做的。

一、Analysis 與 Analyzer

Analysis 文本分析是把全文本轉換一系列單詞(term/token)的過程,也叫分詞
,Analysis 是通過 Analyzer 來實現的。 Elasticsearch 有多種 內置的分析器,如果不滿足也可以根據自己的需求定制化分析器,除了在數據寫入時轉換詞條,匹配 Query 語句時候也需要用相同的分析器對查詢語句進行分析。

二、Analyzer 的組成

  • Character Filters (針對原始文本處理,例如,可以使用字符過濾器將印度阿拉伯數字(٠ ١٢٣٤٥٦٧٨ ٩)轉換為其等效的阿拉伯語-拉丁語(0123456789))
  • Tokenizer(按照規則切分為單詞),將把文本 "Quick brown fox!" 轉換成 terms [Quick, brown, fox!],tokenizer 還記錄文本單詞位置以及偏移量。
  • Token Filter(將切分的的單詞進行加工、小寫、刪除 stopwords,增加同義詞)

三、Analyzer 內置的分詞器

例子:The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.


Standard Analyzer

  • 默認分詞器
  • 按詞分類
  • 小寫處理
#standard
GET _analyze
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[the,2,quick,brown,foxes,a,jumped,over,the,lazy,dog's,bone]


Simple Analyzer

  • 按照非字母切分,非字母則會被去除
  • 小寫處理
#simpe
GET _analyze
{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[the,quick,brown,foxes,jumped,over,the,lazy,dog,s,bone]


Stop Analyzer

  • 小寫處理
  • 停用詞過濾(the,a, is)
GET _analyze
{
  "analyzer": "stop",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[quick,brown,foxes,jumped,over,lazy,dog,s,bone]


Whitespace Analyzer

  • 按空格切分
#stop
GET _analyze
{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[The,2,QUICK,Brown-Foxes,jumped,over,the,lazy,dog's,bone.]


Keyword Analyzer

  • 不分詞,當成一整個 term 輸出
#keyword
GET _analyze
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.]


Patter Analyzer

  • 通過正則表達式進行分詞
  • 默認是 \W+(非字母進行分隔)
GET _analyze
{
  "analyzer": "pattern",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[the,2,quick,brown,foxes,jumped,over,the,lazy,dog,s,bone]


Language Analyzer

支持語言:arabic, armenian, basque, bengali, bulgarian, catalan, czech, dutch, english, finnish, french, galician, german, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, portuguese, romanian, russian, sorani, spanish, swedish, turkish.

#english
GET _analyze
{
  "analyzer": "english",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

輸出:

[2,quick,brown,fox,jump,over,the,lazy,dog,bone]


中文分詞要比英文分詞難,英文都以空格分隔,中文理解通常需要上下文理解才能有正確的理解,比如 [蘋果,不大好吃]和
[蘋果,不大,好吃],這兩句意思就不一樣。


ICU Analyzer

ElasticSearch 默認以每個字對中文分隔,無法滿足我們的需求。ICU Analyzer 使用國際化組件 Unicode (ICU) 函數庫提供豐富的處理 Unicode ,更好支持中文分詞,ICU Analyzer 不是默認分詞器,需要先安裝插件,安裝命令 sudo bin/elasticsearch-plugin install analysis-icu。

POST _analyze
{
  "analyzer": "icu_analyzer",
  "text": "他說的確實在理”"
}

輸出:

[他,說的,確實,在,理]



POST _analyze
{
  "analyzer": "standard",
  "text": "他說的確實在理”"
}

輸出:

[他,說,的,確,實,在,理]


ICU 只是其中一種中文分詞器,在 Github 上可以查找到其他中文分詞器,比如 IK,THULAC,這些就不在這里提及,有興趣可以自行了解。

四、總結

本篇對 Analyzer 進行詳細講解,ES 內置分詞器是如何工作的,通過 ICU Analyzer 對中文分詞的效果,下面總結內置的所有分詞器的特點,做一個簡單對比。

Standard Analyzer -- 默認分詞器,按詞切分,小寫處理

Simple Analyzer -- 按照非字母切分(符號被過濾),小寫處理

Stop Analyzer -- 小寫處理,停用詞過濾(the,a, is)

Whitespace Analyzer -- 按照空格切分,不轉小寫

Keyword Analyzer -- 不分詞,直接將輸入當作輸出

Patter Analyzer -- 正則表達式,默認\W+ (非字符分隔)

Language Analyzer -- 提供了 30 多種常見語言的分詞器

Customer Analyzer -- 自定義分詞器

【Elasticsearch 7 探索之路】(三)倒排索引
【Elasticsearch 7 探索之路】(二)文檔的 CRUD 和批量操作
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM