ik_max_word和 ik_smart介绍
习过Solr或Elasticsearch的同学都知道IK分词器,它是一个针对中文的分词器。
IK分词器地址:https://github.com/medcl/elasticsearch-analysis-ik
IK分词器有两种分词模式:ik_max_word和ik_smart模式。
1、ik_max_word
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
2、ik_smart
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
测试两种分词模式的效果:
发送:post localhost:9200/_analyze
测试ik_max_word
{“text”:“中华人民共和国人民大会堂”,“analyzer”:“ik_max_word” }
测试ik_smart
{“text”:“中华人民共和国人民大会堂”,“analyzer”:“ik_smart” }
最佳实践
两种分词器使用的最佳实践是:索引时用ik_max_word,在搜索时用ik_smart。
即:索引时最大化的将文章内容分词,搜索时更精确的搜索到想要的结果。
举个例子:
我是个用户,输入“华为手机”,我此时的想法是想搜索出“华为手机”的商品,而不是华为其它的商品,也就是商品信息中必须只有华为手机这个词。
此时使用ik_smart和ik_max_word都会将华为手机拆分为华为和手机两个词,那些只包括“华为”这个词的信息也被搜索出来了,我的目标是搜索只包含华为手机这个词的信息,这没有满足我的目标。
怎么解决呢?
我们可以将华为手机添加到自定义词库,添加后两个分词器的效果为:
ik_max_word 的分词效果:
{
“tokens”: [
{
“token”: “华为手机”,
“start_offset”: 0,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 0
}
,
{
“token”: “华为”,
“start_offset”: 0,
“end_offset”: 2,
“type”: “CN_WORD”,
“position”: 1
}
,
{
“token”: “手机”,
“start_offset”: 2,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 2
}
]
}
ik_smart的分词效果:
{
“tokens”: [
{
“token”: “华为手机”,
“start_offset”: 0,
“end_offset”: 4,
“type”: “CN_WORD”,
“position”: 0
}
]
}
看到两个分词器的区别了吧,因为华为手机是一个词,所以ik_smart不再细粒度分了。
此时,我们可以在索引时使用 ik_max_word,在搜索时用ik_smart。
当输入 华为手机 关键字,只搜索到 包含华为手机的信息,符合用户要求。
如果我想将包含华为 这个词的信息也搜索出来怎么办呢?
那就输入 “华为 华为手机”(注意华为后边有个空格),那就会将包含华为、华为手机的信息都搜索出来。
根据上边举的例子,可以思考下,我想搜索手机壳怎么办?用户肯定只想搜索出手机壳的信息,不想搜索出来一推手机。
根据上边举的例子,可以思考下,如果搜索时用ik_max_word会有什么结果。
跟传智燕青一起学Elasticsearch课程视频分享:https://blog.csdn.net/weixin_44062339/article/details/99052909
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)