ik词库动态更新说明_new.md
2.97 KB
实现说明
原有的IK词库远程更新的能力是将词库分为静态词库和动态词库,静态词库由IK插件里的词典文件来维护,动态词库则由hhtp接口获取,这样虽然能实现词库的动态维护,但依然存在如下问题:
- 只能维护动态的词典,无法维护静态的词典。比如想删除“女包”这个词,又只能从Ik的静态词典中移除,没有根本的解决问题;
- 远程词库只支持主词典和停用词词典,IK插件里的其他类型词典(如介词、姓氏、后缀等)不支持远程获取;
- 因为远程词库需要依赖searc-consumer,而search-consumer又依赖ES,这样形成了相互依赖,不利于维护和升级。
基于以上,考虑定制IK插件,直接读取数据库中定义的词典,废弃IK的静态词典,实现真正的动态管理词库。
表模型说明
增加了以下两个表:
- 词典定义表ES_WORD_DEF
Field | Type | Null | Key | Default | Description |
---|---|---|---|---|---|
id | int(10) | NO | PRI | NULL | 自动生成的唯一主键 |
word_type | int(1) | NO | MUL | 1 | 词的类型 1为主词典的词 2为停用词 3为姓氏 4为量词 5为后缀词 6为介词 |
word | varchar(32) | NO | NULL | 词的内容 不能包含特殊符号 建议不要太长 | |
status | int(1) | NO | 1 | 1为正常 0为废弃 | |
last_update_time | int(10) | NO | MUL | 0 | 最近一次更新的时间 以1970年1月1日开始的秒数 |
- 词典日志表ES_WORD_LOG
Field | Type | Null | Key | Default | Description |
---|---|---|---|---|---|
id | bigint(20) | NO | PRI | NULL | 自动递增的唯一主键 |
log_content | varchar(256) | YES | NULL | 日志内容 | |
log_time | timestamp | YES | CURRENT_TIMESTAMP | 日志记录时间 |
接口说明
- /dictTools/loadAllWordFile 加载所有词库文件到数据库
- /dictTools/loadWordFile 加载指定词库文件到数据库
- /dictTools/deleteWordsFromFile 数据库中废弃指定文件中的词
- /dictTools/deleteWords 废弃指定的词
- /dictTools/addNewWords 添加指定的词
- /dictTools/reactiveWords 激活已被废弃的词,如词未定义 则执行添加操作
其他
- 在词库动态更新之后,ES不是实时生效的,大概需要两到三分钟(每隔两分钟检查下词典定义表是否存在表更,如果存在表更的话再加载到ik内存里),然后需要根据日志表观察是否所有的ES都已更新完词库。
- 所有ES更新完词库后,之前已有的document在倒排索引中还是使用老的词库分词的,因此如果需要生效,需要重建索引。