ik分词器
来源 :ES默认的分词器是认为母语为英语,英语的书写格式是按照空格为词,并且连词为AND THIS OR...,中文的一句话是没有空格的,中国文化博大精深连词都不止其他语言的那么几个,这就要有一个强大的中文词库,当你的内容中出现这个词时,就会将这个词提炼出来。这里大家也不用重复造轮子,经过前辈的努力,这个中文的分词器已经有了,它就是今天要给大家介绍的IK中文分词器
安装
ES是默认没有安装ik分词器的,如果工作中用的是阿里云服务的elasticsearch的话是会默认安装,这里仅供自身学习,所以可以在对应GitHub上下载对应的ik分词器 :https://github.com/medcl/elasticsearch-analysis-ik/releases
附上另一博主的网盘,有es7.6.1全家桶 https://blog.csdn.net/qq_42359314/article/details/105670912
下载完毕之后在es项目的${ES_HOME}/plugins
创建文件名为ik
的目录,随后将zip解压至该文件中
重启es,观察日志:
loaded plugin [analysis-ik]`
[2020-11-10T00:11:00,351][INFO ][o.w.a.d.Monitor ] [DESKTOP-FE6V42L] try load config from G:\elasticsearch\elasticsearch-7.6.1\config\analysis-ik\IKAnalyzer.cfg.xml
[2020-11-10T00:11:00,359][INFO ][o.w.a.d.Monitor ] [DESKTOP-FE6V42L] try load config from G:\elasticsearch\elasticsearch-7.6.1\plugins\ik\config\IKAnalyzer.cfg.xml
那么es已经加载了上了ik分词器
使用
先介绍一下ES的分析器接口,指定了分析器和文本的内容,我们就可以看到分词的结果
GET _analyze
{
"analyzer": {分析器名称},
"text": {要被分词的文档}
}
结果
IK中文分词器插件给我们提供了两个分析器
- ik_max_word: 会将文本做最细粒度的拆分
- ik_smart:会做最粗粒度的拆分
分别看下各自的效果
对应的 ik_smart
就分的比较粗了,只是大致的拆分了文本
GET _analyze
{
"analyzer": "ik_smart",
"text": "上海自来水来自海上"
}
结果:
{
"tokens" : [
{
"token" : "上海",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "自来水",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "来自",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "海上",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 3
}
]
}
我们可以看到,ik_max_word
分词分的非常细,我们在使用上面的这些进行搜索时,都可以搜索到对应的文本
GET _analyze
{
"analyzer": "ik_max_word",
"text": "上海自来水来自海上"
}
结果
{
"tokens" : [
{
"token" : "上海",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "自来水",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "自来",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "水",
"start_offset" : 4,
"end_offset" : 5,
"type" : "CN_CHAR",
"position" : 3
},
{
"token" : "来自",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "海上",
"start_offset" : 7,
"end_offset" : 9,
"type" : "CN_WORD",
"position" : 5
}
]
}
配置
同样,如果我们用ik分析器来分析 简书
就会发现,本应该是一个名字的文本,被分词器分析成两个字
GET _analyze
{
"analyzer": "ik_smart",
"text": "简书"
}
GET _analyze
{
"analyzer": "ik_max_word",
"text": "简书"
}
同样的返回结果
{
"tokens" : [
{
"token" : "简",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "书",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
}
]
}
但是在日常工作中我们有许多的业务名词,我们不期望使用es搜索的时候被ik分词器拆分成单个汉字,这时候我们就需要来配置ik分词器的字典:
配置项如下: ${ES_HOME}\plugins\ik\config\IKAnalyzer.cfg.xml
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
- 字典 :扩展字典中的词会被筛选出来
- 停止词字典 :扩展停止词中的词会被过滤掉
即可以在\IKAnalyzer.cfg.xml
的相对目录下新建对应的定制字典 如biz.dic
一定要注意dic的编码格式
简书
我是简书
博主
配置进xml中<entry key="ext_dict">biz.dic</entry>
重启es生效,随后就会看到文本的分词不一样了
被加载:
[2020-11-10T00:49:27,608][INFO ][o.w.a.d.Monitor ] [DESKTOP-FE6V42L] [Dict Loading] G:\elasticsearch\elasticsearch-7.6.1\plugins\ik\config\biz.dic
输出的结果:
{
"tokens" : [
{
"token" : "简书",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
}
]
}
创建索引时指定IK分词器
我们在创建索引时就可以为text类型的字段指定IK中文分词器了
PUT ik_index
{
"mappings": {
"properties": {
"id": {
"type": "long"
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
为索引指定默认IK分词器
PUT ik_index
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "ik_max_word"
}
}
}
}
}
以上就是个人理解整理的ik分词器内容
附上精彩文章:
[ik分词器词典加载原理] (https://www.jianshu.com/p/e7f80fda5dd4?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation)