|
|
### 实现说明
|
|
|
原有的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日开始的秒数 |
|
|
|
|
|
|
|
|
|
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 | 日志记录时间 |
|
|
|
|
|
|
### 接口说明
|
|
|
|
|
|
1. /dictTools/loadAllWordFile 加载所有词库文件到数据库
|
|
|
2. /dictTools/loadWordFile 加载指定词库文件到数据库
|
|
|
3. /dictTools/deleteWordsFromFile 数据库中废弃指定文件中的词
|
|
|
4. /dictTools/deleteWords 废弃指定的词
|
|
|
5. /dictTools/addWords (待添加) 添加指定的词
|
|
|
|
|
|
### 其他
|
|
|
|
|
|
1. 在词库动态更新之后,ES不是实时生效的,大概需要两到三分钟(每隔两分钟检查下词典定义表是否存在表更,如果存在表更的话再加载到ik内存里),然后需要根据日志表观察是否所有的ES都已更新完词库。
|
|
|
2. 所有ES更新完词库后,之前已有的document在倒排索引中还是使用老的词库分词的,因此如果需要生效,需要重建索引。
|
|
|
|