上一篇,什么是倒排索引以及原理是什么昆著。本篇講解 Analyzer县貌,了解 Analyzer 是什么 ,分詞器是什么凑懂,以及 Elasticsearch 內(nèi)置的分詞器煤痕,最后再講解中文分詞是怎么做的。
一接谨、Analysis 與 Analyzer
Analysis 文本分析是把全文本轉(zhuǎn)換一系列單詞(term/token)的過程摆碉,也叫分詞
,Analysis 是通過 Analyzer 來實(shí)現(xiàn)的脓豪。 Elasticsearch 有多種 內(nèi)置的分析器巷帝,如果不滿足也可以根據(jù)自己的需求定制化分析器,除了在數(shù)據(jù)寫入時轉(zhuǎn)換詞條跑揉,匹配 Query 語句時候也需要用相同的分析器對查詢語句進(jìn)行分析锅睛。
二埠巨、Analyzer 的組成
- Character Filters (針對原始文本處理,例如现拒,可以使用字符過濾器將印度阿拉伯?dāng)?shù)字(? ???????? ?)轉(zhuǎn)換為其等效的阿拉伯語-拉丁語(0123456789))
- Tokenizer(按照規(guī)則切分為單詞),將把文本 "Quick brown fox!" 轉(zhuǎn)換成 terms [Quick, brown, fox!],tokenizer 還記錄文本單詞位置以及偏移量辣垒。
- Token Filter(將切分的的單詞進(jìn)行加工、小寫印蔬、刪除 stopwords勋桶,增加同義詞)
三、Analyzer 內(nèi)置的分詞器
例子:The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.
Standard Analyzer
- 默認(rèn)分詞器
- 按詞分類
- 小寫處理
#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
- 不分詞,當(dāng)成一整個 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
- 通過正則表達(dá)式進(jìn)行分詞
- 默認(rèn)是 \W+(非字母進(jìn)行分隔)
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 默認(rèn)以每個字對中文分隔,無法滿足我們的需求滩愁。ICU Analyzer 使用國際化組件 Unicode (ICU) 函數(shù)庫提供豐富的處理 Unicode 躯喇,更好支持中文分詞,ICU Analyzer 不是默認(rèn)分詞器硝枉,需要先安裝插件廉丽,安裝命令 sudo bin/elasticsearch-plugin install analysis-icu。
POST _analyze
{
"analyzer": "icu_analyzer",
"text": "他說的確實(shí)在理”"
}
輸出:
[他妻味,說的雅倒,確實(shí),在弧可,理]
POST _analyze
{
"analyzer": "standard",
"text": "他說的確實(shí)在理”"
}
輸出:
[他,說劣欢,的棕诵,確,實(shí)凿将,在校套,理]
ICU 只是其中一種中文分詞器,在 Github 上可以查找到其他中文分詞器牧抵,比如 IK,THULAC笛匙,這些就不在這里提及侨把,有興趣可以自行了解。
四妹孙、總結(jié)
本篇對 Analyzer 進(jìn)行詳細(xì)講解秋柄,ES 內(nèi)置分詞器是如何工作的,通過 ICU Analyzer 對中文分詞的效果蠢正,下面總結(jié)內(nèi)置的所有分詞器的特點(diǎn)骇笔,做一個簡單對比。
Standard Analyzer -- 默認(rèn)分詞器嚣崭,按詞切分笨触,小寫處理
Simple Analyzer -- 按照非字母切分(符號被過濾),小寫處理
Stop Analyzer -- 小寫處理雹舀,停用詞過濾(the芦劣,a, is)
Whitespace Analyzer -- 按照空格切分,不轉(zhuǎn)小寫
Keyword Analyzer -- 不分詞说榆,直接將輸入當(dāng)作輸出
Patter Analyzer -- 正則表達(dá)式虚吟,默認(rèn)\W+ (非字符分隔)
Language Analyzer -- 提供了 30 多種常見語言的分詞器
Customer Analyzer -- 自定義分詞器
【Elasticsearch 7 探索之路】(三)倒排索引
【Elasticsearch 7 探索之路】(二)文檔的 CRUD 和批量操作
【Elasticsearch 7 搜索之路】(一)什么是 Elasticsearch?