文章目录
一、本地文件读取方式二、远程扩展热更新 IK 分词三、重写ik源码连接mysql一、本地文件读取方式
首先进入elasticsearch目录的plugins目录下,查看目录结构2.进入confg目录下 创建文件mydic.dic 并添加:“我是中国人”
3.打开config目录下 IKAnalyzer.cfg.xml配置文件 vim IKAnalyzer.cfg.xml 修改内容如下:
4.保存启动es 观察日志
加载完成
二、远程扩展热更新 IK 分词
1.创建远程热更新词库(我用的nginx,在nginx静态资源目录html下创建hotUpdateLexicon.dic并写入词汇待会方便观察日志)如下:
2.打开config目录下 IKAnalyzer.cfg.xml配置文件 vim IKAnalyzer.cfg.xml 修改内容如下:
3.重启es观察日志
reload ik dict finished(重新加载完成)
三、重写ik源码连接mysql
1.下载源码包 链接: link. 找到对应版本
2、用idea打开找到词典管理类如下图
3.在config目录下添加jdbc.yml
jdbc:url: jdbc:mysql://localhost:3306/one?useUnicode=true&autoReconnect=true&failOverReadOnly=false&characterEncoding=utf8&useSSL=false&serverTimezone=UTCuser: rootpassword : rootsql: SELECT keyword FROM hot_words WHERE flag=0
4 .添加mysql maven库依赖
src\main\assemblies\plugin.xml如下:
添加配置使得数据库相关依赖一并打包
修改代码
static {try {//利用反射把mysql驱动加载到内存Class.forName("com.mysql.jdbc.Driver").newInstance();} catch (Exception e) {e.printStackTrace();}}/*** 从mysql加载热更新词典*/private void loadExtDictByMysql() {Connection conn = null;Statement stmt = null;ResultSet rs = null;Properties prop = null;InputStream inputStream = null;try {prop = new Properties();inputStream = inputStream = new FileInputStream(PathUtils.get(getDictRoot(), "jdbc.yml").toFile());prop.load(inputStream);conn = DriverManager.getConnection(prop.getProperty("url"),prop.getProperty("user"),prop.getProperty("password"));stmt = conn.createStatement();rs = stmt.executeQuery(prop.getProperty("sql"));while (rs.next()) {String theWord = rs.getString("keyword");_MainDict.fillSegment(theWord.trim().toCharArray());}logger.info("从mysql加载热更新词典成功!");} catch (Exception e) {logger.error("error", e);} finally {try {if (inputStream != null) {inputStream.close();}} catch (IOException e) {e.printStackTrace();}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);}}}}
5.放入线程池 延迟执行任务(时间感兴趣可以写成配置文件形式,当前Dictionary类)
6.打包
项目目录
mvn clean package -Dmaven.skip.test=true
编译成功后,去获取zip文件
将zip解压到elasticsearch ik插件目录下
查看config 是否有jdbc.yml
7.启动(切换到elasticsearch bin目录下 ./elasticsearch &)
8.观察日志
错误1
Java 安全策略导致的异常 (具体没有深究),解决方案如下:
在/home/es/目录下新建 policy.policy 写入如下内容:grant {permission java.lang.RuntimePermission "setContextClassLoader";}在elasticsearch config目录文件jvm.option添加如下代码配置上面的文件路径如下图:
错误2
继续在policy.policy 写入如下内容:
grant {permission java.lang.RuntimePermission "setContextClassLoader";permission .SocketPermission "127.0.0.1:3306","connect,resolve";};
保存继续启动观察日志
日志刷新时间和代码里配置时间一样120秒
至此 实现elasticsearch分词器词库热更新三种方案
才疏学浅,难免会有纰漏,如果你发现了错误的地方,可以在留言区提出来,我对其加以修改。
感谢您的阅读