elasticsearch中term与match

分词器、字符串类型、倒排索引

在说term和match之前,需要先了解一下这三个概念

分词器

es默认的分词器是standard analyzer,该分词器的特点是:将所有英文字符串的大写字母转换成小写字母,然后按照空格对英文字符串进行分词,如果遇到汉字,则将汉字一个字作为一个分词。可以看出,该分词器对于中文句子的分词效果来说并不好,无法以合适的中文词组来分词。
为了提高中文的分词效果,可以增加ik分词器插件,该插件提供了两种好用的分词策略:最少切分ik_smart analyzer和最细粒度切分ik_max_word analyzer,前者的每个分词都没有重复切分的字,后者则可以有重复切分,后者的分词集合通常来说会比前者大。
keyword analyzer是专门为keyword类型的字符串准备的分词器,该分词器的特点是:不会对字符串进行切分,即分词集合只包含一个字符串。

字符串类型

es比较常用的字符串类型是textkeyword,默认是text。
text可以被分词器分词(默认使用分词器standard analyzer,也可以指定别的分词器),keyword不可以被分词(使用了分词器keyword analyzer)

倒排索引

当向es中添加一个文档时,文档中可被分词的字段(除了keyword类型之外的字段)会被分词器(默认使用分词器standard analyzer,也可以指定别的分词器)进行分词,形成一个分词集合存储在倒排索引中。也就是说,对于可分词的字段,es中存储的并不是一串完整的字符串,而是该字符串的一个一个的分词。

精确匹配term

term的查询参数不会被分词器分词,es会将完整的查询参数与倒排索引中对应字段的分词集合进行对比查询。
term查询中文句子的效果比较差,不建议在这种场景下使用term

模糊匹配match

match的查询参数(keyword类型除外)会被分词器分词,使用的分词器是所查询字段在mappings中指定的分词器,默认为standard analyzer。查询参数被分词后产生的分词集合与倒排索引中相应字段的分词集合进行对比查找,只要有一个分词匹配成功,该文档就会被纳入检索结果返回。

es查询的基本流程

1.mappings指定字段类型和分词器
2.新增文档
3.es对新增文档中的字段(keyword类型的字段除外)使用mappings中相应字段指定的分词器(默认为standard analyzer)来进行分词,将分词结果存入倒排索引中;keyword类型的字段直接存储整个字段内容
4.搜索文档
5.搜索参数字段类型是否为keyword
6.是,则不管term还是match搜索,搜索参数都不会被分词,搜索参数字段整个内容形成只包含一个内容的分词集合
7.否,则当使用term搜索时,搜索参数不会被分词;当使用match搜索时,搜索参数会被mappings中相应字段指定的分词器(默认为standard analyzer)分词,形成分词集合
8.将搜索的分词集合与es中相应字段的倒排索引进行匹配搜索,es每一个文档中只要有一个分词与分词集合的任一分词匹配,则将此文档放入搜索结果中返回

term和match的区别

两者最大的区别就是:当搜索参数为text类型的字段时,有没有对搜索参数进行分词操作!term没有,而match有。

例子

创建一个索引testes并构建mappings,定义三个字段:title(类型:text,分词器:standard analyzer),content(类型:text,分词器:ik_max_word analyzer),desc(类型:keyword)
创建一个索引testes并构建mappings
新增两个文档
新增两个文档
对title进行分词

第一个文档
title分词1
结果
title分词结果1

第二个文档

title分词2

结果
title分词结果2

对content进行分词

第一个文档
content分词2
结果
content分词结果1

第二个文档
content分词2
结果
content分词结果2
term搜索

title搜索“今天”
title搜索“今天”
结果
title搜索“今天”结果
title搜索“吃”
title搜索“吃”
结果
title搜索“吃”结果
content搜索“面条”
content搜索“面条”
结果
content搜索“面条”结果
content搜索“吃”
content搜索“吃”
结果
content搜索“吃”
desc搜索“好吃”
desc搜索“好吃”
结果
desc搜索“好吃”结果
desc搜索“面很好吃”
desc搜索“面很好吃”

结果
desc搜索“面很好吃”结果
match搜索

title搜索“明天”

对“明天”进行分词
“明天”分词
“明天”分词结果
“明天”分词结果
搜索
title搜索“明天”
结果
title搜索“明天”结果
content搜索“吃”
content搜索“吃”
结果
content搜索“吃”结果

content搜索“牛肉”

对“牛肉”进行分词
对“牛肉”进行分词

“牛肉”分词结果
“牛肉”分词结果

搜索
content搜索“牛肉”

结果

content搜索“牛肉”结果
desc搜索“好吃”
desc搜索“好吃”

结果
desc搜索“好吃”结果
desc搜索“肉最好吃了”
desc搜索“肉最好吃了”

结果
desc搜索“肉最好吃了”结果
参考博客
Elasticsearch 入门教程 – term 查询和match 查询(text和keyword)
Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值