【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。
我们在kibana的DevTools中测试:
# 测试分词器
POST /_analyze
{
"analyzer": "standard",
"text": "黑马程序员学习java太棒了!"
}
语法说明:
先用英文english 分词器试试
# 测试分词器
POST /_analyze
{
"analyzer": "english",
"text": "黑马程序员学习java太棒了!"
}
运行结果
{
"tokens" : [
{
"token" : "黑",
"start_offset" : 0,
"end_offset" : 1,
"type" : "" ,
"position" : 0
},
{
"token" : "马",
"start_offset" : 1,
"end_offset" : 2,
"type" : "" ,
"position" : 1
},
{
"token" : "程",
"start_offset" : 2,
"end_offset" : 3,
"type" : "" ,
"position" : 2
},
{
"token" : "序",
"start_offset" : 3,
"end_offset" : 4,
"type" : "" ,
"position" : 3
},
{
"token" : "员",
"start_offset" : 4,
"end_offset" : 5,
"type" : "" ,
"position" : 4
},
{
"token" : "学",
"start_offset" : 5,
"end_offset" : 6,
"type" : "" ,
"position" : 5
},
{
"token" : "习",
"start_offset" : 6,
"end_offset" : 7,
"type" : "" ,
"position" : 6
},
{
"token" : "java",
"start_offset" : 7,
"end_offset" : 11,
"type" : "" ,
"position" : 7
},
{
"token" : "太",
"start_offset" : 11,
"end_offset" : 12,
"type" : "" ,
"position" : 8
},
{
"token" : "棒",
"start_offset" : 12,
"end_offset" : 13,
"type" : "" ,
"position" : 9
},
{
"token" : "了",
"start_offset" : 13,
"end_offset" : 14,
"type" : "" ,
"position" : 10
}
]
}
从分词结果上看,英文 java 还是分出来了,但是中文…不尽如人意
换成chinese 试试
# 测试分词器
POST /_analyze
{
"analyzer": "chinese",
"text": "黑马程序员学习java太棒了!"
}
运行结果:
可以看到结果和english 没区别【因为它没法儿 去理解中文含义,按意义进行分词】
再看看标准分词器
# 测试分词器
POST /_analyze
{
"analyzer": "standard",
"text": "黑马程序员学习java太棒了!"
}
运行结果
还是这样【我们肯定不希望它是逐字分,而是按照词】
处理中文分词,一般会使用IK分词器。https://github.com/medcl/elasticsearch-analysis-ik
今天是2022年10月31日,11天前,妙啊
ik分词器包含两种模式:
在线安装ik 插件【慢,刚刚笔者进GitHub都是那啥了的,才进去截了张图】
# 进入容器内部
docker exec -it elasticsearch /bin/bash
# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
#退出
exit
#重启容器
docker restart elasticsearch
【离线安装ik 插件】【推荐】
安装插件需要知道elasticsearch的plugins目录位置,而我们用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过下面命令查看:
docker volume inspect es-plugins
OK, 看到了
之前我们把es 跑起来的时候,就已经做了数据卷关联
【解压缩分词器安装包】
先去到那个目录下
【上传 到es 容器的插件数据卷中】
直接拖进去
OK,不大,很快
【重启容器】
OK了
看下日志
OK, 可以看到,成功加载了IK 分词器
直接在Dev Tools 测试
IK分词器包含两种模式:
ik_smart
:最少切分【粒度粗】【分出来的词少】
# 测试分词器
POST /_analyze
{
"analyzer": "ik_smart",
"text": "黑马程序员学习java太棒了!"
}
运行结果:
OK,分词成功了
ik_max_word
:最细切分
# 测试分词器
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "黑马程序员学习java太棒了!"
}
运行结果:
效果也很明显,这个模式下分出来的词更多【粒度细】【分出更多的词】
【这两种模式用哪种,这就要看实际需要了,粒度越细,搜出来的概率肯定就越大,但是存储占用也会增大】