在实际开发中,特别是模糊查询场景,可能需要将条件应用到多个文档字段上进行匹配。
当然我们可以使用 bool + should 的方式实现。
但ES已经给我们提供了一种更为便捷的方式。
同时匹配 品牌或名称 有苹果的数据
"query": {
"multi\_match" : {
"query": "苹果",
"fields": [ "brand", "name" ]
}
}
等价于
"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 的都匹配上
在多个字段上应用同一个条件 (类似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 只能在分词后的倒排索引中精确匹配
如果把条件值改成 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]"
}
}
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/36734f79a5eaa0440e2ee78cc5943e58.png)
![img](https://img-blog.csdnimg.cn/img_convert/ab88a00a3e61e923186a33449beb1b90.png)
![img](https://img-blog.csdnimg.cn/img_convert/3e84428c5cdb446f4aad55d3f88af292.png)
![img](https://img-blog.csdnimg.cn/img_convert/490db97f64d29a4977b8f32319588562.png)
![img](https://img-blog.csdnimg.cn/img_convert/7cca375bef5874ad4c9efa03d6412bef.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
![img](https://img-blog.csdnimg.cn/img_convert/e1e463e6149522722a3eb94fded756f8.png)
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-jv4awdW5-1712957772634)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
[外链图片转存中...(img-pWJjcPi0-1712957772634)]
**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**