elasticSearch Ik 分词器部署及热更新

elasticSearch Ik 分词器部署及热更新,第1张

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  
  
如下:



        IK Analyzer 扩展配置
        
        myCustom.dic
         
        
        
        
        
        


保存文件并重启 elasticsearch

这时候执行2.1的查询,则可以看到 刘大海 作为了一个词语返回
2.21 自定义停用词(敏感词)
我想把刘大海作为一个停用词,那该怎么办?

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


修改 IK 分词器的配置文件
  vi /home/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml  
如下:



        IK Analyzer 扩展配置
        
        myCustom.dic
         
        myDisabled.dic
        
        
        
        



保存文件并重启 elasticsearch

这时候执行2.1的查询,则可以看到 刘大海,被去掉了,这里可以得出一个结论,如果自定义停用词跟自定义分词,都有同一个词,则结果中是不会返回该词
 
原理如下:程序先分词,然后用分词的结果,去匹配 停用词列表,如果在停用词列表中,则排除;请注意,是完全匹配,而不是包含,如 自定义分词中有刘大海,而自定义停用词中有大海,刘大海还是会返回。换个思路 也就是,停用词中的词必须是在分词中存在才会被禁用
问题
    你已经发现了,不管我们是添加自定义停用词 还是 自定义分词 都需要重新启动 elasticsearch,如果是单机的环境,其实就还好,但是如果是分布式部署那就很麻烦了,你首先要保证每台机子都分别添加对应的词语,还有重启elasticsearch,都是一些大工程。所以我们想 能不能 远程更新呢?

    接下来让我们来进入 ik 分词热更新部署
3. 远程部署ik的停用词以及分词



        IK Analyzer 扩展配置
        
        myCustom.dic
         
        myDisabled.dic
        
        
        
        http://xxxxx/myDisabled



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实现动态词库实时更新

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5606468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存