一、ik的安装与使用

1、在elasticsearch中安装ik中文分词器

(1)git clone https://github.com/medcl/elasticsearch-analysis-ik
(2)git checkout tags/v5.2.0
(3)mvn package
(4)将target/releases/elasticsearch-analysis-ik-5.2.0.zip拷贝到es/plugins/ik目录下
(5)在es/plugins/ik下对elasticsearch-analysis-ik-5.2.0.zip进行解压缩
(6)重启es

2、两种分词器

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart:

3、ik分词器的使用

PUT /my_index 
 {
   "mappings": {
     "my_type": {
       "properties": {
         "text": {
           "type": "text",
           "analyzer": "ik_max_word"
         }
       }
     }
   }
 }

 

二、ik配置文件说明

1、配置说明

ik配置文件地址:es/plugins/ik/config目录

IKAnalyzer.cfg.xml:用来配置自定义词库
main.dic:ik原生内置的中文词库,总共有27万多条,只要是这些单词,都会被分在一起
quantifier.dic:放了一些单位相关的词
suffix.dic:放了一些后缀
surname.dic:中国的姓氏
stopword.dic:英文停用词

2、自定义词库

(1)、自己建立词库:IKAnalyzer.cfg.xml中的配置:<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>

,然后重启es

(2)、自己建立停用词库:IKAnalyzer.cfg.xml中的配置:<entry key="ext_stopwords">custom/ext_stopword.dic</entry>

,然后重启es

 

三、修改ik分词器源码基于mysql热更新词库

0、热更新方案

(1)修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库
(2)基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag两个http响应头,来提供词语的热更新

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();

3、mvn package打包代码
target\releases\elasticsearch-analysis-ik-5.2.0.zip

4、解压缩ik压缩包
将mysql驱动jar(mysql-connector-java-6.0.6.jar),放入ik的目录下

5、修改jdbc相关配置

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

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

CREATE TABLE `hot_stopwords`  (
   `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
   `stopword` varchar(255)
 ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 CREATE TABLE `hot_words`  (
   `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
   `word` varchar(255)
 ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

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