es ik分词热更新MySQL_31_ElasticSearch 修改 IK 分词器源码来基于 mysql 热更新词库

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

更多干货

分布式实战 (干货)

spring cloud 实战 (干货)

mybatis 实战 (干货)

spring boot 实战 (干货)

React 入门实战 (干货)

构建中小型互联网企业架构 (干货)

python 学习持续更新

ElasticSearch 笔记

一代码地址

已经修改过的支持定期从数据库中提取新词库, 来实现热更新代码:

https://github.com/csy512889371/learndemo/tree/master/elasticsearch-analysis-ik-5.2.0

二概述

每次都是在 es 的扩展词典中, 手动添加新词语, 很坑

1 每次添加完, 都要重启 es 才能生效, 非常麻烦

2es 是分布式的, 可能有数百个节点, 你不能每次都一个一个节点上面去修改

es 不停机, 直接我们在外部某个地方添加新的词语, es 中立即热加载到这些新词语

热更新的方案

1 修改 ik 分词器源码, 然后手动支持从 mysql 中每隔一定时间, 自动加载新的词库

2 基于 ik 分词器原生支持的热更新方案, 部署一个 web 服务器, 提供一个 http 接口, 通过 modified 和 tag 两个 http 响应头, 来提供词语的热更新

用第一种方案, 第二种, ik git 社区官方都不建议采用, 觉得不太稳定

1 下载源码

https://github.com/medcl/elasticsearch-analysis-ik/tree/v5.2.0

ik 分词器, 是个标准的 java maven 工程, 直接导入 eclipse 就可以看到源码

2 修改源码

Dictionary 类, 169 行: Dictionary 单例类的初始化方法, 在这里需要创建一个我们自定义的线程, 并且启动它

HotDictReloadThread 类: 就是死循环, 不断调用 Dictionary.getSingleton().reLoadMainDict(), 去重新加载词典

Dictionary 类, 389 行: this.loadMySQLExtDict();

Dictionary 类, 683 行: this.loadMySQLStopwordDict();

3mvn package 打包代码

target\releases\elasticsearch-analysis-ik-5.2.0.zip

4 解压缩 ik 压缩包

将 mysql 驱动 jar, 放入 ik 的目录下

5 修改 jdbc 相关配置

6 重启 es

观察日志, 日志中就会显示我们打印的那些东西, 比如加载了什么配置, 加载了什么词语, 什么停用词

7 在 mysql 中添加词库与停用词

8 分词实验, 验证热更新生效

来源: https://blog.csdn.net/qq_27384769/article/details/79730650

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值