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

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

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

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

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

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

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

正文

概述

ES中常用的查询类型往大了分可以分为简单查询,复合查询,聚合查询等;
而复合查询及聚合查询都是基于简单查询的;简单查询里面对条件的匹配方式又分为不同类型。term[s],match,match_all,match_phrase 等等

query

term

单词查询,在字段的倒排索引(发生分词)或者直接在字段值(未发生分词)中查找条件值,只要找到这个条件值就算匹配上,得分为1。

terms

多个单词查询,效果为 多个 term 或者的逻辑。bool -> should -> term1,term2…

range

一般用于对数值类型进行范围查询

match_all

无条件查询,匹配所有数据

match
  • 根据文档中实际存储的字段类型(是否为分词文本 text,keyword 不会进行分词),决定是否对条件值进行分词
  • 如果未分词,直接以条件值执行 term 查询
  • 如果分词,则对条件值进行,分词处理;
    • 若得到一个词,也是执行term查询
    • 若得到多个词,默认执行 terms 查询(多个单词 或者关系)
    • 也可以手动指定为 且关系(如果为且,意思是,倒排索引后的词表中要包含 条件分词后的 所有单词),通过以下方式指定 match 单词之间的关系
GET /stu/_search
{
  "query": {
    "match": {
      "name": {
        "query": "张 四",
        "operator": "and"
      }
    }
  }
}

以上查询 operator 默认为 or,分词 得到 两个词;
可以查到 张三 李四 张三四 三个人。
我们将 operator 指定为 and 后,只能查到 张三四 一个人了,必须包含条件分词后的所有单词。

match 匹配精度问题

对于match 分词后的查询;
and 是必须包含条件分词后所有的单词
or 是只需包含条件分词后任意一个单词。

and 下相对来说精度问题还好点,毕竟要包含所有条件分词单词。
如果是在or的情况,我们想要定义至少包含几个单词才当作匹配上,此时还需要另一个参数 minimum_should_match
虽然在and情况下,用得相对较少,但对and也有效
此值也可以设置为百分比,意思是条件分词后,达到比例的条件单词匹配上才算匹配
比如,以下查询语句是查不出数据的

GET /stu/_search
{
  "query": {
    "match": {
      "name": {
        "query": "张 四",
        "operator": "and",
        "minimum\_should\_match": 3
      }
    }
  }
}

因为你的条件分词,只有 2个词,即使分词也只得到2个词, 小于 minimum_should_match

match_phrase

以当前条件值,到文档**字段(而非分词后的列表)**里查询。
条件不做分词,到文档字段内 进行连续的 文本匹配

match_pharse_prefix

同样是以 条件不做分词到文档字段中查询,但是条件最后的 单词不是必须匹配字段内的完整单词
例如:
文档字段为 i love you
条件为 i love yo
match_phrase 下 无法匹配,因为 文档中 you 是一个完整的单词;只能匹配 i 或者 i love 或者 i love you
match_pharse_prefix 就可以匹配,就是说只要是一个前缀包含的连续文本就能匹配

match_bool_prefix

条件进行分词,执行 bool > should 查询
前面的词 做 term 查询,最后一个词做 perfix 查询

multi_match

在实际开发中,特别是模糊查询场景,可能需要将条件应用到多个文档字段上进行匹配。
当然我们可以使用 bool + should 的方式实现。
但ES已经给我们提供了一种更为便捷的方式。
同时匹配 品牌或名称 有苹果的数据

"query": {
    "multi\_match" : {
      "query":    "苹果",
      "fields": [ "brand", "name" ] 
    }
  }

等价于

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

query_string

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

该查询使用语法基于 ORANDNOT 等运算符来解析和拆分提供的查询字符串。 然后查询在返回匹配文档之前独立分析每个拆分文本。
你可以使用 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"
    }


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

**需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)**
![img](https://img-blog.csdnimg.cn/img_convert/31f57889422b809da6eb7ed6d2ac05da.png)

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

## 多个字段一个值



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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值