elasticsearch ik分词器-自定义分词(远程方式,热更新)

部署图解

在 nginx 中部署 分词文件,如:word ,该文件中是分词,一个分词占一行,可通过 url 访问

在 ik中有一个配置文件 IKAnalyzer.cfg.xml,配置 远程自定义分词的url

部署 nginx docker

启动nginx容器

先启动一个nginx容器,目的是从 nginx容器中 复制出配置文件,然后就停止、删除该容器

docker run -p 8080:80 --name nginx -d nginx:1.18

创建 nginx目录

用于保存 nginx 配置文件、日志文件等

mkdir -p /mydata/nginx

将容器中配置文件复制到宿主机

docker container cp nginx:/etc/nginx/conf.d /mydata/nginx

执行成功后,在 /mydata/nginx 目录下 有 conf.d 目录,该目录下 default.conf 是配置文件

停止原容器

docker stop nginx

删除原容器

docker rm nginx

创建真正的 nginx容器

docker run -p 8080:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf.d:/etc/nginx/conf.d \
-d nginx:1.18

宿主机端口是 8080

相关目录

如下图:

  • conf.d:该文件夹是配置文件
  • html:该文件夹是页面
  • logs:日志目录

测试nginx是否部署成功

创建页面

进入 html 目录下:

cd html

创建 index.html 文件:

vi index.html

内容如下:

<html>
<body>
hello world
</body>
</html>

保存

访问测试

访问 http://192.168.58.101:8080/ 能够正常显示页面,说明部署正确

创建分词文件

创建目录

创建 /mydata/nginx/html/es 目录,用于保存 es 相关的分词文件:

mkdir -p /mydata/nginx/html/es

创建分词文件

进入 /mydata/nginx/html/es 目录:

cd /mydata/nginx/html/es

创建 word.dic 文件,该文件内容是自定义分词:

vi word.dic

内容如下:

马育民
李雷

保存为 UTF-8 文件

测试是否能访问

打开浏览器访问:http://192.168.58.101:8080/es/word.dic ,能够访问即可,中文乱码正常

修改 ik 配置

进入到下面目录:

cd /mydata/elasticsearch/plugins/ik/config/

编辑 IKAnalyzer.cfg.xml 文件,修改内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict"></entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 -->
    <!-- <entry key="remote_ext_dict">words_location</entry> -->
    <entry key="remote_ext_dict">http://192.168.58.101:8080/es/word.dic</entry>
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

保存退出

解释:

<entry key="remote_ext_dict">http://192.168.58.101:8080/es/word.dic</entry>

在配置远程扩展字典

重启 es

查看es容器的id:

docker ps -a

根据容器id重启:

docker restart id

测试分词

测试一:

再次执行下面分词:

get /myblog/_analyze
{
  "analyzer":"ik_smart",
  "text":"马育民的博客"
}

执行结果如下,可以正确分词:

{
  "tokens" : [
    {
      "token" : "马育民",
      "start_offset" : 0,
      "end_offset" : 3,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "的",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "博客",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

测试二

再次执行下面分词:

get /myblog/_analyze
{
  "analyzer":"ik_max_word",
  "text":"李雷的博客"
}

执行结果如下,可以正确分词:

{
  "tokens" : [
    {
      "token" : "李雷",
      "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" : 5,
      "type" : "CN_WORD",
      "position" : 2
    }
  ]
}

添加新的分词

在有新的词,就填入到下面文件中:

/mydata/nginx/html/es/word.dic

每个词占一行

注意

保存后,需要 等待几秒,es才能检测到文件变化,才能正确的使用新的分词

如果不行,就重启 es


原文出处:/show_1IX1pHvsPwOk.html