- IK分词器的安装和使用
访问ik分词器github项目地址:https://github.com/medcl/elasticsearch-analysis-ik
1.在本地clone项目代码,git clone https://github.com/medcl/elasticsearch-analysis-ik.git
2.切换到对应本地elasticsearch版本号的tag,git checkout tags/5.5.2
3.通过maven进行项目打包,mvn package
4.拷贝/target/release/xxx.zip到/es/plugins/ik下面并解压出来(注意层级关系,ik目录下直接是解压后的所有文件,不能够再有文件夹目录)
5.重启elasticsearch服务未报错即可
IK分词器有两种Analyzer: ik_smart , ik_max_word,前者会做粗粒度的拆分,后者会做细粒度的尽可能多的拆分,一般使用后者来进行对中文的分词处理
- IK分词器的使用
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"text":{
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
GET /_analyze
{
"text":"你好 我来自深圳市 正在学习搜索技术",
"analyzer": "ik_max_word"
}
结果可以看到被分成了很多个词
- IK分词器配置文件详解以及自定义词库
- 找到ik/config目录下IKAnalyzer.cfg.xml文件,用来配置自定义词库
- main.dic是原生词库总共27万,只要是这些词,都会被分词在一起
- quantifier.dic是一些单位的相关词
- suffix.dic是一些地方相关的后缀
- surname.dic是一些姓相关的词
- stopword.dic是英文停用词
最重要的配置是main.dic和stopword.dic
自定义词库:
修改IKAnalyzer.cfg.xml配置文件,配置自定义扩展词库和停词词库:
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">custom/mydict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">custom/ext_sotpword.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
在custom/mydict.dic和custom/ext_sotpword.dic下添加自定义的停用词然后重启es
➜ config cat mydict.dic
网红
蓝瘦香菇
鬼畜
添加以上自定义词语,然后再进行分词测试
GET /my_index/_analyze
{
"text":"蓝瘦香菇 ",
"analyzer": "ik_max_word"
}
返回
{
"tokens": [
{
"token": "蓝瘦香菇",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 0
},
{
"token": "香菇",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
}
]
}
- 修改IK分词器源码来基于mysql热更新词库
对于分布式的es集群,不可能去每个节点手动添加自定义的词语,还要保证不停机
两种热更新的方案:
- 1.修改ik分词器源码,然后手动支持从mysql中每隔一定时间,自动加载新的词库
- 2.基于ik分词器原生支持的热更新方案,部署一个web服务器,提供一个http接口,通过modified和tag响应头,来提供词语的热更新
通常会采用第一种方案,对于第二种官方也不推荐,因为不太稳定
修改源码步骤如下:
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,放入ik的目录下
5、修改jdbc相关配置
6、重启es
观察日志,日志中就会显示我们打印的那些东西,比如加载了什么配置,加载了什么词语,什么停用词
7、在mysql中添加词库与停用词
8、分词实验,验证热更新生效
修改源码后的代码示例:
https://github.com/huiGod/elasticsearch-analysis-ik-5.2.0-mysql