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{@Overridepublic 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