【9種】ElasticSearch分詞器詳解,一文get?。?!| 博學(xué)谷狂野架構(gòu)師

ElasticSearch 分詞器

img
  • 作者: 博學(xué)谷狂野架構(gòu)師
  • GitHub:GitHub地址 (有我精心準(zhǔn)備的130本電子書PDF)

只分享干貨、不吹水,讓我們一起加油!??

概述

分詞器的主要作用將用戶輸入的一段文本,按照一定邏輯,分析成多個(gè)詞語(yǔ)的一種工具

什么是分詞器

顧名思義,文本分析就是把全文本轉(zhuǎn)換成一系列單詞(term/token)的過(guò)程,也叫分詞。在 ES 中,Analysis 是通過(guò)分詞器(Analyzer) 來(lái)實(shí)現(xiàn)的,可使用 ES 內(nèi)置的分析器或者按需定制化分析器。

舉一個(gè)分詞簡(jiǎn)單的例子:比如你輸入 Mastering Elasticsearch,會(huì)自動(dòng)幫你分成兩個(gè)單詞,一個(gè)是 mastering,另一個(gè)是 elasticsearch,可以看出單詞也被轉(zhuǎn)化成了小寫的。

圖片

分詞器的構(gòu)成

分詞器是專門處理分詞的組件,分詞器由以下三部分組成:

組成部分
character filter

接收原字符流,通過(guò)添加、刪除或者替換操作改變?cè)址?/p>

例如:去除文本中的html標(biāo)簽,或者將羅馬數(shù)字轉(zhuǎn)換成阿拉伯?dāng)?shù)字等。一個(gè)字符過(guò)濾器可以有零個(gè)或者多個(gè)

tokenizer

簡(jiǎn)單的說(shuō)就是將一整段文本拆分成一個(gè)個(gè)的詞。

例如拆分英文,通過(guò)空格能將句子拆分成一個(gè)個(gè)的詞,但是對(duì)于中文來(lái)說(shuō),無(wú)法使用這種方式來(lái)實(shí)現(xiàn)。在一個(gè)分詞器中,有且只有一個(gè)tokenizeer

token filters

將切分的單詞添加、刪除或者改變

例如將所有英文單詞小寫,或者將英文中的停詞a刪除等,在token filters中,不允許將token(分出的詞)position或者offset改變。同時(shí),在一個(gè)分詞器中,可以有零個(gè)或者多個(gè)token filters.

分詞順序
圖片

同時(shí) Analyzer 三個(gè)部分也是有順序的,從圖中可以看出,從上到下依次經(jīng)過(guò) Character Filters,Tokenizer 以及 Token Filters,這個(gè)順序比較好理解,一個(gè)文本進(jìn)來(lái)肯定要先對(duì)文本數(shù)據(jù)進(jìn)行處理,再去分詞,最后對(duì)分詞的結(jié)果進(jìn)行過(guò)濾。

索引和搜索分詞

文本分詞會(huì)發(fā)生在兩個(gè)地方:

  • 創(chuàng)建索引:當(dāng)索引文檔字符類型為text時(shí),在建立索引時(shí)將會(huì)對(duì)該字段進(jìn)行分詞。
  • 搜索:當(dāng)對(duì)一個(gè)text類型的字段進(jìn)行全文檢索時(shí),會(huì)對(duì)用戶輸入的文本進(jìn)行分詞。
配置分詞器

默認(rèn)ES使用standard analyzer,如果默認(rèn)的分詞器無(wú)法符合你的要求,可以自己配置

分詞器測(cè)試

可以通過(guò)_analyzerAPI來(lái)測(cè)試分詞的效果。

COPY# 過(guò)濾html 標(biāo)簽
POST _analyze
{
    "tokenizer":"keyword", #原樣輸出
    "char_filter":["html_strip"], # 過(guò)濾html標(biāo)簽
    "text":"<b>hello world<b>"  # 輸入的文本
}
image-20220808135231869

指定分詞器

使用地方

分詞器的使用地方有兩個(gè):

  • 創(chuàng)建索引時(shí)
  • 進(jìn)行搜索時(shí)
創(chuàng)建索引時(shí)指定分詞器

如果設(shè)置手動(dòng)設(shè)置了分詞器,ES將按照下面順序來(lái)確定使用哪個(gè)分詞器:

  • 先判斷字段是否有設(shè)置分詞器,如果有,則使用字段屬性上的分詞器設(shè)置
  • 如果設(shè)置了analysis.analyzer.default,則使用該設(shè)置的分詞器
  • 如果上面兩個(gè)都未設(shè)置,則使用默認(rèn)的standard分詞器
字段指定分詞器

為title屬性指定分詞器

COPYPUT my_index
{
  "mappings": {
    "properties": {
      "title":{
        "type":"text",
        "analyzer": "whitespace"
      }
    }
  }
}
設(shè)置默認(rèn)分詞器
COPYPUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{
          "type":"simple"
        }
      }
    }
  }
}
搜索時(shí)如何確定分詞器

在搜索時(shí),通過(guò)下面參數(shù)依次檢查搜索時(shí)使用的分詞器:

  • 搜索時(shí)指定analyzer參數(shù)
  • 創(chuàng)建mapping時(shí)指定字段的search_analyzer屬性
  • 創(chuàng)建索引時(shí)指定settinganalysis.analyzer.default_search
  • 查看創(chuàng)建索引時(shí)字段指定的analyzer屬性
  • 如果上面幾種都未設(shè)置,則使用默認(rèn)的standard分詞器。
指定analyzer

搜索時(shí)指定analyzer查詢參數(shù)

COPYGET my_index/_search
{
  "query": {
    "match": {
      "message": {
        "query": "Quick foxes",
        "analyzer": "stop"
      }
    }
  }
}
指定字段analyzer
COPYPUT my_index
{
  "mappings": {
    "properties": {
      "title":{
        "type":"text",
        "analyzer": "whitespace",
        "search_analyzer": "simple"
      }
    }
  }
}
指定默認(rèn)default_seach
COPYPUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{
          "type":"simple"
        },
        "default_seach":{
          "type":"whitespace"
        }
      }
    }
  }
}

內(nèi)置分詞器

es在索引文檔時(shí),會(huì)通過(guò)各種類型 Analyzer 對(duì)text類型字段做分析,

不同的 Analyzer 會(huì)有不同的分詞結(jié)果,內(nèi)置的分詞器有以下幾種,基本上內(nèi)置的 Analyzer 包括 Language Analyzers 在內(nèi),對(duì)中文的分詞都不夠友好,中文分詞需要安裝其它 Analyzer

分析器 描述 分詞對(duì)象 結(jié)果
standard 標(biāo)準(zhǔn)分析器是默認(rèn)的分析器,如果沒(méi)有指定,則使用該分析器。它提供了基于文法的標(biāo)記化(基于 Unicode 文本分割算法,如 Unicode 標(biāo)準(zhǔn)附件 # 29所規(guī)定) ,并且對(duì)大多數(shù)語(yǔ)言都有效。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog’s, bone ]
simple 簡(jiǎn)單分析器將文本分解為任何非字母字符的標(biāo)記,如數(shù)字、空格、連字符和撇號(hào)、放棄非字母字符,并將大寫字母更改為小寫字母。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
whitespace 空格分析器在遇到空白字符時(shí)將文本分解為術(shù)語(yǔ) The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog’s, bone. ]
stop 停止分析器與簡(jiǎn)單分析器相同,但增加了刪除停止字的支持。默認(rèn)使用的是 _english_ 停止詞。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]
keyword 不分詞,把整個(gè)字段當(dāng)做一個(gè)整體返回 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone.]
pattern 模式分析器使用正則表達(dá)式將文本拆分為術(shù)語(yǔ)。正則表達(dá)式應(yīng)該匹配令牌分隔符,而不是令牌本身。正則表達(dá)式默認(rèn)為 w+ (或所有非單詞字符)。 The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
多種西語(yǔ)系 arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english等等 一組旨在分析特定語(yǔ)言文本的分析程序。

中文擴(kuò)展分析器

中文分詞器最簡(jiǎn)單的是ik分詞器,還有jieba分詞,哈工大分詞器等

分詞器 描述 分詞對(duì)象 結(jié)果
ik_smart ik分詞器中的簡(jiǎn)單分詞器,支持自定義字典,遠(yuǎn)程字典 學(xué)如逆水行舟,不進(jìn)則退 [學(xué)如逆水行舟,不進(jìn)則退]
ik_max_word ik_分詞器的全量分詞器,支持自定義字典,遠(yuǎn)程字典 學(xué)如逆水行舟,不進(jìn)則退 [學(xué)如逆水行舟,學(xué)如逆水,逆水行舟,逆水,行舟,不進(jìn)則退,不進(jìn),則,退]

詞語(yǔ)分詞

標(biāo)準(zhǔn)分詞器(Standard Tokenizer)

根據(jù)standardUnicode文本分段算法的定義,將文本劃分為多個(gè)單詞邊界的上的術(shù)語(yǔ)

它是 ES 默認(rèn)的分詞器,它會(huì)對(duì)輸入的文本按詞的方式進(jìn)行切分,切分好以后會(huì)進(jìn)行轉(zhuǎn)小寫處理,默認(rèn)的 stopwords 是關(guān)閉的

圖片
使用案例

下面使用 Kibana 看一下它是怎么樣進(jìn)行工作的

原始內(nèi)容
COPYIn 2020, Java is the best language in the world.
測(cè)試分詞

在 Kibana 的開(kāi)發(fā)工具(Dev Tools)中指定 Analyzer 為 standard,并輸入文本 In 2020, Java is the best language in the world.,然后我們運(yùn)行一下:

COPYGET _analyze
{
  "text":"In 2020, Java is the best language in the world.",
  "analyzer": "standard"
}
image-20220808105014779

可以看出是按照空格、非字母的方式對(duì)輸入的文本進(jìn)行了轉(zhuǎn)換,比如對(duì) Java 做了轉(zhuǎn)小寫,對(duì)一些停用詞也沒(méi)有去掉,比如 in,其中 token 為分詞結(jié)果;start_offset 為起始偏移;end_offset 為結(jié)束偏移;position 為分詞位置。

可配置項(xiàng)
選項(xiàng) 描述
max_token_length 最大令牌長(zhǎng)度。如果看到令牌超過(guò)此長(zhǎng)度,則將其max_token_length間隔分割。默認(rèn)為255。
stopwords 預(yù)定義的停用詞列表,例如english或包含停用詞列表的數(shù)組。默認(rèn)為none。
stopwords_path 包含停用詞的文件的路徑。
COPY{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_english_analyzer": {
                    "type": "standard",
                    "max_token_length": 5,
                    "stopwords": "_english_"
                }
            }
        }
    }
}

簡(jiǎn)單分詞器(Letter Tokenizer)

當(dāng)simple分析器遇到非字母的字符時(shí),它會(huì)將文本劃分為多個(gè)術(shù)語(yǔ),它小寫所有術(shù)語(yǔ),對(duì)于中文和亞洲很多國(guó)家的語(yǔ)言來(lái)說(shuō)是無(wú)用的

圖片

它只包括了 Lower CaseTokenizer,它會(huì)按照非字母切分非字母的會(huì)被去除,最后對(duì)切分好的做轉(zhuǎn)小寫處理,然后接著用剛才的輸入文本,分詞器換成 simple 來(lái)進(jìn)行分詞,運(yùn)行結(jié)果如下:

使用案例
原始內(nèi)容
COPYIn 2020, Java is the best language in the world.
測(cè)試分詞
COPYGET _analyze
{
  "text":"In 2020, Java is the best language in the world.",
  "analyzer": "simple"
}
image-20220808105857762

空白分詞器(Whitespace Tokenizer)

它非常簡(jiǎn)單,根據(jù)名稱也可以看出是按照空格進(jìn)行切分

該whitespace分析儀將文本分為方面每當(dāng)遇到任何空白字符,和上面的分詞器不同,空白分詞器默認(rèn)并不會(huì)將內(nèi)容轉(zhuǎn)換為小寫。

圖片
使用案例
原始內(nèi)容
COPYIn 2020, Java is the best language in the world.
測(cè)試分詞
COPYGET _analyze
{
  "text":"In 2020, Java is the best language in the world.",
  "analyzer": "whitespace"
}
image-20220808110235685

電子郵件分詞器(UAX URL Email Tokenizer)

此分詞器主要是針對(duì)email和url地址進(jìn)行關(guān)鍵內(nèi)容的標(biāo)記。

使用案例
原始內(nèi)容
COPY"Email me at john.smith@global-international.com"
測(cè)試分詞
COPYGET _analyze
{
  "text":"Email me at john.smith@global-international.com",
  "tokenizer": "uax_url_email"
}
可配置項(xiàng)

max_token_length最大令牌長(zhǎng)度。如果看到令牌超過(guò)此長(zhǎng)度,則將其max_token_length間隔分割。默認(rèn)為255

COPY{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_english_analyzer": {
                    "type": "standard",
                    "max_token_length": 5
                }
            }
        }
    }
}

經(jīng)典分詞器(Classic Tokenizer)

可對(duì)首字母縮寫詞,公司名稱,電子郵件地址和互聯(lián)網(wǎng)主機(jī)名進(jìn)行特殊處理,但是,這些規(guī)則并不總是有效,并且此關(guān)鍵詞生成器不適用于英語(yǔ)以外的大多數(shù)其他語(yǔ)言

特點(diǎn)
  • 它最多將標(biāo)點(diǎn)符號(hào)拆分為單詞,刪除標(biāo)點(diǎn)符號(hào),但是,不帶空格的點(diǎn)被認(rèn)為是查詢關(guān)鍵詞的一部分
  • 此分詞器可以將郵件地址和URL地址識(shí)別為查詢的term(詞條)
使用案例
原始內(nèi)容
COPY"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
測(cè)試分詞
COPYGET _analyze
{
  "text":"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.",
  "analyzer": "classic"
}
image-20220808111755030
可配置項(xiàng)

max_token_length最大令牌長(zhǎng)度。如果看到令牌超過(guò)此長(zhǎng)度,則將其max_token_length間隔分割。默認(rèn)為255。

COPY{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "my_tokenizer"
                }
            },
            "tokenizer": {
                "my_tokenizer": {
                    "type": "classic",
                    "max_token_length": 5
                }
            }
        }
    }
}

結(jié)構(gòu)化文本分詞

關(guān)鍵詞分詞器(Keyword Tokenizer)

它其實(shí)不做分詞處理,只是將輸入作為 Term 輸出

關(guān)鍵詞分詞器其實(shí)是執(zhí)行了一個(gè)空操作的分析,它將任何輸入的文本作為一個(gè)單一的關(guān)鍵詞輸出。

圖片
使用案例
原始內(nèi)容
COPY"In 2020, Java is the best language in the world."
測(cè)試分詞
COPYGET _analyze
{
  "text":"In 2020, Java is the best language in the world.",
  "analyzer": "keyword"
}

會(huì)發(fā)現(xiàn)前后內(nèi)容根本沒(méi)有發(fā)生改變,這也是這個(gè)分詞器的作用,有些時(shí)候我們針對(duì)一個(gè)需要分詞查詢的字段進(jìn)行查詢的時(shí)候,可能并不希望查詢條件被分詞,這個(gè)時(shí)候就可以使用這個(gè)分詞器,整個(gè)查詢條件作為一個(gè)關(guān)鍵詞使用

image-20220808112235674

正則分詞器(Pattern Tokenizer)

模式標(biāo)記器使用 Java正則表達(dá)式。使用JAVA的正則表達(dá)式進(jìn)行詞語(yǔ)的拆分。

它可以通過(guò)正則表達(dá)式的方式進(jìn)行分詞,默認(rèn)是用 \W+ 進(jìn)行分割的,也就是非字母的符合進(jìn)行切分的。

圖片
使用案例
原始內(nèi)容
COPY"In 2020, Java is the best language in the world."
測(cè)試分詞
COPYGET _analyze
{
  "text":"In 2020, Java is the best language in the world.",
  "analyzer": "patter"
}
image-20220808112737629
可配置項(xiàng)

正則分詞器有以下的選項(xiàng)

選項(xiàng) 描述
pattern 正則表達(dá)式
flags 正則表達(dá)式標(biāo)識(shí)
lowercase 是否使用小寫詞匯
stopwords 停止詞的列表。
stopwords_path 定義停止詞文件的路徑。
COPY{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_email_analyzer": {
                    "type": "pattern",
                    "pattern": "\\W|_",
                    "lowercase": true
                }
            }
        }
    }
}

路徑分詞器(Path Tokenizer)

可以對(duì)文件系統(tǒng)的路徑樣式的請(qǐng)求進(jìn)行拆分,返回被拆分各個(gè)層級(jí)內(nèi)容。

使用案例
原始內(nèi)容
COPY"/one/two/three"
測(cè)試分詞
COPYGET _analyze
{
  "text":"/one/two/three",
  "tokenizer":"path_hierarchy"
}
image-20220808113500717
可配置項(xiàng)
選項(xiàng) 描述
delimiter 用作路徑分隔符的字符
replacement 用于定界符的可選替換字符
buffer_size 單次讀取到術(shù)語(yǔ)緩沖區(qū)中的字符數(shù)。默認(rèn)為1024。術(shù)語(yǔ)緩沖區(qū)將以該大小增長(zhǎng),直到所有文本都被消耗完為止。建議不要更改此設(shè)置。
reverse 正向還是反向獲取關(guān)鍵詞
skip 要忽略的內(nèi)容
COPY{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "my_tokenizer"
                }
            },
            "tokenizer": {
                "my_tokenizer": {
                    "type": "path_hierarchy",
                    "delimiter": "-",
                    "replacement": "/",
                    "skip": 2
                }
            }
        }
    }
}

語(yǔ)言分詞(Language Analyzer)

ES 為不同國(guó)家語(yǔ)言的輸入提供了 Language Analyzer 分詞器,在里面可以指定不同的語(yǔ)言

支持語(yǔ)種

支持如下語(yǔ)種:

關(guān)鍵字 語(yǔ)種
arabic 美 /??r?b?k/ 阿拉伯語(yǔ)
armenian 美 /ɑ?r?mi?ni?n/ 亞美尼亞語(yǔ)
basque 美 /b?sk,bɑ?sk/ 巴斯克語(yǔ)
bengali 美 /be??ɡɑ?li/ 孟加拉語(yǔ)
brazilian 美 /br??z?li?n/ 巴西語(yǔ)
bulgarian 美 /b?l?ɡeri?n/ 保加利亞語(yǔ)
catalan 美 /?k?t?l?n/ 加泰羅尼亞語(yǔ)
cjk 中日韓統(tǒng)一表意文字
czech 美 /t?ek/ 捷克語(yǔ)
danish 美 /?de?n??/ 丹麥語(yǔ)
dutch 美 /d?t?/ 荷蘭語(yǔ)
english 美 /???ɡl??/ 英語(yǔ)
estonian 美 /e?sto?ni?n/ 愛(ài)沙尼亞語(yǔ)
finnish 美 /?f?n??/ 芬蘭語(yǔ)
french 美 /frent?/ 法語(yǔ)
galician 美 /ɡ??l??n/ 加里西亞語(yǔ)
german 美 /?d???rm?n/ 德語(yǔ)
greek 美 /ɡri?k/ 希臘語(yǔ)
hindi 美 /?h?ndi/ 北印度語(yǔ)
hungarian 美 /h???ɡeri?n/ 匈牙利語(yǔ)
indonesian 美 /??nd??ni??n/ 印度尼西亞語(yǔ)
irish 美 /?a?r??/ 愛(ài)爾蘭語(yǔ)
italian 美 /??t?li?n/ 意大利語(yǔ)
latvian 美 /?l?tvi?n/ 拉脫維亞語(yǔ)
lithuanian 美 /?l?θu?e?ni?n/ 立陶宛語(yǔ)
norwegian 美 /n??r?wi?d??n/ 挪威語(yǔ)
persian /‘p??r??n/ 波斯語(yǔ)
portuguese 美 /?p??rt???ɡi?z/ 葡萄牙語(yǔ)
romanian 美 /ro’men??n/ 羅馬尼亞語(yǔ)
russian 美 /?r??n/ 俄語(yǔ)
sorani 索拉尼語(yǔ)
spanish 美 /?sp?n??/ 西班牙語(yǔ)
swedish 美 /?swi?d??/ 瑞典語(yǔ)
turkish 美 /?t??rk??/ 土耳其語(yǔ)
thai 美 /ta?/ 泰語(yǔ)
使用案例

下面我們使用英語(yǔ)進(jìn)行分析

原始內(nèi)容
COPY"In 2020, Java is the best language in the world."
測(cè)試分詞
COPYGET _analyze
{
  "text":"In 2020, Java is the best language in the world.",
  "analyzer":"english"
}
image-20220808114216744

自定義分詞器

當(dāng)內(nèi)置的分詞器無(wú)法滿足需求時(shí),可以創(chuàng)建custom類型的分詞器。

配置參數(shù)
參數(shù) 描述
tokenizer 內(nèi)置或定制的tokenizer.(必須)
char_filter 內(nèi)置或定制的char_filter(非必須)
filter 內(nèi)置或定制的token filter(非必須)
position_increment_gap 當(dāng)值為文本數(shù)組時(shí),設(shè)置改值會(huì)在文本的中間插入假空隙。設(shè)置該屬性,對(duì)與后面的查詢會(huì)有影響。默認(rèn)該值為100.
創(chuàng)建索引

上面的示例中定義了一個(gè)名為my_custom_analyzer的分詞器

該分詞器的typecustom,tokenizerstandard,char_filterhmtl_strip,filter定義了兩個(gè)分別為:lowercaseasciifolding

COPYPUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer":{
          "type":"custom",
          "tokenizer":"standard",
          "char_filter":["html_strip"],
          "filter":["lowercase","asciifolding"]
        }
      }
    }
  }
}
使用案例
原始內(nèi)容
COPYIs this <b>déjà vu</b>?
測(cè)試分詞
COPYPOST my_index/_analyze
{
  "text": "Is this <b>déjà vu</b>?",
  "analyzer": "my_custom_analyzer"
}
image-20220808140137712

中文分詞器

IKAnalyzer

IKAnalyzer是一個(gè)開(kāi)源的,基于java的語(yǔ)言開(kāi)發(fā)的輕量級(jí)的中文分詞工具包

從2006年12月推出1.0版開(kāi)始,IKAnalyzer已經(jīng)推出了3個(gè)大版本,在 2012 版本中,IK 實(shí)現(xiàn)了簡(jiǎn)單的分詞歧義排除算法,標(biāo)志著 IK 分詞器從單純的詞典分詞向模擬語(yǔ)義分詞衍化

使用IK分詞器

IK提供了兩個(gè)分詞算法:

  • ik_smart:最少切分。
  • ik_max_word:最細(xì)粒度劃分。

ik_smart

使用案例
原始內(nèi)容
COPY傳智教育的教學(xué)質(zhì)量是杠杠的
測(cè)試分詞
COPYGET _analyze
{
  "analyzer": "ik_smart",
  "text": "傳智教育的教學(xué)質(zhì)量是杠杠的"
}
image-20220808115450647

ik_max_word

使用案例
原始內(nèi)容
COPY傳智教育的教學(xué)質(zhì)量是杠杠的
測(cè)試分詞
COPYGET _analyze
{
  "analyzer": "ik_max_word",
  "text": "傳智教育的教學(xué)質(zhì)量是杠杠的"
}
image-20220808115513668

自定義詞庫(kù)

我們?cè)谑褂肐K分詞器時(shí)會(huì)發(fā)現(xiàn)其實(shí)有時(shí)候分詞的效果也并不是我們所期待的

問(wèn)題描述

例如我們輸入“傳智教育的教學(xué)質(zhì)量是杠杠的”,但是分詞器會(huì)把“傳智教育”進(jìn)行拆開(kāi),分為了“傳”,“智”,“教育”,但我們希望的是“傳智教育”可以不被拆開(kāi)。

image-20220808115543696
解決方案

對(duì)于以上的問(wèn)題,我們只需要將自己要保留的詞,加到我們的分詞器的字典中即可

編輯字典內(nèi)容

進(jìn)入elasticsearch目錄plugins/ik/config中,創(chuàng)建我們自己的字典文件yixin.dic,并添加內(nèi)容:

COPYcd plugins/ik/config
echo "傳智教育" > custom.dic
擴(kuò)展字典

進(jìn)入我們的elasticsearch目錄 :plugins/ik/config,打開(kāi)IKAnalyzer.cfg.xml文件,進(jìn)行如下配置:

COPYvi IKAnalyzer.cfg.xml
#增加如下內(nèi)容
<entry key="ext_dict">custom.dic</entry>
再次測(cè)試

重啟ElasticSearch,再次使用kibana測(cè)試

COPYGET _analyze
{
  "analyzer": "ik_max_word",
  "text": "傳智教育的教學(xué)質(zhì)量是杠杠的"
}

可以發(fā)現(xiàn),現(xiàn)在我們的詞匯”傳智教育”就不會(huì)被拆開(kāi)了,達(dá)到我們想要的效果了

image-20220808134046401

本文由傳智教育博學(xué)谷狂野架構(gòu)師教研團(tuán)隊(duì)發(fā)布。

如果本文對(duì)您有幫助,歡迎關(guān)注點(diǎn)贊;如果您有任何建議也可留言評(píng)論私信,您的支持是我堅(jiān)持創(chuàng)作的動(dòng)力。

轉(zhuǎn)載請(qǐng)注明出處!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容