Elasticsearch 基本使用(五)查询条件匹配方式(query & query_string)_es query_string(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文


等价于



“query”: {
“bool”: {
“should”: [
{
“match”: {
“brand”: “苹果”
}
},
{
“match”: {
“name”: “苹果”
}
}
]
}
}


### query\_string


以下是引用自ES社区博客中的一段描述


该查询使用语法基于 **OR**,**AND** 或 **NOT** 等运算符来解析和拆分提供的查询字符串。 然后查询在返回匹配文档之前独立分析每个拆分文本。  
 你可以使用 query\_string 查询创建一个复杂的搜索,其中包括**通配符**,**跨多个字段的搜索**等等。 尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。


**简单总结:这是使用字符串通过 AND OR NOT 构建复杂查询的一种实现方式,但是语法较严格,容易出错,并不推荐在日常查询中使用**


实际测试下来,单个条件执行的应该是**match**操作


#### 简单查询一个字段


default\_field:条件字段,只能一个。



GET /bank/_search
{
“query”: {
“query_string”: {
“default_field”: “address”,
“query”: “School Lane”
}
}
}


返回结果为 School Lane **的match查询**,凡是 address 包含 School 或者 Lane 的都匹配上  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c648054250f341fbb361c14e4e493fbf.png)


#### 在多个字段上应用同一个条件 (类似multi\_match)


上面的简单查询 通过 “default\_field”: “字段名” 指定**一个**查询字段。  
 当要将条件应用到多个字段时,可以使用 **“fields”: [“字段1”, “字段2”],**



GET /bank/_search
{
“query”: {
“query_string”: {
“fields”: [“age”, “account_number”],
“query”: “26”
}
}
}


查询 age **match** 26 **或者** account\_number **match** 26 的数据


#### 在所有字段上应用同一个条件 (超越了multi\_match)


在所有字段上执行match操作,只要任何一个字段匹配上就算匹配。  
 我们只需要去掉 fields 字段即可



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “28”
}
},
“size”: 2000
}


以上,在所有字段上应用 **match** 28。  
 在 bank 这个索引下,查到了 age = 28 和 id = 28 的数据


#### 对单个条件应用多个值


##### 多个值之间可以是 AND 或者 OR 的关系


* 在所有字段上match 28 **或者** 30



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “28 OR 30”
}
},
“size”: 2000
}


指定字段 **fields** 或默认字段 **default\_field**都适用这个逻辑关系  
 **NOT 关键字可以用在逻辑关系中任一项的前面,表示查询相反条件**


#### query\_string


上面指定字段要么使用 fields ,要么使用 default\_field,其实还有另一种更为灵活的方式,我们可以直接将字段写到 **query**查询语句中,  
 使用 **query:“字段名: 条件值”** 的方式灵活定制查询条件


##### match 匹配


###### 一个字段一个值



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “age: 30”
}
},
“size”: 100
}


###### 一个字段多个值



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “age: 30 OR 20”
}
},
“size”: 100
}


###### 多个字段一个值



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “age: 30 OR account_number:1”
}
},
“size”: 100
}


###### 多个字段多个值



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “age: (30 OR 20) OR account_number: 1”
}
},
“size”: 100
}


##### 模糊匹配(比match更强大,在match后的词里面再进行模糊匹配)


如下:  
 match Sedgwick



GET /bank/_search
{
“query”: {
“match”: {
“address”: “Sedgwick”
}
}
}


match 只能在分词后的倒排索引中精确匹配  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/70310a98d3ef4e94836c165c46c80aea.png)  
 如果把条件值改成 **Sedgwic**,去掉最后一个 **k**,match就查不出来数据了。


**但是使用 query\_string 的模糊匹配依然有办法查出来这两条数据**  
 query\_string 的模糊匹配有两个通配符


* ?,统配一个字符,
* \*,统配任意多个字符  
 使用以下语句都可以查出这两条数据
* ?匹配一个字符 **k**



GET /bank/_search
{
“query”: {
“query_string”: {
“default_field”: “address”,
“query”: “Sedgwic?”
}
}
}


* \*匹配一个字符 **k**



GET /bank/_search
{
“query”: {
“query_string”: {
“default_field”: “address”,
“query”: “Sedgwic*”
}
}
}


* \*匹配多个字符 **ck**



GET /bank/_search
{
“query”: {
“query_string”: {
“default_field”: “address”,
“query”: “Sedgwi*”
}
}
}


* 前缀也能模糊



GET /bank/_search
{
“query”: {
“query_string”: {
“default_field”: “address”,
“query”: “*dgwi*”
}
}
}


以上都能查出来那两条数据。


##### 范围匹配


默认的匹配方式为 match,其本质就是 等值匹配,只是分不分词的区别,  
 对于 query 中的 range 查询,query\_string 中也有对应实现。  
 并且 query\_string 还支持两种写法


* 区间写法  
 [ 表示包含起始值  
 ] 表示包含结束值  
 { 不包含起始值  
 } 不包含结束值  
 \*表示不限制这一边的值  
 以下例子
	+ [1 TO 2] :1 <= x <= 2
	+ {1 TO 2} :1 < x < 2
	+ [\* TO 2] : x <= 2  
	 依然支持上面不同字段的写法,这里只是举个例子



GET /bank/_search
{
“query”: {
“query_string”: {
“default_field”: “age”,
“query”: “{* TO 20]”
}
}
}



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “age:{* TO 20]”
}
}
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

}
}
}



GET /bank/_search
{
“query”: {
“query_string”: {
“query”: “age:{* TO 20]”
}
}
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-nFR5TKkf-1713120375426)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值