elasticSearch Ik 分词器部署及热更新

先安装好 elasticSearch

登录linux

进入home目录: cd home
下载:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.2-linux-x86_64.tar.gz
解压: tar -zxvf elasticsearch-7.15.2-linux-x86_64.tar.gz
修改文件夹名字:mv elasticsearch-7.15.2-linux-x86_64 elasticsearch
创建es 用户: es 不允许root用户执行程序
         useradd es
         passwd es(设置密码)
         chown -R es:es elasticsearch
         su es #切换到es用户去操作

主要目录:
    可执行文件目录:/home/elasticsearch/bin/
    配置文件: /home/elasticsearch/config/

如果你的机器内存有2G以上,则不用做该操作,Es默认启动是要占用1G的内存
    vi /home/elasticsearch/config/jvm.options
            -Xms512m
            -Xmx512m

ES主要配置文件:/home/elasticsearch/config/elasticsearch.yml,以下几个参数打开配置
    path.data:  /home/es/data  # 数据存放路径
    path.logs:  /home/es/logs #日志存放路径
 
    network.host: 0.0.0.0 # 0.0.0.0 允许所有ip访问
    http.port: 9200 #端口


启动ES: ./home/elasticsearch/bin/elasticsearch

IK分词器(下载地址)

进入到elasticsearch 的插件目录下
cd /home/elasticsearch/plugins

下载压缩包
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.15.2/elasticsearch-analysis-ik-7.15.2.zip

解压压缩包
unzip elasticsearch-analysis-ik-7.15.2.zip

重命名
mv elasticsearch-analysis-ik-7.15.2 ik

#重启elasticsearch
./home/elasticsearch/bin/elasticsearch

有可能会报错:Plugin [analysis-ik] was built for Elasticsearch version 7.15.0 but version 7.12.1 is running
    那就是需要你自己重新更换下ik的版本,版本一定是要匹配才可以

当然也可以有其他的办法,让版本不一致的运行起来:vi /home/elasticsearch/plugins/ik/plugin-descriptor.properties 把 elasticsearch.version 修改成跟你安装的 elasticsearch 版本一致即可,但是会不会有其他问题就不敢保证了

IK目录文件说明

配置目录
    extra_main.dic
    extra_single_word.dic
    extra_single_word_full.dic
    extra_single_word_low_freq.dic
    extra_stopword.dic
    IKAnalyzer.cfg.xml # 用来配置自定义词库
    main.dic # ik原生内置的中文词库
    preposition.dic
    quantifier.dic #放了一些单位相关的词
    stopword.dic #英文停用词
    suffix.dic # 放了一些后缀
    surname.dic #中国的姓氏

2.IK 分词器测试

2.1.1 ik_smart 最粗粒度拆分

POST _analyze
{
    "analyzer": "ik_smart",
    "text": "刘大海是大元宝"
}

结果: 可以明显看到拆分成了 刘、大海、是、大、元宝 5个词语

2.1.2 ik_max_word 最细粒度拆分

POST _analyze
{
    "analyzer": "ik_max_word",
    "text": "刘大海是大元宝"
}


结果: 可以明显看到拆分成了 刘、大海、是、大、元宝 5个词语

2.2 自定义分词

我想把刘大海作为一个词,那该怎么办?

创建自定义文件
  vi /home/elasticsearch/plugins/ik/config/myCustom.dic   添加 刘大海

修改 IK 分词器的配置文件
  vi /home/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">myCustom.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

保存文件并重启 elasticsearch

这时候执行2.1的查询,则可以看到 刘大海 作为了一个词语返回

2.21 自定义停用词(敏感词)

我想把刘大海作为一个停用词,那该怎么办?

创建自定义文件
  vi /home/elasticsearch/plugins/ik/config/myDisabled.dic   添加 刘大海


修改 IK 分词器的配置文件
  vi /home/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">myCustom.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">myDisabled.dic</entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>


保存文件并重启 elasticsearch

这时候执行2.1的查询,则可以看到 刘大海,被去掉了,这里可以得出一个结论,如果自定义停用词跟自定义分词,都有同一个词,则结果中是不会返回该词
 
原理如下:程序先分词,然后用分词的结果,去匹配 停用词列表,如果在停用词列表中,则排除;请注意,是完全匹配,而不是包含,如 自定义分词中有刘大海,而自定义停用词中有大海,刘大海还是会返回。换个思路 也就是,停用词中的词必须是在分词中存在才会被禁用

问题

    你已经发现了,不管我们是添加自定义停用词 还是 自定义分词 都需要重新启动 elasticsearch,如果是单机的环境,其实就还好,但是如果是分布式部署那就很麻烦了,你首先要保证每台机子都分别添加对应的词语,还有重启elasticsearch,都是一些大工程。所以我们想 能不能 远程更新呢?

    接下来让我们来进入 ik 分词热更新部署

3. 远程部署ik的停用词以及分词

<?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">myCustom.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">myDisabled.dic</entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <entry key="remote_ext_stopwords">http://xxxxx/myDisabled</entry>
</properties>


http://xxxxx/myDisabled 文件更新了,elasticsearch 大概 1min 后,会自动拉取文件,最长时间是 1min

其中 location 是指一个 url,比如 http://xxxxx/myDisabled,该请求只需满足以下两点即可完成分词热更新。
    1. 该 http 请求需要返回两个头部(header),一个是 Last-Modified,一个是 ETag,这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。
    2. 该 http 请求返回的内容格式是一行一个分词,换行符用 \n 即可。
满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。

如果想直接链接数据库,那可以参考 文章 IK分词器改源码实现MySql5.7.2实现动态词库实时更新

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值