溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

elasticsearch 中如何使用IK-Analyze中文分詞插件

發(fā)布時(shí)間:2021-08-03 11:36:55 來源:億速云 閱讀:154 作者:Leah 欄目:大數(shù)據(jù)

elasticsearch 中如何使用IK-Analyze中文分詞插件,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。


安裝中文分詞插件

插件對(duì)應(yīng)的版本需要和elasticsearch的版本一致

插件各個(gè)版本下載地址

https://github.com/medcl/elasticsearch-analysis-ik/releases

使用elasticsearch自帶腳本進(jìn)行安裝 

./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.0/elasticsearch-analysis-ik-7.3.0.zip

插件jar包安裝在elasticsearch-7.3.0/plugins/analysis-ik下

插件的配置文件存放在elasticsearch-7.3.0/config/analysis-ik下,在此目錄中存放了許多詞庫(kù),如果我們想根據(jù)自己業(yè)務(wù)去擴(kuò)展一些自定義詞庫(kù)的話,可以修改此目錄中的 IKAnalyzer.cfg.xml 文件

例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 擴(kuò)展配置</comment>
        <!--用戶可以在這里配置自己的擴(kuò)展字典 -->
        <entry key="ext_dict">custom/mydict.dic;</entry>
         <!--用戶可以在這里配置自己的擴(kuò)展停止詞字典-->
        <entry key="ext_stopwords">custom/ext_stopword.dic</entry>
        <!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展字典 -->
        <entry key="remote_ext_dict">http://10.0.11.1:10002/elasticsearch/myDict</entry>
        <!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展停止詞字典-->
        <entry key="remote_ext_stopwords">http://10.0.11.1:10002/elasticsearch/stopWordDict</entry>
</properties>

擴(kuò)展詞庫(kù)可以配置在本地或存放在遠(yuǎn)程服務(wù)器

custorm存放在IKAnalyzer.cfg.xml 文件所在目錄中,需要注意的是擴(kuò)展詞典的文本格式為 UTF8 編碼

配置在遠(yuǎn)程詞庫(kù)中更新詞庫(kù)后不需要重啟,需要在http請(qǐng)求頭中做些設(shè)置

  1. 該 http 請(qǐng)求需要返回兩個(gè)頭部(header),一個(gè)是 Last-Modified,一個(gè)是 ETag,這兩者都是字符串類型,只要有一個(gè)發(fā)生變化,該插件就會(huì)去抓取新的分詞進(jìn)而更新詞庫(kù)。

  2. 該 http 請(qǐng)求返回的內(nèi)容格式是一行一個(gè)分詞,換行符用 \n 即可。

修改完IKAnalyzer.cfg.xml需要重啟服務(wù)

// 創(chuàng)建索引
PUT /full_text_test

// 添加mapping
POST /full_text_test/_mapping
{
  "properties":{
    "content":{
      "type":"text",
      "analyzer":"ik_max_word",
      "search_analyzer":"ik_smart"
    }
  }
}

// 添加一條數(shù)據(jù)
POST /full_text_test/_doc/1
{
  "content":"中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首"
}

測(cè)試分詞效果 

ik_max_word: 會(huì)將文本做最細(xì)粒度的拆分

ik_smart: 會(huì)做最粗粒度的拆分

POST /full_text_test/_analyze
{
  "text": ["中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首"],
  "tokenizer": "ik_max_word"
}

結(jié)果

{
  "tokens" : [
    {
      "token" : "中國(guó)",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "駐",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "洛杉磯",
      "start_offset" : 3,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "領(lǐng)事館",
      "start_offset" : 6,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "領(lǐng)事",
      "start_offset" : 6,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "館",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "CN_CHAR",
      "position" : 5
    },
    {
      "token" : "遭",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "CN_CHAR",
      "position" : 6
    },
    {
      "token" : "亞裔",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "男子",
      "start_offset" : 12,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 8
    },
    {
      "token" : "子槍",
      "start_offset" : 13,
      "end_offset" : 15,
      "type" : "CN_WORD",
      "position" : 9
    },
    {
      "token" : "槍擊",
      "start_offset" : 14,
      "end_offset" : 16,
      "type" : "CN_WORD",
      "position" : 10
    },
    {
      "token" : "嫌犯",
      "start_offset" : 17,
      "end_offset" : 19,
      "type" : "CN_WORD",
      "position" : 11
    },
    {
      "token" : "已",
      "start_offset" : 19,
      "end_offset" : 20,
      "type" : "CN_CHAR",
      "position" : 12
    },
    {
      "token" : "自首",
      "start_offset" : 20,
      "end_offset" : 22,
      "type" : "CN_WORD",
      "position" : 13
    }
  ]
}
POST /full_text_test/_analyze
{
  "text": ["中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首"],
  "tokenizer": "ik_smart"
}

結(jié)果

{
  "tokens" : [
    {
      "token" : "中國(guó)",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "駐",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "洛杉磯",
      "start_offset" : 3,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "領(lǐng)事館",
      "start_offset" : 6,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "遭",
      "start_offset" : 9,
      "end_offset" : 10,
      "type" : "CN_CHAR",
      "position" : 4
    },
    {
      "token" : "亞裔",
      "start_offset" : 10,
      "end_offset" : 12,
      "type" : "CN_WORD",
      "position" : 5
    },
    {
      "token" : "男子",
      "start_offset" : 12,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "槍擊",
      "start_offset" : 14,
      "end_offset" : 16,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "嫌犯",
      "start_offset" : 17,
      "end_offset" : 19,
      "type" : "CN_WORD",
      "position" : 8
    },
    {
      "token" : "已",
      "start_offset" : 19,
      "end_offset" : 20,
      "type" : "CN_CHAR",
      "position" : 9
    },
    {
      "token" : "自首",
      "start_offset" : 20,
      "end_offset" : 22,
      "type" : "CN_WORD",
      "position" : 10
    }
  ]
}

實(shí)現(xiàn)一個(gè)可以從數(shù)據(jù)庫(kù)管理的詞庫(kù)表,方便隨時(shí)擴(kuò)展詞庫(kù)

/**
 * elasticsearch ik-analysis 遠(yuǎn)程詞庫(kù)
 * 1、該 http 請(qǐng)求需要返回兩個(gè)頭部(header),一個(gè)是 Last-Modified,一個(gè)是 ETag,
 * 這兩者都是字符串類型,只要有一個(gè)發(fā)生變化,該插件就會(huì)去抓取新的分詞進(jìn)而更新詞庫(kù)。
 * 2、該 http 請(qǐng)求返回的內(nèi)容格式是一行一個(gè)分詞,換行符用 \n 即可。
 */
@RequestMapping("myDict")
public String myDict(HttpServletResponse response) {
    // 從數(shù)據(jù)庫(kù)中查詢當(dāng)前version
	String version = esDictVersionMapper.selectById(1).getVersion();
    // 設(shè)置請(qǐng)求頭中的詞庫(kù)版本號(hào)
	response.setHeader("Last-Modified", version);
	StringBuilder sb = new StringBuilder();
    // 查出mysql中擴(kuò)展詞庫(kù)表中所有數(shù)據(jù),并以\n分隔
	esDictMapper.selectList(null).forEach(item -> sb.append(item.getWord()).append("\n"));
	return sb.toString();
}

elasticsearch 中如何使用IK-Analyze中文分詞插件

常見問題
問題1:"analyzer [ik_max_word] not found for field [content]"
解決辦法:在所有es節(jié)點(diǎn)安裝IK后,問題解決。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI