之前我们创建索引、查询数据,都是使用的默认的分词器,对于中文的分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,对于中文分词推荐使用IK分词器。
1、 ik分词器的下载和安装,测试
第一: 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases ,这里需要根据自己ES的版本来下载对应版本的IK,这里我使用的是7.10.1的ES,所以就下载ik-710.1.zip的文件。
第二: 解压–>将文件复制到 es的安装目录\elasticsearch-7.10.1-windows-x86_64\elasticsearch-7.10.1\plugins\elasticsearch-analysis-ik-7.10.1下面即可,完成之后效果如下
到这里已经完成了,不需要去elasticSearch的 elasticsearch.yml 文件去配置。
第三:重启ElasticSearch
第四:测试效果
-
如果未安装ik分词器,那么,你如果写 “analyzer”: “ik_max_word”,那么程序就会报错,因为你没有安装ik分词器
-
如果你安装了ik分词器之后,你不指定分词器,不加上 “analyzer”: “ik_max_word” 这句话,那么其分词效果跟你没有安装ik分词器是一致的,也是分词成每个汉字。
-
创建指定分词器的索引
索引创建之后就可以使用ik进行分词了,当你使用ES搜索的时候也会使用ik对搜索语句进行分词,进行匹配。
PUT http://localhost:9200/mytest/
{
"mappings" : {
"properties":{
"id":{
"type":"text"
},
"title":{
"type":"text",
"analyzer": "ik_max_word"
},
"content":{
"type":"text",
"analyzer": "ik_max_word"
},
"publish_time":{
"type":"date"
}
}
}
}
关于ik分词器的分词类型(可以根据需求进行选择):
ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart:会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。如下:
POST http://localhost:9200/mytest/_analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国国歌"
}
分词结果:
{
"tokens": [
{
"token": "中华人民共和国",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
},
{
"token": "中华人民",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "中华",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 2
},
{
"token": "华人",
"start_offset": 1,
"end_offset": 3,
"type": "CN_WORD",
"position": 3
},
{
"token": "人民共和国",
"start_offset": 2,
"end_offset": 7,
"type": "CN_WORD",
"position": 4
},
{
"token": "人民",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 5
},
{
"token": "共和国",
"start_offset": 4,
"end_offset": 7,
"type": "CN_WORD",
"position": 6
},
{
"token": "共和",
"start_offset": 4,
"end_offset": 6,
"type": "CN_WORD",
"position": 7
},
{
"token": "国",
"start_offset": 6,
"end_offset": 7,
"type": "CN_CHAR",
"position": 8
},
{
"token": "国歌",
"start_offset": 7,
"end_offset": 9,
"type": "CN_WORD",
"position": 9
}
]
}