1 源码阅读思路

阅读Dictionary类下的initial方法,基于该方法进行改造

2 下载源码

https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v8.4.3

3 导入idea

4 创建jdbc配置文件

jdbc.url=jdbc:mysql://192.168.38.80:3306/word_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
jdbc.user=root
jdbc.password=123456
jdbc.reload.word.extend.sql=select word from t_extend_word
jdbc.reload.word.stop.sql=select word from t_stop_word
jdbc.driver.class.name=com.mysql.jdbc.Driver

5 防止初始化数据库驱动报错ExceptionInInitializerError 修改文件resource/plugin-security.policy

添加权限 permission java.lang.RuntimePermission “setContextClassLoader”;

grant {// needed because of the hot reload functionalitypermission java.net.SocketPermission "*", "connect,resolve";permission java.lang.RuntimePermission "setContextClassLoader";
};

6 Dictionary 新增方法

void reloadMysqlStopWord(DictSegment _StopWords) {logger.info("start to reload mysql  stopWord.");this._StopWords = _StopWords;}void reloadMysqlExtendWord(DictSegment _MainDict) {logger.info("start to reload mysql extendWord.");this._MainDict = _MainDict;}


7 创建WordMysqlRunnable

package org.wltea.analyzer.dic;import org.apache.logging.log4j.Logger;
import org.elasticsearch.SpecialPermission;
import org.wltea.analyzer.help.ESPluginLoggerFactory;import java.security.AccessController;
import java.security.PrivilegedAction;
import java.sql.*;
import java.util.List;
import java.util.Properties;public class WordMysqlRunnable implements Runnable {private static final Logger logger = ESPluginLoggerFactory.getLogger(WordMysqlRunnable.class.getName());/*** mysql配置文件*/private final Properties properties;/*** type: extend、stop*/private final String type;public static final String EXTEND = "extend";public static final String STOP = "stop";public WordMysqlRunnable(Properties properties, String type) {AccessController.doPrivileged((PrivilegedAction<Void>) () -> {try {Class.forName(properties.getProperty("jdbc.driver.class.name"));} catch (ClassNotFoundException e) {throw new RuntimeException(e);}return null;});this.properties = properties;this.type = type;}@Overridepublic void run() {SpecialPermission.check();AccessController.doPrivileged((PrivilegedAction<Void>) () -> {this.loadWord();return null;});}private void loadWord() {logger.info("WordMysqlRunnable invoke run");Connection conn = null;Statement stmt = null;try {conn = DriverManager.getConnection(properties.getProperty("jdbc.url"), properties.getProperty("jdbc.user"), properties.getProperty("jdbc.password"));stmt = conn.createStatement();if (type.equals(EXTEND)) {loadExtendWord(stmt);} else if (type.equals(STOP)) {loadStopWord(stmt);}} catch (Exception e) {logger.error(e);} finally {if (stmt != null) {try {stmt.close();} catch (SQLException e) {logger.error(e);}}if (conn != null) {try {conn.close();} catch (SQLException e) {logger.error(e);}}}}private void loadStopWord(Statement stmt) throws SQLException {logger.info("WordMysqlRunnable invoke loadStopWord");// 建立主词典实例DictSegment _StopWords = new DictSegment((char) 0);//执行sqlString sql = properties.getProperty("jdbc.reload.word.stop.sql");ResultSet resultSet = stmt.executeQuery(sql);while (resultSet.next()) {String word = resultSet.getString("word");_StopWords.fillSegment(word.trim().toLowerCase().toCharArray());}//加载Dictionary.getSingleton().reloadMysqlStopWord(_StopWords);}private void loadExtendWord(Statement stmt) throws SQLException {logger.info("WordMysqlRunnable invoke loadExtendWord");// 建立一个主词典实例DictSegment _MainDict = new DictSegment((char) 0);//执行sqlString sql = properties.getProperty("jdbc.reload.word.extend.sql");ResultSet resultSet = stmt.executeQuery(sql);while (resultSet.next()) {String word = resultSet.getString("word");_MainDict.fillSegment(word.trim().toLowerCase().toCharArray());}//加载Dictionary.getSingleton().reloadMysqlExtendWord(_MainDict);}
}

8 修改方法Dictionary initial 方法

public static synchronized void initial(Configuration cfg) {if (singleton == null) {synchronized (Dictionary.class) {if (singleton == null) {singleton = new Dictionary(cfg);singleton.loadMainDict();singleton.loadSurnameDict();singleton.loadQuantifierDict();singleton.loadSuffixDict();singleton.loadPrepDict();singleton.loadStopWordDict();//自定义mysql词汇singleton.loadMysqlWord();if (cfg.isEnableRemoteDict()) {// 建立监控线程for (String location : singleton.getRemoteExtDictionarys()) {// 10 秒是初始延迟可以修改的 60是间隔时间 单位秒pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);}for (String location : singleton.getRemoteExtStopWordDictionarys()) {pool.scheduleAtFixedRate(new Monitor(location), 10, 60, TimeUnit.SECONDS);}}}}}}private void loadMysqlWord() {try {Properties properties = new Properties();Path path = PathUtils.get(getDictRoot(), "jdbc-reload.properties");properties.load(Files.newInputStream(path.toFile().toPath()));pool.scheduleAtFixedRate(new WordMysqlRunnable(properties, WordMysqlRunnable.EXTEND), 10, 60, TimeUnit.SECONDS);pool.scheduleAtFixedRate(new WordMysqlRunnable(properties, WordMysqlRunnable.STOP), 10, 60, TimeUnit.SECONDS);} catch (IOException e) {logger.error("e", e);}}

9 pom版本需要跟ik分词版本一致

10 pom中新增mysql依赖

<!-- MySql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>

11 修改plugin.xml 添加mysql配置

<dependencySet><outputDirectory>/</outputDirectory><useProjectArtifact>true</useProjectArtifact><useTransitiveFiltering>true</useTransitiveFiltering><includes><include>mysql:mysql-connector-java</include></includes></dependencySet>

12 打包

13 替换、重启

unzip elasticsearch-analysis-ik-8.4.3.zip -d ik-analyzer
rm -rf elasticsearch-analysis-ik-8.4.3.zip
chmod +777 ik-analyzer/
docker restart elasticsearch

14 测试

ElasticSearch最新版(8.4.3) IK分词器基于mysql实现热更新词库相关推荐

  1. 六Elasticsearch之中文分词器插件es-ik的热更新词库

    参考:http://www.mamicode.com/info-detail-1705113.html 先声明,热更新词库,需要用到,web项目和Tomcat.不会的,请移步 Eclipse下Mave ...

  2. Elasticsearch 分词器详解(热更新词库)

    1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...

  3. ElasticSearch ik分词器从MySQL里面获取分词信息

    出自 中华石杉 老师的一个课程, 缘由 每次都是在es的扩展词典中,手动添加新词语,很坑 (1)每次添加完,都要重启es才能生效,非常麻烦 (2)ElasticSearch是分布式的,可能有数百个节点 ...

  4. 拾忆Elasticsearch01:Elasticsearch概述及相关ES、IK分词器等下载安装

    为了防止老年痴呆记不住学过的Elasticsearch,在这里写点blog回顾一下 写在前面,建议下载以下出现的Elasticsearch版本,我之前下的7.6.1在这里找不到对应的springboo ...

  5. es ik分词热更新MySQL,ElasticSearch(25)- 改IK分词器源码来基于mysql热更新词库

    代码地址 已经修改过的支持定期从数据库中提取新词库,来实现热更新.代码: https://github.com/csy512889371/learndemo/tree/master/elasticse ...

  6. Elasticsearch之中文分词器插件es-ik的自定义热更新词库

    1: 部署 http 服务 在这使用 tomcat7 作为 web 容器, 先下载一个 tomcat7, 然后上传到某一台服务器上(192.168.80.10). 再执行以下命令 tar -zxvf ...

  7. 31_ElasticSearch 修改IK分词器源码来基于mysql热更新词库

    31_ElasticSearch 修改IK分词器源码来基于mysql热更新词库 更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boo ...

  8. ik mysql热加载分词_Elasticsearch 之(25)重写IK分词器源码来基于mysql热更新词库...

    热更新在上一节< IK分词器配置文件讲解以及自定义词库>自定义词库,每次都是在es的扩展词典中,手动添加新词语,很坑 (1)每次添加完,都要重启es才能生效,非常麻烦 (2)es是分布式的 ...

  9. ElasticSearch 中文分词器ik的安装、测试、使用、自定义词库、热更新词库

    文章目录 # 实验环境 # ik分词器的下载.安装.测试 ## 安装方法一:使用elasticsearch-plugin 安装 ## 安装方法二:下载编译好的包进行安装 1.下载 2.安装 3.重启` ...

最新文章

  1. javascript回调函数笔记
  2. 百度开放AI应用学习!
  3. 准确率,召回率,F值,ROC,AUC
  4. Windows下使用静态库
  5. 国产数据库技术全面破冰,金融核心系统打破国外巨头垄断指日可待
  6. java ide eclipse,java IDE Eclipse
  7. 线性代数与矩阵论 定理 1.3.9 唯一析因定理
  8. Cobalt Strike参数详解
  9. 绘制直方图,计算CPK、PPK等数据
  10. 2015-5-10分享的PDF
  11. oracle数据库greatest函数,ORACLE函数之GREATEST函数详解范例
  12. 如何使用chevereto自建图床
  13. win7系统自带的虚拟xp模式
  14. C语言实现SM4加解密算法
  15. JavaScript 页面资源加载方法onload,onerror总结
  16. 2019年高考数学立体几何解题技巧分析策略
  17. winmm.lib库
  18. Oracle表空间管理和维护
  19. H5培训第一天基础知识总结
  20. zoj 1002 Fire Net 碉堡的最大数量【DFS】

热门文章

  1. Oracle数据库PL/SQL中执行存储过程
  2. (附源码)springboot线上作业提交系统 毕业设计 220946
  3. 互联网消费金融行业从业者的实战指南
  4. React学习笔记(上)
  5. 使用UmiJS和DvaJS完成用户管理系统
  6. 从图像中删除不想要的东西。
  7. JSP商品进出库管理系统myeclipse开发sql数据库bs框架java编程jdbc 详细设计
  8. 网络 链路层 | 以太网协议与ARP协议
  9. GSYVideoPlayer 视频播放器 GSYVideoPlayer
  10. 在ipad上刷android系统更新,全自动刷安卓4.0 索尼SGPT111刷机教程