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

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
  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值