IK支持自定义扩展词典和停用词典,所谓扩展词典就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。停用词典就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到
,可以将这些词放入停用词典。如何定义扩展词典和停用词典可以修改IK分词器中config目录中IKAnalyzer.cfg.xml这个文件。
NOTE:词典的编码必须为UTF-8,否则无法生效
一、步骤
- 修改vim 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">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopword.dic</entry>
</properties>
- 在ik分词器目录下config目录中创建ext_dict.dic文件 编码一定要为UTF-8才能生效
vim ext_dict.dic 加入扩展词即可
- 在ik分词器目录下config目录中创建ext_stopword.dic文件
vim ext_stopword.dic 加入停用词即可
- 重启es生效
二、效果
POST _analyze
{
"analyzer": "ik_smart",
"text": "巧碧螺"
}
如果有多个词典,使用英文分号隔开:
<entry key="ext_dict">my.dic;custom/single_word_low_freq.dic</entry>
然而,该方式有一种致命的缺陷,就是无法实时更新热词,修改完文件,必须重启elasticsearch才能生效,要想实时生效,需使用远程配置方式
三、远程配置热词库
- 启动nginx服务
这里我们使用nginx服务(有web服务功能就可以提供远程热词库的功能了),来配置远程热词库。
关于nginx的部署可以参考我的这篇文章
nginx默认访问html文件夹下的文件,在html下创建文件夹es_ik,创建fenci.txt
访问http://ip:port/es_ik/fenci.txt
正常显示则搭建成功
- 配置elasticsearch配置文件
<?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">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://172.18.0.4:80/es_ik/fenci.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<entry key="remote_ext_stopwords">words_location</entry>
</properties>
注意这里的ip,因为我的nginx使用docker启动的,所以不可以简单设置localhost
可以看到:docker给nginx分配的ip是172.18.0.4
配置前分词情况
配置后
再试一个"胡噶撒旦撒
"
只需修改fence.txt就可以了,无需重启动elasticsearch
推荐使用远程刷新模式