ITPub博客

首页 > IT基础架构 > > ik_max_word和 ik_smart的区别

ik_max_word和 ik_smart的区别

作者:格伯纳 时间:2020-06-01 11:51:49 0 删除 编辑

一、ik_max_word和 ik_smart介绍

学习过Solr或Elasticsearch的同学都知道IK分词器,它是一个针对中文的分词器。

IK分词器地址: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完整教程:pbteach.com/tags/elasti

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31509949/viewspace-3155705/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
管理员

注册时间:2018-03-30

  • 博文量
    2383
  • 访问量
    984389