elasticsearch分词器词库热更新三种方案


一、本地文件读取方式

  1. 首先进入elasticsearch目录的plugins目录下,查看目录结构
    在这里插入图片描述
    2.进入confg目录下 创建文件mydic.dic 并添加:“我是中国人”
    在这里插入图片描述
    3.打开config目录下 IKAnalyzer.cfg.xml配置文件 vim IKAnalyzer.cfg.xml 修改内容如下:
    在这里插入图片描述
    4.保存启动es 观察日志
    在这里插入图片描述
    加载完成

二、远程扩展热更新 IK 分词

1.创建远程热更新词库(我用的nginx,在nginx静态资源目录html下创建hotUpdateLexicon.dic并写入词汇待会方便观察日志)如下:

在这里插入图片描述
2.打开config目录下 IKAnalyzer.cfg.xml配置文件 vim IKAnalyzer.cfg.xml 修改内容如下:

在这里插入图片描述
3.重启es观察日志

在这里插入图片描述
reload ik dict finished(重新加载完成)

三、重写ik源码连接mysql

1.下载源码包 链接: link. 找到对应版本

2、用idea打开找到词典管理类 如下图
在这里插入图片描述
3.在config目录下添加jdbc.yml
在这里插入图片描述
在这里插入图片描述

jdbc:
	  url: jdbc:mysql://localhost:3306/one?useUnicode=true&autoReconnect=true&failOverReadOnly=false&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
	  user: root
	  password : root
	  sql: SELECT  keyword FROM hot_words WHERE flag=0

4 .添加mysql maven库依赖
在这里插入图片描述
src\main\assemblies\plugin.xml如下:
在这里插入图片描述
添加配置使得数据库相关依赖一并打包

  1. 修改代码
static {
    try {
        //利用反射把mysql驱动加载到内存
        Class.forName("com.mysql.jdbc.Driver").newInstance();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

 /**
 * 从mysql加载热更新词典
 */
private void loadExtDictByMysql() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    Properties prop = null;
    InputStream inputStream = null;
    try {
        prop = new Properties();
        inputStream = inputStream = new FileInputStream(PathUtils.get(getDictRoot(), "jdbc.yml").toFile());
        prop.load(inputStream);
        conn = DriverManager.getConnection(
                prop.getProperty("url"),
                prop.getProperty("user"),
                prop.getProperty("password"));
        stmt = conn.createStatement();
        rs = stmt.executeQuery(prop.getProperty("sql"));

        while (rs.next()) {
            String theWord = rs.getString("keyword");
            _MainDict.fillSegment(theWord.trim().toCharArray());
        }
        logger.info("从mysql加载热更新词典成功!");
    } catch (Exception e) {
        logger.error("error", e);
    } finally {
        try {
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                logger.error("error", e);
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                logger.error("error", e);
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                logger.error("error", e);
            }
        }
    }
}

5.放入线程池 延迟执行任务(时间感兴趣可以写成配置文件形式,当前Dictionary类)
在这里插入图片描述
6.打包

  • 项目目录
    • 项目
      mvn clean package -Dmaven.skip.test=true

编译成功后,去获取zip文件
在这里插入图片描述
将zip解压到elasticsearch ik插件目录下
在这里插入图片描述
查看config 是否有jdbc.yml
在这里插入图片描述
7.启动(切换到elasticsearch bin目录下 ./elasticsearch &)
在这里插入图片描述
8.观察日志
错误1
在这里插入图片描述
Java 安全策略导致的异常 (具体没有深究),解决方案如下:

在/home/es/目录下新建  policy.policy  写入如下内容:
grant {
	permission java.lang.RuntimePermission "setContextClassLoader";
}

在elasticsearch  config目录文件jvm.option添加如下代码配置上面的文件路径如下图:

在这里插入图片描述

错误2

在这里插入图片描述
继续在policy.policy 写入如下内容:

grant {
		permission java.lang.RuntimePermission "setContextClassLoader";
	    permission java.net.SocketPermission "127.0.0.1:3306","connect,resolve";
};

保存继续启动观察日志
在这里插入图片描述

日志刷新时间和代码里配置时间一样120秒
至此 实现elasticsearch分词器词库热更新三种方案

才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以在留言区提出来,我对其加以修改。

感谢您的阅读

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值