Elasticsearch(ES)分詞器的那些事兒

追風人聊Java 2021-09-19 11:14:10 阅读数:389

elasticsearch es

1. 概述

分詞器是Elasticsearch中很重要的一個組件,用來將一段文本分析成一個一個的詞,Elasticsearch再根據這些詞去做倒排索引。

今天我們就來聊聊分詞器的相關知識。

 

2. 內置分詞器

2.1 概述

Elasticsearch 中內置了一些分詞器,這些分詞器只能對英文進行分詞處理,無法將中文的詞識別出來。

 

2.2 內置分詞器介紹

standard:標准分詞器,是Elasticsearch中默認的分詞器,可以拆分英文單詞,大寫字母統一轉換成小寫。

simple:按非字母的字符分詞,例如:數字、標點符號、特殊字符等,會去掉非字母的詞,大寫字母統一轉換成小寫。

whitespace:簡單按照空格進行分詞,相當於按照空格split了一下,大寫字母不會轉換成小寫。

stop:會去掉無意義的詞,例如:the、a、an 等,大寫字母統一轉換成小寫。

keyword:不拆分,整個文本當作一個詞。

 

2.3 查看分詞效果通用接口

GET  http://192.168.1.11:9200/_analyze

參數:

{
"analyzer": "standard",
"text": "I am a man."
}

響應:

{
"tokens": [
{
"token": "i",
"start_offset": 0,
"end_offset": 1,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "am",
"start_offset": 2,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "a",
"start_offset": 5,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "man",
"start_offset": 7,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 3
}
]
}

 

3. IK分詞器

3.1 概述

Elasticsearch中內置的分詞器不能對中文進行分詞,因此我們需要再安裝一個能够支持中文的分詞器,IK分詞器就是個不錯的選擇。

 

3.2 下載IK分詞器

下載網址:https://github.com/medcl/elasticsearch-analysis-ik

 

 

 

 

 

3.3 IK分詞器的安裝

1)為IK分詞器創建目錄

# cd /usr/local/elasticsearch-7.14.1/plugins

# mkdir ik

 

2)將IK分詞器壓縮包拷貝到CentOS7的目錄下,例如:/home

 

3)將壓縮包解壓到剛剛創建的目錄

# unzip elasticsearch-analysis-ik-7.14.1.zip -d /usr/local/elasticsearch-7.14.1/plugins/ik/

 

4)重啟Elasticsearch

 

3.4 IK分詞器介紹

ik_max_word: 會將文本做最細粒度的拆分,適合 Term Query;

ik_smart: 會做最粗粒度的拆分,適合 Phrase 查詢。

 

IK分詞器介紹來源於GitHub:https://github.com/medcl/elasticsearch-analysis-ik

 

3.5 分詞效果

GET http://192.168.1.11:9200/_analyze

參數:

{
"analyzer": "ik_max_word",
"text": "我是一名Java高級程序員"
}

響應:

{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "是",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "一名",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
},
{
"token": "一",
"start_offset": 2,
"end_offset": 3,
"type": "TYPE_CNUM",
"position": 3
},
{
"token": "名",
"start_offset": 3,
"end_offset": 4,
"type": "COUNT",
"position": 4
},
{
"token": "java",
"start_offset": 4,
"end_offset": 8,
"type": "ENGLISH",
"position": 5
},
{
"token": "高級",
"start_offset": 8,
"end_offset": 10,
"type": "CN_WORD",
"position": 6
},
{
"token": "程序員",
"start_offset": 10,
"end_offset": 13,
"type": "CN_WORD",
"position": 7
},
{
"token": "程序",
"start_offset": 10,
"end_offset": 12,
"type": "CN_WORD",
"position": 8
},
{
"token": "員",
"start_offset": 12,
"end_offset": 13,
"type": "CN_CHAR",
"position": 9
}
]
}

 

4. 自定義詞庫

4.1 概述

在進行中文分詞時,經常出現分析出的詞不是我們想要的,這時我們就需要在IK分詞器中自定義我們自己詞庫。

例如:追風人,分詞後,只有 追風 和 人,而沒有 追風人,導致倒排索引後查詢時,用戶搜 追風 或 人 可以搜到 追風人,搜 追風人 反而搜不到 追風人。

 

4.2 自定義詞庫

# cd /usr/local/elasticsearch-7.14.1/plugins/ik/config

# vi IKAnalyzer.cfg.xml

在配置文件中增加自己的字典

 

 

# vi my.dic

在文本中加入 追風人,保存。

 

重啟Elasticsearch即可。

 

5. 綜述

今天簡單聊了一下 Elasticsearch(ES)分詞器的相關知識,希望可以對大家的工作有所幫助。

歡迎大家幫忙點贊、評論、加關注 :)

關注追風人聊Java,每天更新Java幹貨。

版权声明:本文为[追風人聊Java]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919111410192Z.html