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

文章目录

  • 一、本地文件读取方式
  • 二、远程扩展热更新 IK 分词
  • 三、重写ik源码连接mysql


一、本地文件读取方式

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

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

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

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

elasticsearch分词器词库热更新三种方案_第2张图片
3.重启es观察日志

elasticsearch分词器词库热更新三种方案_第3张图片
reload ik dict finished(重新加载完成)

三、重写ik源码连接mysql

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

2、用idea打开找到词典管理类 如下图
elasticsearch分词器词库热更新三种方案_第4张图片
3.在config目录下添加jdbc.yml
elasticsearch分词器词库热更新三种方案_第5张图片
elasticsearch分词器词库热更新三种方案_第6张图片

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库依赖
elasticsearch分词器词库热更新三种方案_第7张图片
src\main\assemblies\plugin.xml如下:
elasticsearch分词器词库热更新三种方案_第8张图片
添加配置使得数据库相关依赖一并打包

  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类)
elasticsearch分词器词库热更新三种方案_第9张图片
6.打包

  • 项目目录
    • elasticsearch分词器词库热更新三种方案_第10张图片
      mvn clean package -Dmaven.skip.test=true

编译成功后,去获取zip文件
elasticsearch分词器词库热更新三种方案_第11张图片
将zip解压到elasticsearch ik插件目录下
在这里插入图片描述
查看config 是否有jdbc.yml
在这里插入图片描述
7.启动(切换到elasticsearch bin目录下 ./elasticsearch &)
在这里插入图片描述
8.观察日志
错误1
elasticsearch分词器词库热更新三种方案_第12张图片
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";
};

保存继续启动观察日志
elasticsearch分词器词库热更新三种方案_第13张图片

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

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

感谢您的阅读

你可能感兴趣的:(elasticsearch,jdbc,数据库,java,mysql)