IK分词器有两种Analyzer: ik_smart , ik_max_word,前者会做粗粒度的拆分,后者会做细粒度的尽可能多的拆分,一般使用后者来进行对中文的分词处理
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"text":{
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
GET /_analyze
{
"text":"你好 我来自深圳市 正在学习搜索技术",
"analyzer": "ik_max_word"
}
结果可以看到被分成了很多个词
最重要的配置是main.dic和stopword.dic
自定义词库:
修改IKAnalyzer.cfg.xml配置文件,配置自定义扩展词库和停词词库:
<properties>
<comment>IK Analyzer 扩展配置comment>
<entry key="ext_dict">custom/mydict.dicentry>
<entry key="ext_stopwords">custom/ext_sotpword.dicentry>
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
}
]
}
通常会采用第一种方案,对于第二种官方也不推荐,因为不太稳定
修改源码步骤如下:
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