IK支持自定义扩展词典和停用词典,所谓扩展词典就是有些词并不是关键词,但是也希望被ES用来作为检索的关键词,可以将这些词加入扩展词典。停用词典就是有些词是关键词,但是出于业务场景不想使用这些关键词被检索到,可以将这些词放入停用词典。如何定义扩展词典和停用词典可以修改IK分词器中config目录中IKAnalyzer.cfg.xml这个文件。

NOTE:词典的编码必须为UTF-8,否则无法生效

一、步骤

  1. 修改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>
  1. 在ik分词器目录下config目录中创建ext_dict.dic文件 编码一定要为UTF-8才能生效
vim ext_dict.dic 加入扩展词即可
  1. 在ik分词器目录下config目录中创建ext_stopword.dic文件
vim ext_stopword.dic 加入停用词即可
  1. 重启es生效

二、效果

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "巧碧螺"
}

Es如何设置不分词 es关闭分词_elasticsearch

Es如何设置不分词 es关闭分词_nginx_02


如果有多个词典,使用英文分号隔开:

<entry key="ext_dict">my.dic;custom/single_word_low_freq.dic</entry>

Es如何设置不分词 es关闭分词_nginx_03


然而,该方式有一种致命的缺陷,就是无法实时更新热词,修改完文件,必须重启elasticsearch才能生效,要想实时生效,需使用远程配置方式

三、远程配置热词库

  1. 启动nginx服务
    这里我们使用nginx服务(有web服务功能就可以提供远程热词库的功能了),来配置远程热词库。
    关于nginx的部署可以参考我的这篇文章

nginx默认访问html文件夹下的文件,在html下创建文件夹es_ik,创建fenci.txt

Es如何设置不分词 es关闭分词_Es如何设置不分词_04


Es如何设置不分词 es关闭分词_xml_05


访问http://ip:port/es_ik/fenci.txt

正常显示则搭建成功

Es如何设置不分词 es关闭分词_Es如何设置不分词_06

  1. 配置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

Es如何设置不分词 es关闭分词_elasticsearch_07


可以看到:docker给nginx分配的ip是172.18.0.4配置前分词情况

Es如何设置不分词 es关闭分词_nginx_08


配置后

Es如何设置不分词 es关闭分词_xml_09


再试一个"胡噶撒旦撒"

Es如何设置不分词 es关闭分词_xml_10


只需修改fence.txt就可以了,无需重启动elasticsearch

Es如何设置不分词 es关闭分词_Es如何设置不分词_11

Es如何设置不分词 es关闭分词_elasticsearch_12

推荐使用远程刷新模式