ElasticSearch:模糊查询,是match、fuzzy还是wildcard?™和SQL中like的区别

引子:DSL 和SQL中模糊查询一样吗

大家好,我是马儿
今天来说一下模糊查询的事,我们使用关系型数据库时,模糊查询使用的就是like,加上通配符

通配符 说明
% 包含0个或多个字符的任意字符
_(下划线) 任意1个字符

那ElasticSearch中模糊查询是什么呢,我们知道term是精确查询,有的地方说match是模糊,有的地方说wildcard是模糊,甚至还有fuzzy等,字面意思就是‘模糊’的语句,他们有什么区别呢

ElasticSearch中的模糊查询

举个例子,我们有个人物名单索引listofhistoricalfigures
里面name字段内容如下

  1. 张三
  2. 张三丰
  3. 张飞
  4. 三德子
  5. 张二丰
  6. 孙权
  7. 马三丰

结构是下面这样,text支持分词查询,keyword支持精确查询
详情可参考这一篇 ElasticSearch 使用term时.keyword加不加的区别

 
 "name": {
    
    
            "type": "text",
            "fields": {
    
    
              "keyword": {
    
    
                "type": "keyword"
              }
            }
         }

match 分词匹配检索

match
英 [mætʃ] 美 [mætʃ]
n. 火柴;比赛;竞赛;敌手;旗鼓相当的人
v.般配;相配;相同;相似;相一致;找相称(或相关)的人(或物);配对

match字面意思是 相似;相一致;找相称(或相关)的人(或物);配对

GET listofhistoricalfigures/_search 
'{
    
    
    "query": {
    
    
        "match": {
    
    
            "name": "张三"
        }
    }
}

我们使用match和默认分词器,会把张三进行分词,分成张、三、张三进行检索
会匹配到的结果有

张三
张三丰
张飞
三德子
张二丰
马三丰

wildcard 通配符检索

wildcard
美 [ˈwaɪldˌkɑrd]
n.未知数;未知因素;(给予没有正常参赛资格的选手准其参加比赛的)“外卡”;“外卡”选手;
(用于代替任何字符或字符串的)通配符

wildcard字面意思是 通配符

GET listofhistoricalfigures/_search 
'{
    
    
    "query": {
    
    
        "wildcard": {
    
    
            "name.keyword": "张三*"
        }
    }
}

使用wildcard相当于SQL的like,前后都可以拼接*,表示匹配0到多个任意字符
加.keyword是要匹配完整的词
会匹配到的结果有

张三
张三丰

fuzzy 模糊/纠错检索

fuzzy
英 [ˈfʌzi] 美 [ˈfʌzi]
adj. 覆有绒毛的;毛茸茸的;紧鬈的;拳曲的;(形状或声音)模糊不清的

fuzzy字面意思是 模糊

GET listofhistoricalfigures/_search 
'{
    
    
    "query": {
    
    
        "fuzzy": {
    
    
            "name.keyword": "张三"
        }
    }
}

使用fuzzy就行百度一样,你输入个“邓子棋”,也能把“邓紫棋”查出来,有一定的纠错能力
加.keyword是要匹配完整的词
会匹配到的结果有

张三
张三丰
张飞
张二丰
马三丰

结论

1.match 分词匹配检索,可以对查询条件分词,查到更多匹配的内容,结合不同的分词器,可以得到不同的效果

2.wildcard 通配符检索功能就像传统的SQL like一样,如果数据在es,你又想得到传统的“模糊查询”结构时,用wildcard

3.fuzzy 纠错检索,让输入条件有容错性

猜你喜欢

转载自blog.csdn.net/weixin_43859729/article/details/108134329