ElasticSearch IK分词器的MySQL热部署字典(Docker)

1.下载插件源码

找到自己对应ES版本的下载

Releases · infinilabs/analysis-ik · GitHub

2.添加mysql驱动依赖

XML 复制代码
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>

3.修改ES版本为当前自己的版本

我这里是7.12.1

4.编写jdbc-reload.properties

每10s加载一次

bash 复制代码
jdbc.url=jdbc:mysql://192.168.88.129:3306/moni?serverTimezone=GMT
jdbc.user=root
jdbc.password=123456
jdbc.reload.sql=select word from hotwords
jdbc.reload.stopword.sql=select stopword as word from stopwords
jdbc.reload.interval=10000

5.编写热更新线程类

java 复制代码
package org.wltea.analyzer.dic;


import org.apache.logging.log4j.Logger;
import org.wltea.analyzer.help.ESPluginLoggerFactory;

public class HotDictReloadThread implements Runnable {

    private static final Logger LOGGER = ESPluginLoggerFactory.getLogger(HotDictReloadThread.class.getName());
    @Override
    public void run() {
        while(true) {
            LOGGER.info("[==========]从MYSQL中读取字典......");
            Dictionary.getSingleton().reLoadMainDict();
        }
    }

}

6.修改Dictionary类(约157行)

java 复制代码
//启动热词字典加载线程
new Thread(new HotDictReloadThread()).start();

7.387行添加

java 复制代码
loadMySQLExtDict()
java 复制代码
private static Properties prop = new Properties();

	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			logger.error("error", e);
		}
	}

	/**
	 * 从mysql加载热更新词典
	 */
	private void loadMySQLExtDict() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {
			Path file = PathUtils.get(getDictRoot(), "jdbc-reload.properties");
			prop.load(new FileInputStream(file.toFile()));

			logger.info("[==========]jdbc-reload.properties");
			for(Object key : prop.keySet()) {
				logger.info("[==========]" + key + "=" + prop.getProperty(String.valueOf(key)));
			}

			logger.info("[==========]query hot dict from mysql, " + prop.getProperty("jdbc.reload.sql") + "......");

			conn = DriverManager.getConnection(
					prop.getProperty("jdbc.url"),
					prop.getProperty("jdbc.user"),
					prop.getProperty("jdbc.password"));
			stmt = conn.createStatement();
			rs = stmt.executeQuery(prop.getProperty("jdbc.reload.sql"));

			while(rs.next()) {
				String theWord = rs.getString("word");
				logger.info("[==========]hot word from mysql: " + theWord);
				_MainDict.fillSegment(theWord.trim().toCharArray());
			}

			Thread.sleep(Integer.valueOf(String.valueOf(prop.get("jdbc.reload.interval"))));
		} catch (Exception e) {
			logger.error("erorr", e);
		} finally {
			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);
				}
			}
		}
	}

8.编写加载停用字段代码

java 复制代码
//方法最后添加
this.loadMySQLStopwordDict();
java 复制代码
/**
	 * 从mysql加载停用词
	 */
	private void loadMySQLStopwordDict() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {
			Path file = PathUtils.get(getDictRoot(), "jdbc-reload.properties");
			prop.load(new FileInputStream(file.toFile()));

			logger.info("[==========]jdbc-reload.properties");
			for(Object key : prop.keySet()) {
				logger.info("[==========]" + key + "=" + prop.getProperty(String.valueOf(key)));
			}

			logger.info("[==========]query hot stopword dict from mysql, " + prop.getProperty("jdbc.reload.stopword.sql") + "......");

			conn = DriverManager.getConnection(
					prop.getProperty("jdbc.url"),
					prop.getProperty("jdbc.user"),
					prop.getProperty("jdbc.password"));
			stmt = conn.createStatement();
			rs = stmt.executeQuery(prop.getProperty("jdbc.reload.stopword.sql"));

			while(rs.next()) {
				String theWord = rs.getString("word");
				logger.info("[==========]hot stopword from mysql: " + theWord);
				_StopWords.fillSegment(theWord.trim().toCharArray());
			}

			Thread.sleep(Integer.valueOf(String.valueOf(prop.get("jdbc.reload.interval"))));
		} catch (Exception e) {
			logger.error("erorr", e);
		} finally {
			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);
				}
			}
		}
	}

9.maven打包

10.上传至docker

先解压再上传至plugins文件内(会报错,可以先看下一步)

11.重新启动报错

12.解决报错

删除ik分词器,启动ES容器,进入容器

java 复制代码
docker exec -it es bash

cd config

新建socketPolicy.policy

touch socketPolicy.policy

java 复制代码
cat >> socketPolicy.policy <<"EOF"
grant {
   permission java.net.SocketPermission "*:*","accept,connect,resolve";
   permission java.lang.RuntimePermission "setContextClassLoader";
};
EOF

修改jvm.options,注意路径要从/usr/share开始写

java 复制代码
cat >> jvm.options <<"EOF"
-Dfile.encoding=GBK
-Djava.security.policy=/usr/share/elasticsearch/config/socketPolicy.policy
EOF

13.把IK插件再重新加入到plugins中

14.测试

相关推荐
Thomas2143几秒前
spark view永久保存 + paimon对应的view
大数据·分布式·spark
小北方城市网10 分钟前
Redis 缓存设计与避坑实战:解决穿透 / 击穿 / 雪崩
java·大数据·数据库·redis·python·elasticsearch·缓存
天远云服13 分钟前
Node.js实战:天远车辆出险查询API接口调用流程、代码接入与场景应用
大数据·node.js
福客AI智能客服17 分钟前
信任驱动:客服AI系统与智能AI客服重构电商服务价值
大数据·人工智能·机器人
郑州光合科技余经理19 分钟前
O2O上门预约小程序:全栈解决方案
java·大数据·开发语言·人工智能·小程序·uni-app·php
等风来不如迎风去20 分钟前
【docker】ubuntu空间不够了,删除ragflow
ubuntu·docker·容器
dongpengli24 分钟前
2026年iPaas系统集成平台综合分析及选型参考
大数据·运维·人工智能·自动化办公·ipaas·企业系统集成
新诺韦尔API25 分钟前
车架号查询接口对接全流程详解
大数据·开发语言·python·api
金融小师妹31 分钟前
基于AI多模态分析的日本黄金储备60%跃升研究:外汇结构重构与资产价格联动机制解构
大数据·数据结构·人工智能·深度学习
CHrisFC38 分钟前
江苏硕晟 LIMS 系统:湖泊环保水务治理的智慧引擎
大数据·人工智能