Elasticsearch - 中文分词器的集成与使用教程3(热更新词库)
我在之前的文章中介绍了如何自定义 Elasticsearch 的分词词库(点击查看)。但是原先那种方式,后期只要词库内容发生了变动,就需要重启 ES 才能生效。在实际工作中,频繁重启 ES 集群不是一个好办法。所以 ES 提供了热更新词库的解决方案,在不重启 ES 集群的情况下也能识别新增的词语,这样就很方便了,也不会对线上业务产生影响。
1,部署 HTTP 服务
(1)这里我们使用 tomcat 作为 Web 容器,先下载一个 tomcat 8.x 版本。
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz
(2)解压下载下来的压缩包,并移至合适的目录:
tar -zxvf apache-tomcat-8.0.52.tar.gz mv apache-tomcat-8.0.52 /usr/local/apache-tomcat
(3)在 tomcat 的 ROOT 项目中创建一个自定义词库文件 hot.dic。
cd /usr/local/apache-tomcat/webapps/ROOT/ vi hot.dic
(4)在文件中输入一行内容:奶龙

(5)执行如下命令启动 Tomcat:
cd /usr/local/apache-tomcat bin/startup.sh
(6)然后使用浏览器访问 http://服务器 IP:8080/hot.dic,验证一下 hot.dic 文件是否可以通过浏览器访问到。
注意:页面会显示乱码,这是正常的,不用管它。

2,修改配置文件
(1)修改 ES 集群中 ik 插件的 IKAnalyzer.cfg.xml 配置文件。
vi /usr/local/elasticsearch/config/analysis-ik/IKAnalyzer.cfg.xml
(2)在 key="remote_ext_dict" 这个 entry 中添加 hot.dic 的远程访问链接。
注意:一定要记得去掉 key="remote_ext_dict" 这个 entry 外面的注释,否则添加的内容是不生效的。

(3)最后将修改好的 IKAnalyzer.cfg.xml 配置文件复制到集群中的所有节点中,然后重启集群。
3,验证效果
(1)ES 集群重启后,我们测试一下“我是大奶龙”分词情况:
curl -XPOST "http://node1:9200/emp/_analyze?pretty" -H 'Content-Type: application/json' -d '{"text":"我是大奶龙","tokenizer":"ik_max_word"}'
- 返回结果如下,可以看到“奶龙”已经被认为是一个完整的词语了,说明远程字典加载成功。

(2)接着测试下热更新词库,我们编辑 hot.dic 文件,在里面增加一个词语“大奶龙”

- 稍等一会,再次测试一下“我是大奶龙”分词情况。可以看到“大奶龙”已经被认为是一个完整的词语了,说明热更新成功。
