前言
ElasticSearch本身带有分词插件,对英文支持的很好,但对中文支持的就不好了,把中文都分成了单个文字
所以我们安装一个支持中文的插件IK
一、下载安装IK
- 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
- 选择对应的版本,我这里下载的是7.6.2的版本
- 下载后,解压到安装目录下的
plugin
目录里
- 然后再重启一下ElasticSearch,我们可以看到
analysis-ik
模块已经加载了
二、测试使用
我们使用postman来测试
报错了,analyzer参数可能是错的,我们查一下文档
https://github.com/medcl/elasticsearch-analysis-ik
- 我们修改一下analyzer参数为
ik_max_word
,也可以改为ik_smart
{
"tokens": [
{
"token": "postman",
"start_offset": 0,
"end_offset": 7,
"type": "ENGLISH",
"position": 0
},
{
"token": "是",
"start_offset": 7,
"end_offset": 8,
"type": "CN_CHAR",
"position": 1
},
{
"token": "一个",
"start_offset": 8,
"end_offset": 10,
"type": "CN_WORD",
"position": 2
},
{
"token": "一",
"start_offset": 8,
"end_offset": 9,
"type": "TYPE_CNUM",
"position": 3
},
{
"token": "个",
"start_offset": 9,
"end_offset": 10,
"type": "COUNT",
"position": 4
},
{
"token": "不错",
"start_offset": 10,
"end_offset": 12,
"type": "CN_WORD",
"position": 5
},
{
"token": "的",
"start_offset": 12,
"end_offset": 13,
"type": "CN_CHAR",
"position": 6
},
{
"token": "测试",
"start_offset": 13,
"end_offset": 15,
"type": "CN_WORD",
"position": 7
},
{
"token": "试工",
"start_offset": 14,
"end_offset": 16,
"type": "CN_WORD",
"position": 8
},
{
"token": "工具",
"start_offset": 15,
"end_offset": 17,
"type": "CN_WORD",
"position": 9
}
]
}
这次是正确的啦,是我们想要的结果了。
三、其他
1、附带了解一下Analyzer与Tokenizer
- https://blog.csdn.net/u014078154/article/details/80135703
- Analyzer包含两个核心组件,Tokenizer以及TokenFilter。两者的区别在于,前者在字符级别处理流,而后者则在词语级别处理流。Tokenizer是Analyzer的第一步,其构造函数接收一个Reader作为参数,而TokenFilter则是一个类似的拦截器,其参数可以是TokenStream、Tokenizer。
- 1)Tokenizer
输入为Reader的TokenStream,其子类必须实现incrementToken()函数,并且在设置属性(attributes) 必须调用AttributeSource中的clearAttributes()方法。
- 1)Tokenizer
2、ik_max_word 和 ik_smart 什么区别?
- https://github.com/medcl/elasticsearch-analysis-ik
- ik_max_word: 会将文本做最细粒度的拆分
- ik_smart: 会做最粗粒度的拆分。