一. ElasticSearch分词概念
当我们在es中存储一个文档的时候,文档内容会被提取出若干词元去存储,方便检索。ES内置了很多分词器,但内置的分词器对中文的处理不好。下面进行介绍
二. ElasticSearch内置分词器
1. 内置分词器对英文的分词
http://localhost:9200/_analyze/
{
"text":"hello world"
}
操作成功后,响应的内容如下
{
"tokens":[
{
"token":"hello",
"start_offset":0,
"end_offset":5,
"type":"<ALPHANUM>",
"position":0
},
{
"token":"world",
"start_offset":6,
"end_offset":11,
"type":"<ALPHANUM>",
"position":1
}
]
}
2. 内置分词器对中文的分词
http://localhost:9200/_analyze/
{
"text":"我爱我的祖国"
}
操作成功后,响应的内容如下
{
"tokens":[
{
"token":"我",
"start_offset":0,
"end_offset":1,
"type":"<IDEOGRAPHIC>",
"position":0
},
{
"token":"爱",
"start_offset":1,
"end_offset":2,
"type":"<IDEOGRAPHIC>",
"position":1
},
{
"token":"我",
"start_offset":2,
"end_offset":3,
"type":"<IDEOGRAPHIC>",
"position":2
},
{
"token":"的",
"start_offset":3,
"end_offset":4,
"type":"<IDEOGRAPHIC>",
"position":3
},
{
"token":"祖",
"start_offset":4,
"end_offset":5,
"type":"<IDEOGRAPHIC>",
"position":4
},
{
"token":"国",
"start_offset":5,
"end_offset":6,
"type":"<IDEOGRAPHIC>",
"position":5
}
]
}
3. 结论
英文天生以空格分隔,自然就以空格来分词,这没有任何问题。
分词把每个汉字都独立分开来了,这对中文分词就没有意义了
二. 中文分词器ik
1. 下载安装
链接:https://pan.baidu.com/s/1sZHIk1wz7ohqziO_ayJksA 提取码:9z3d
在es的plugins目录下创建ik文件夹,并将ik包解压到ik目录下,重启es
2. ik分词器有两种模式ik_max_word和ik_smart
1)ik_max_word:按照最细粒度划分
http://localhost:9200/_analyze/
{
"text":"世界如此之大",
"analyzer":"ik_max_word"
}
操作成功后,响应的内容如下
{
"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":6,
"type":"CN_WORD",
"position":3
}
]
}
2)ik_smart:最粗粒度的拆分
http://localhost:9200/_analyze/
{
"text":"世界如此之大",
"analyzer":"ik_smart"
}
操作成功后,响应的内容如下
{
"tokens":[
{
"token":"世界",
"start_offset":0,
"end_offset":2,
"type":"CN_WORD",
"position":0
},
{
"token":"如此",
"start_offset":2,
"end_offset":4,
"type":"CN_WORD",
"position":1
},
{
"token":"之大",
"start_offset":4,
"end_offset":6,
"type":"CN_WORD",
"position":2
}
]
}
三. ik自定义词典
ik自身提供的分词词典无法满足特定的一些需求(如专用名词等),ik提供了自定义词典的功能,也就是用户可以自己定义一些词汇,这样ik就会把它们当作词典中的内容来处理。
1. 在ik的config目录下创建扩展名为.dic的文件,将词条加入进去
2. 重启es生效
3. 例如"王移薛力"两个人名,如果没有加入词条,分解结果
http://localhost:9200/_analyze/
{
"text":"王移薛力",
"analyzer":"ik_smart"
}
操作成功后,响应的内容如下
{
"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
},
{
"token":"薛",
"start_offset":2,
"end_offset":3,
"type":"CN_CHAR",
"position":2
},
{
"token":"力",
"start_offset":3,
"end_offset":4,
"type":"CN_CHAR",
"position":3
}
]
}
4. 将“王移薛力”加入词条,分解结果
http://localhost:9200/_analyze/
{
"text":"王移薛力",
"analyzer":"ik_smart"
}
操作成功后,响应的内容如下
{
"tokens":[
{
"token":"王移",
"start_offset":0,
"end_offset":2,
"type":"CN_WORD",
"position":0
},
{
"token":"薛力",
"start_offset":2,
"end_offset":4,
"type":"CN_WORD",
"position":1
}
]
}
四. 项目中的应用
在应用中,为了提供索引的覆盖范围,通常会采用ik_max_word分析器,会以最细粒度分词索引,搜索时为了提高搜索准确度,会采用ik_smart分析器,会以粗粒度分词。
1. 创建索引
http://localhost:9200/book/
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word", //存储
"search_analyzer": "ik_smart" //查找
},
"content": {
"type": "text"
}
}
}
}
2. 添加数据
http://localhost:9200/book/_doc/01/
{
"title":"我爱我亲爱的祖国",
"content":"2019年的10月1日,与往年的都不一样。转眼间,已经是我来到英国的第2个月。听母亲说,家乡的街道上挂满了五星红旗,就连晚霞的红都要比往常久一些。下课的铃声响起,我的心却早就飘到了课堂外去——我们几个中国留学生说好放学后一起看国庆盛典。虽然是重播,可那盛大的场面无不震撼着每一个中国人的心。当中国军人齐刷刷地转头敬礼,我的泪水在眼眶里打转,他们的每一个动作、每一个步伐都那样整齐划一、分秒不差。在那一刻,民族自豪感油然而生,我在心中喊了无数遍“我爱我的祖国"
}
http://localhost:9200/book/_doc/02/
{
"title":"我爱我的家乡",
"content":"家乡,是心bai中一首唱不完的歌,du家乡,是心中一根然不尽的火柴。每当我zhi独自骑车到桃花溪,这种对家乡的喜dao爱就像潮水一拥而上"
}
3. 检索
http://localhost:9200/book/_search/
{
"query": {
"match": { "title" : "我爱" }
}
}
操作成功后,响应的内容如下
{
"took":1,
"timed_out":false,
"_shards":{
"total":1,
"successful":1,
"skipped":0,
"failed":0
},
"hits":{
"total":{
"value":2,
"relation":"eq"
},
"max_score":0.114749074,
"hits":[
{
"_index":"book",
"_type":"_doc",
"_id":"02",
"_score":0.114749074,
"_source":{
"title":"我爱我的家乡",
"content":"家乡,是心bai中一首唱不完的歌,du家乡,是心中一根然不尽的火柴。每当我zhi独自骑车到桃花溪,这种对家乡的喜dao爱就像潮水一拥而上"
}
},
{
"_index":"book",
"_type":"_doc",
"_id":"01",
"_score":0.097392075,
"_source":{
"title":"我爱我亲爱的祖国",
"content":"2019年的10月1日,与往年的都不一样。转眼间,已经是我来到英国的第2个月。听母亲说,家乡的街道上挂满了五星红旗,就连晚霞的红都要比往常久一些。下课的铃声响起,我的心却早就飘到了课堂外去——我们几个中国留学生说好放学后一起看国庆盛典。虽然是重播,可那盛大的场面无不震撼着每一个中国人的心。当中国军人齐刷刷地转头敬礼,我的泪水在眼眶里打转,他们的每一个动作、每一个步伐都那样整齐划一、分秒不差。在那一刻,民族自豪感油然而生,我在心中喊了无数遍“我爱我的祖国"
}
}
]
}
}