引子:DSL 和SQL中模糊查询一样吗
大家好,我是马儿
今天来说一下模糊查询的事,我们使用关系型数据库时,模糊查询使用的就是like,加上通配符
通配符 | 说明 |
---|---|
% | 包含0个或多个字符的任意字符 |
_(下划线) | 任意1个字符 |
那ElasticSearch中模糊查询是什么呢,我们知道term是精确查询,有的地方说match是模糊,有的地方说wildcard是模糊,甚至还有fuzzy等,字面意思就是‘模糊’的语句,他们有什么区别呢
ElasticSearch中的模糊查询
举个例子,我们有个人物名单索引listofhistoricalfigures
里面name字段内容如下
- 张三
- 张三丰
- 张飞
- 三德子
- 张二丰
- 孙权
- 马三丰
结构是下面这样,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 纠错检索,让输入条件有容错性
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/93741.html