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.测试

相关推荐
workflower4 分钟前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程
SunnyRivers1 小时前
关于ES中text类型时间字段范围查询的结构化解决方案
elasticsearch·时间·text·范围查询
东风微鸣1 小时前
TTRSS 迁移实战
docker·云原生·kubernetes·可观察性
API_technology2 小时前
电商搜索API的Elasticsearch优化策略
大数据·elasticsearch·搜索引擎
黄雪超2 小时前
大数据SQL调优专题——引擎优化
大数据·数据库·sql
The god of big data2 小时前
MapReduce 第二部:深入分析与实践
大数据·mapreduce
G***技3 小时前
杰和科技GAM-AI视觉识别管理系统,让AI走进零售营销
大数据·人工智能·系统架构
转身後 默落3 小时前
04.Docker 镜像命令
docker·容器·eureka
IT_张三3 小时前
Docker+Kubernetes_第一章_Docker入门
java·docker·kubernetes
jessezappy4 小时前
记录:Docker 安装记录
docker·安装·ollama·软链接