ik分词器动态从数据库中加载数据无需重启

发布时间:2023年12月20日

ik分词器加载mysql数据库中的热词库

1、下载elasticsearch-analysis-ik 源码包

下载elasticsearch-analysis-ik打开项目(https://github.com/medcl/elasticsearch-analysis-ik)

2、修改插件代码

(1)修改pom.xml中对应版本号

在这里插入图片描述

(2)org.wltea.analyzer.dic.Dictionary 单例类的初始化方法 initial,所有词库都是在这里进行创建

	/**
	 * 词典初始化 由于IK Analyzer的词典采用Dictionary类的静态方法进行词典初始化
	 * 只有当Dictionary类被实际调用时,才会开始载入词典, 这将延长首次分词操作的时间 该方法提供了一个在应用加载阶段就初始化字典的手段
	 * 
	 * @return Dictionary
	 */
	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();
					//新增线程加载词库(此处新增)
                    new Thread(new HotDict()).start();
                    
					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);
						}
					}

				}
			}
		}
	}

(3)新增类HotDict,循环调用方法,对词库进行更新

package org.wltea.analyzer.dic;

public class HotDict implements Runnable{
   
    @Override
    public void run() {
   
        while (true) {
   
            Dictionary.getSingleton().reLoadMainDict();
        }
    }
}

(4)在 loadMainDict 方法中添加自定义的 MySQL 词库

private void loadMainDict() {
   
		// 建立一个主词典实例
		_MainDict = new DictSegment((char) 0);

		// 读取主词典文件
		Path file = PathUtils.get(getDictRoot(), Dictionary.PATH_DIC_MAIN);
		loadDictFile(_MainDict, file, false, "Main Dict");
		// 加载扩展词典
		this.loadExtDict();
		// 加载远程自定义词库
		this.loadRemoteExtDict();

		// 加载远程MySql自定义词库(新增)
		this.loadMySQLExtDict();
	}
	/**
     * 加载用户配置的MySQL热词库(新增)
     */
    private void loadMySQLExtDict() {
   
        ResultSet mainRs = null;
        Connection conn = null;
        Statement stmt = null;
        try {
   
            Path file = PathUtils.get(getDictRoot(), "jdbc-reload.properties");
            props.load(new FileInputStream(file.toFile()));
            logger.info("[==========]query hot dict from DB, " + props.getProperty("jdbc.reload.sql") + "......");
            Class.forName(props.getProperty("jdbc.driver"));
            conn = DriverManager.getConnection(
                    props.getProperty("jdbc.url"),
                    props.getProperty("jdbc.user"),
                    props.getProperty
文章来源:https://blog.csdn.net/qq_41978323/article/details/135076105
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。