首页 > 数据库 >ElasticSearch IK分词器的MySQL热部署字典(Docker)

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

时间:2024-08-19 10:55:28浏览次数:11  
标签:jdbc prop reload IK ElasticSearch 分词器 error logger null

1.下载插件源码

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

Releases · infinilabs/analysis-ik · GitHub

2.添加mysql驱动依赖

        <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加载一次

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.编写热更新线程类

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行)

//启动热词字典加载线程
new Thread(new HotDictReloadThread()).start();

 7.387行添加

loadMySQLExtDict()

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.编写加载停用字段代码

//方法最后添加
this.loadMySQLStopwordDict();
/**
	 * 从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容器,进入容器

docker exec -it es bash

cd config

新建socketPolicy.policy

touch socketPolicy.policy

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

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

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

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

14.测试

标签:jdbc,prop,reload,IK,ElasticSearch,分词器,error,logger,null
From: https://blog.csdn.net/qq_52464274/article/details/141319441

相关文章

  • Scikit-learn从入门到放弃
    目录Scikit-learn简介SVM分类随机森林回归K-means聚类前置建议阅读:1、NumPy从入门到放弃2、Pandas从入门到放弃3、SciPy从入门到放弃Scikit-learn简介Sklearn:官方文档https://scikitlearn.com.cn/0.21.3/Scikit-learn(也称sklearn)是基于Python编程语言的机器学习工具,是......
  • go elasticsearch聚合统计
    在Go语言中使用Elasticsearch进行聚合统计,你可以使用 olivere/elastic  这个流行的Elasticsearch客户端库。以下是一个使用 olivere/elastic  进行聚合统计的示例代码:首先,你需要安装 olivere/elastic  库:gogetgithub.com/olivere/elastic然后,你可以编写......
  • Oracle 数据库中的函数REGEXP_LIKE
    REGEXP_LIKE是Oracle数据库中的一个函数,它用于基于正则表达式模式匹配字符串。这个函数非常强大,允许你执行复杂的字符串搜索和匹配操作,比标准的LIKE语句更加强大和灵活。语法REGEXP_LIKE(source_string,pattern[,match_parameter])source_string:要进行模式匹配......
  • Elasticsearch(ES)(版本7.x)数据更新后刷新策略RefreshPolicy
    Elasticsearch(ES)(版本7.x)数据更新后刷新策略RefreshPolicy介绍ES数据写入后,默认1s后才会被搜索到(refresh_interval为1);这样可能是考虑到性能问题,毕竟实时IO消耗较多资源造成的问题例如一个索引现在有100个文档,当新增一个文档时,立即查询,显示数量为100,并不为101例如......
  • minikube && k8s 命令
    minikubedocker-envminikubedashboardminikubessh导出一个已经创建的容器导到一个文件dockerexport-o文件名.tar容器id将文件导入为镜像dockerimport文件名.tar镜像名:镜像标签本地镜像关联到minikubeminikube"docker-env"将容器保存为镜像:dockercommit<容......
  • docker安装Elasticsearch
     一、创建网络 dockernetworkcreatees-net 二、拉取镜像 dockerpullelasticsearch:8.6.0 三、创建容器 dockerrun-d\--nameelasticsearch\--networkes-net\-p9200:9200\-p9300:9300\--privileged\elasticsearch:8.6.0 四、修改......
  • 【AiDocZh.com】Scikit-Learn1.6官方文档中文翻译上线啦
    【AiDocZh.com】Scikit-Learn1.6官方文档中文翻译上线啦网站地址:http://www.aidoczh.com/scikit-learn/一、scikit-learn官方文档翻译自从有了想翻译scikit-learn官方文档的想法,已经有了半年时间,现在终于翻译和校验完了。由于精力有限,难免会有一些错误,请大家见谅。scikit......
  • TikTok网络无法连接?4个方法解决它
    “Nonetworkconnection”!当你信心满满下载并准备开始运营TikTok时,屏幕上如果提示“无互联网连接”非常难办。有很多因素可能会导致此问题,包括网络连接无效、应用程序故障等。接下来将为你盘点主要的原因与解决方法。一、无网络连接的原因1、地区网络限制TikTok作为海外版......
  • Tiktok和亚马逊合流?社交电商成为新趋势
    2024年8月,Tiktok和亚马逊的合作成为了业界关注的焦点。亚马逊与TikTok宣布了一项新协议,允许用户在TikTok上直接购买亚马逊商品,无需切换应用。亚马逊表示,这一举措将简化社交媒体上的购物流程,让用户享受更加便捷的购物体验。TikTok亦对此次合作表示欢迎,认为这将为用户带来流畅且......
  • 打靶记录9——Vikings
    靶机下载地址:https://www.vulnhub.com/entry/vikings-1,741/难度:低(中),CTF风格的靶机目标:取得root权限+2个flag涉及的攻击方法:主机发现端口扫描Web信息收集编码转换/文件还原离线密码破解隐写术二进制文件提取素数查找/科拉茨猜想RPC漏洞提权主机发现:sudoarp-sc......