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

追風人聊Java發表於2021-09-19

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乾貨。

相關文章