Elasticsearch搜索中文分词优化-ik_max_word,和ik_smart模式

Elasticsearch 中文搜索时遇到几个问题:

    1. 当搜索关键词如:“人民币”时,如果分词将“人民币”分成“人”,“民”,“币”三个单字,那么搜索该关键词会匹配到很多包含该单字的无关内容,但是如果将该词分词成一个整词“人民币”,搜索单字如“人”字又不会匹配到包含“人民币”关键词的内容,怎么解决这个问题,既保证覆盖度又保证准确度?
    1. 搜索“RMB”时只会匹配到包含“RMB”关键词的内容,实际上,“RMB”和“人民币”是同义词,我们希望用户搜索“RMB”和“人民币”可以相互匹配,ES同义词怎么配置?
    1. 用户搜索拼音: 如"baidu",或者拼音首字母"bd",怎么匹配到"百度"这个关键词,又如用户输入"摆渡"这个词也能匹配到"百度"关键词,中文拼音匹配怎么做到?
    1. 怎么保证搜索关键词被正确分词,通常我们会采用自定义词典来做,那么怎么获取自定义词典?

1.IK 分词器

一、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” }

{
"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": 8,
"type": "CN_WORD",
"position": 8
}
,
{
"token": "人民大会堂",
"start_offset": 7,
"end_offset": 12,
"type": "CN_WORD",
"position": 9
}
,
{
"token": "人民大会",
"start_offset": 7,
"end_offset": 11,
"type": "CN_WORD",
"position": 10
}
,
{
"token": "人民",
"start_offset": 7,
"end_offset": 9,
"type": "CN_WORD",
"position": 11
}
,
{
"token": "大会堂",
"start_offset": 9,
"end_offset": 12,
"type": "CN_WORD",
"position": 12
}
,
{
"token": "大会",
"start_offset": 9,
"end_offset": 11,
"type": "CN_WORD",
"position": 13
}
,
{
"token": "会堂",
"start_offset": 10,
"end_offset": 12,
"type": "CN_WORD",
"position": 14
}
]
}

测试ik_smart

{“text”:“中华人民共和国人民大会堂”,“analyzer”:“ik_smart” }

{
"tokens": [
{
"token": "中华人民共和国",
"start_offset": 0,
"end_offset": 7,
"type": "CN_WORD",
"position": 0
}
,
{
"token": "人民大会堂",
"start_offset": 7,
"end_offset": 12,
"type": "CN_WORD",
"position": 1
}
]
}

二、最佳实践

两种分词器使用的最佳实践是:索引时用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会有什么结果。

 

 

 

 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: fieldType = FieldType.TEXT 表示该字段是文本类型。 analyzer = Analyzer.IK_SMART 表示使用 IK_SMART 分词器对该字段进行分词。 searchAnalyzer = Analyzer.IK_MAX_WORD 表示使用 IK_MAX_WORD 分词器对该字段进行搜索。 ### 回答2: 根据提供的信息,我理解您遇到了一个问题:在进行es特殊字符查询时无法查找到结果。根据您提供的字段的设置,将为您解释可能的原因。 首先,您指定了字段类型为FieldType.TEXT,这意味着该字段将被分析器处理为文本类型数据。接下来,您指定了分析器为Analyzer.IK_SMART搜索分析器为Analyzer.IK_MAX_WORDIK分析器是一种面向中文文本的分析器,可以将文本拆分成合适的词语以便更准确的进行搜索IK分析器有两种模式可供选择:IK_SMARTIK_MAX_WORDIK_SMART模式是一种智能模式,会尽量将文本进行最准确的拆分,以尽可能包含更多的搜索结果。而IK_MAX_WORD模式会将文本切分为更多的词语,以尽可能获取更多的搜索结果。 然而,如果您遇到特殊字符查询不到结果的情况,可能是因为您所使用的查询方式不适用于特殊字符。在进行使用特殊字符的查询时,可能需要使用其他的操作符或查询方法来确保能够正确匹配到特殊字符。例如,您可以使用正则表达式查询来匹配特殊字符,或者使用原始查询语法来确保特殊字符被正确解析。 另外,还有一种可能性是特殊字符在被分析器处理时发生了改变,导致不能正确匹配到您预期的结果。这时您可以尝试更改分析器配置或者选择其他的分析器来处理特殊字符。 总结来说,要在es特殊字符查询中获得正确的结果,您需要确保使用合适的操作符或查询方法,并确保您所选择的分析器正确处理特殊字符。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值