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对 顺序、内容要求都较高。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐