ik词库动态更新说明_new.md 2.97 KB

实现说明

原有的IK词库远程更新的能力是将词库分为静态词库和动态词库,静态词库由IK插件里的词典文件来维护,动态词库则由hhtp接口获取,这样虽然能实现词库的动态维护,但依然存在如下问题:

  1. 只能维护动态的词典,无法维护静态的词典。比如想删除“女包”这个词,又只能从Ik的静态词典中移除,没有根本的解决问题;
  2. 远程词库只支持主词典和停用词词典,IK插件里的其他类型词典(如介词、姓氏、后缀等)不支持远程获取;
  3. 因为远程词库需要依赖searc-consumer,而search-consumer又依赖ES,这样形成了相互依赖,不利于维护和升级。

基于以上,考虑定制IK插件,直接读取数据库中定义的词典,废弃IK的静态词典,实现真正的动态管理词库。

表模型说明

增加了以下两个表:

  1. 词典定义表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日开始的秒数
  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 日志记录时间

接口说明

  1. /dictTools/loadAllWordFile 加载所有词库文件到数据库
  2. /dictTools/loadWordFile 加载指定词库文件到数据库
  3. /dictTools/deleteWordsFromFile 数据库中废弃指定文件中的词
  4. /dictTools/deleteWords 废弃指定的词
  5. /dictTools/addNewWords 添加指定的词
  6. /dictTools/reactiveWords 激活已被废弃的词,如词未定义 则执行添加操作

其他

  1. 在词库动态更新之后,ES不是实时生效的,大概需要两到三分钟(每隔两分钟检查下词典定义表是否存在表更,如果存在表更的话再加载到ik内存里),然后需要根据日志表观察是否所有的ES都已更新完词库。
  2. 所有ES更新完词库后,之前已有的document在倒排索引中还是使用老的词库分词的,因此如果需要生效,需要重建索引。