es查询什么时候使用term,什么时候使用match 以及 match_phrase

match和term

match查询是带有分词的,所以一般模糊查询的时候使用match,

term就是精准查询了,必须全部匹配,但是这里有个小细节,直接使用term精准匹配可能查不出来数据,我们看看为啥,

        我们先查询全部的数据,可以看到我们查出来的结果有两个,一个字段city值是York,另一个是New York。

        接下来使用match进行York的匹配,因为match是分词匹配的,两个文档中都有York,所有都查询出来了,

        我们使用term精准查询匹配York的文档,可以看到,明明有一个值为York的却无法查询出来,

        但是当我们将York变成york小写的时候就查询出来了,并且查出来的还是多个,跟使用match没什么区别,这里的原因是因为city是个text类型的字段,被分词器分词了,并且York还被分词器转换成了小写,这时候使用term去查询,其实是拿查询条件和被分词的索引关键字一一匹配,

        此时的倒排索引中拥有 new、york两个索引关键字,使用term精准匹配时,York显然匹配补上york,当我们使用了york时,又因为是和倒排索引匹配的,所以在我们看来不相关的文档 New York也被查了出来,

        这时候就需要我们的keyword字段上场了,和term搭配做到精准匹配的效果,

       这次我在查询条件city后面加了一个city.raw,使用York即匹配上了,这里使用york就不行了,这里的raw其实就是keyword字段,

        可以看到,我的es索引在定义的时候,city这个text类型里面还有一个fields的属性,这里涉及到多fileds的概念,名字叫raw,类型是keyword,keyword就是为了在做聚合 排序、精准匹配的时候使用的,keyword不会被分词,直接使用原始的文档去做匹配。

        官方对多fileds的文档:fields | Elasticsearch Guide [7.15] | Elastic,其实就是对一个字段做出多种分词处理,keyword即不分词,

        所以使用term的时候,请多注意一下,需要精准匹配原文档,请带上keyword类型的字段去查询,模糊查询就用match。

        

match_phrase

match_phrase和match类似,都是进行分词查询的,但是phrase多了一个特性,就是条件中出现的单词必须全部存在,并且要按照顺序出现,否则就无法匹配。

例如匹配He, 有一个内容是 He Hi Yo Ga的数据,

  使用 Hi He匹配,由于顺序不对,无法匹配上

但是使用match则可以 

 

使用He Yo也不行,由此可见match_phrase对 顺序、内容要求都较高。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你遇到的问题可能是由于Elasticsearch的分析器配置不正确导致的。当使用match_phrase查询,默认情况下,Elasticsearch会应用分析器来对查询字符串进行分词处理,然后再与索引中的文本进行匹配。对于中文文本,分析器可能会将文本按照字或词进行分词,而对于数字和英文文本,可能会按照空格或标点符号进行分词。这就导致了在使用match_phrase查询无法准确匹配数字和英文。 要解决这个问题,你可以考虑以下几种方法: 1. 明确指定要匹配的字段的分析器:你可以通过显式地指定要匹配的字段的分析器,确保分析器适用于数字和英文文本。例如,可以使用keyword分析器来保持字段的原始内容不变。 2. 自定义分析器:你可以创建自定义分析器,根据你的需求对数字和英文文本进行适当的分词处理。可以使用字符过滤器、分词器和标记过滤器等组件来定义自定义分析器。 3. 使用term查询:如果你希望精确匹配数字和英文文本,可以考虑使用term查询而不是match_phrase查询term查询不会应用分析器,直接将查询字符串与索引中的词条进行精确匹配。 请注意,在使用以上方法,还需要确保索引中的字段映射与你的需求相匹配,例如字段类型、分析器等设置。此外,还可以考虑使用其他查询类型,如match查询或query_string查询,根据具体情况选择合适的查询方式。 希望这些信息能帮助你解决问题!如有更多疑问,请随提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值