为docker容器中的elasticsearch安装ik分词器


最近重新配置一个早期项目的开发环境,需要配置es,记录一下如何安装ik分词器。

// 安装单节点
docker run -d --name es6.5.4 --net my-net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /docker/elasticsearch/data:/usr/share/elasticsearch/data docker.elastic.co/elasticsearch/elasticsearch:6.5.4
// 进入容器es6.5.4执行操作
docker exec -it es6.5.4 /bin/bash
// 使用elasticsearch-plugin install安装ik插件
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip
// 重启容器生效
docker restart es6.5.4

一个需要注意的点是ik分词器的版本需要与elasticsearch版本一致才能安装成功。

测试ik分词器是否安装成功

// 增加一个测试的索引ik_test
curl -X PUT http://localhost:9200/ik_test
// 成功返回 {"acknowledged":true,"shards_acknowledged":true,"index":"ik_test"}

// ik_smart模式分词
curl -X POST \
'http://127.0.0.1:9200/ik_test/_analyze?pretty=true' \
-H 'Content-Type: application/json' \
-d '{"text":"你好,这个美丽的世界!","tokenizer":"ik_smart"}'


// ik_max_word模式分词
curl -X POST \
'http://127.0.0.1:9200/ik_test/_analyze?pretty=true' \
-H 'Content-Type: application/json' \
-d '{"text":"你好,这个美丽的世界!","tokenizer":"ik_max_word"}'

在测试例子中两种模式返回结果相同

返回结果:

{
  "tokens" : [
    {
      "token" : "你好",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "这个",
      "start_offset" : 3,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "美丽",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "的",
      "start_offset" : 7,
      "end_offset" : 8,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "世界",
      "start_offset" : 8,
      "end_offset" : 10,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

记录一下ik_max_word模式和ik_smart模式的区别:
1、ik_max_word

会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。

2、ik_smart

会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

Archives