Authored by Gino Zhang

更新动态词库管理说明

### 实现说明
原有的IK词库远程更新的能力是将词库分为静态词库和动态词库,静态词库由IK插件里的词典文件来维护,动态词库则由hhtp接口获取,这样虽然能实现词库的动态维护,但依然存在如下问题:
1. 只能维护动态的词典,无法维护静态的词典。比如想删除“女包”这个词,又只能从Ik的静态词典中移除,没有根本的解决问题;
2. 远程词库只支持主词典和停用词词典,IK插件里的其他类型词典(如介词、姓氏、后缀等)不支持远程获取;
3. 因为远程词库需要依赖searc-consumer,而search-consumer又依赖ES,这样形成了相互依赖,不利于维护和升级。
### 实现说明
原有的IK词库远程更新的能力是将词库分为静态词库和动态词库,静态词库由IK插件里的词典文件来维护,动态词库则由hhtp接口获取,这样虽然能实现词库的动态维护,但依然存在如下问题:
1. 只能维护动态的词典,无法维护静态的词典。比如想删除“女包”这个词,又只能从Ik的静态词典中移除,没有根本的解决问题;
2. 远程词库只支持主词典和停用词词典,IK插件里的其他类型词典(如介词、姓氏、后缀等)不支持远程获取;
3. 因为远程词库需要依赖searc-consumer,而search-consumer又依赖ES,这样形成了相互依赖,不利于维护和升级。
基于以上,考虑定制IK插件,直接读取数据库中定义的词典,废弃IK的静态词典,实现真正的动态管理词库。
基于以上,考虑定制IK插件,直接读取数据库中定义的词典,废弃IK的静态词典,实现真正的动态管理词库。
### 表模型说明
增加了以下两个表:
1. 词典定义表ES_WORD_DEF
### 表模型说明
增加了以下两个表:
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日开始的秒数 |
| 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日开始的秒数 |
2. 词典日志表ES_WORD_LOG
2. 词典日志表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 | 日志记录时间 |
| 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. /dictTools/loadAllWordFile 加载所有词库文件到数据库
2. /dictTools/loadWordFile 加载指定词库文件到数据库
3. /dictTools/deleteWordsFromFile 数据库中废弃指定文件中的词
4. /dictTools/deleteWords 废弃指定的词
5. /dictTools/addNewWords 添加指定的词
6. /dictTools/reactiveWords 激活已被废弃的词,如词未定义 则执行添加操作
### 其他
### 其他
1. 在词库动态更新之后,ES不是实时生效的,大概需要两到三分钟(每隔两分钟检查下词典定义表是否存在表更,如果存在表更的话再加载到ik内存里),然后需要根据日志表观察是否所有的ES都已更新完词库。
2. 所有ES更新完词库后,之前已有的document在倒排索引中还是使用老的词库分词的,因此如果需要生效,需要重建索引。
1. 在词库动态更新之后,ES不是实时生效的,大概需要两到三分钟(每隔两分钟检查下词典定义表是否存在表更,如果存在表更的话再加载到ik内存里),然后需要根据日志表观察是否所有的ES都已更新完词库。
2. 所有ES更新完词库后,之前已有的document在倒排索引中还是使用老的词库分词的,因此如果需要生效,需要重建索引。
... ...