elasticsearch6.5.4 添加 ik 中文分词器无需重启分词热更新

6 篇文章 0 订阅
2 篇文章 0 订阅

第一步: 安装elasticsearch6.5.4版本

第二步:下载elasticsearch-ik-6.5.4.zip 例如:https://github.com/medcl/elasticsearch-analysis-ik

               拷贝到es的plugins/ik目录下 解压缩,

               把elasticsearch-analysis-ik-6.5.4.jar拷贝到 plugins/ik 目录下

               

              打开cmd 切到 ik 的根目录 开始打包执行命令 mvn clean package -DskipTests

BUILD SUCCESS 成功后,到target 目下找到 jar包 

第三步 :在es的config目录下新建analysis-ik文件夹

               拷贝 IKAnalyzer.cfg.xml 并且把系统的字典文件同时拷贝过来

修改 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">lk_word.dic</entry>
     <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords"></entry>
    <!--用户可以在这里配置远程扩展字典 默认值 location -->
    <entry key="remote_ext_dict">http://www.xxxxxx.com:8080/system/ik/actualTimeRedDic.do</entry>
    <!--用户可以在这里配置远程扩展停止词字典-->
    <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

注意:若你是单节点的es集群的话,则只需在一台部署es-ik。若比如像我这里的话,是3台,则需在三台都部署es-ik,且配置要一样。

参数  remote_ext_dict 默认值远程扩展字典的 地址location 替换为 你的服务端地址 例如:http://www.xxxxxx.com:8080/system/ik/actualTimeRedDic.do

          该请求只需满足以下两点即可完成分词热更新,即http 请求需要返回两个头部(header)

1. 一个是 Last-Modified

2. 一个是 ETag

这两者都是字符串类型,只要有一个发生变化,该插件就会去抓取新的分词进而更新词库。 http 请求返回的内容格式是一行一个分词,换行符用 \n 。满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例

例如 :

public void loadDic (HttpServletRequest req,HttpServletResponse response){
        OutputStream out = null;
        try {

             String filePath = "D:/word.text"
            // 读取字典文件
            File file = new File(filepath);
            String content = "";
            if(file.exists()){
                // 读取文件内容
                FileInputStream fi = new FileInputStream(file);
                byte[] buffer = new byte[(int) file.length()];
                int offset = 0, numRead = 0;
                while (offset < buffer.length && (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
                    offset += numRead;
                }
                fi.close();
                content = new String(buffer, "UTF-8");
            }
            // 返回数据
            out = response.getOutputStream();
            response.setHeader("Last-Modified", String.valueOf(System.currentTimeMillis()));
            response.setHeader("ETag",String.valueOf(System.currentTimeMillis()));
            response.setContentType("text/plain; charset=utf-8");
            out.write(content.getBytes("utf-8"));
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != out) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

当 d:/word.txt (utf-8)内容发生变化时,es 监听器就会每格 1 分钟,检查一次,也就是说,至少等待一分钟后,更新的分词才会有效果。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值