当前位置: 首页 > article >正文

ES SearchAPI----Query DSL语言

文章目录

  • Getting Started
    • match_all查询全部
    • sort排序
    • from\size分页
    • _source指定字段
  • match匹配查询
  • match_phrase短语匹配
  • multi_match多字段匹配
  • range范围查询
  • bool复合查询
    • must必须匹配,可贡献得分
    • must_not必须不匹配,可贡献得分
    • should可有可无,可贡献得分,不影响记录数
    • filter条件再过滤,不贡献得分
  • term和match
  • match_phrase 和 .keyword

Query DSL:Elasticsearch 提供了一个可以执行查询的JSON 风格的 DSL (domain-specific language 领域特定语言)。这个被称为 Query DSL

ES 支持两种基本方式检索,通俗的讲第二种检索方式的请求体就是DSL语言

  • 一个是通过使用 REST request URI 发送检索参数(ur+检索参数)
  • 另一个是通过使用 REST request body 来发送它们(uri+请求体)

接下来的实验操作都是基于测试数据(account.json)进行的。

Getting Started

match_all查询全部

GET /bank/_search
{
  "query":{
    "match_all": {}
  }
}

sort排序

query:指定查询的条件
sort:进行排序

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": {
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述

from\size分页

默认每次查询10条数据,可以使用fromsize指定每页的记录数,下面的DSL表示每页查询5条数据,这是第一页
from=(pageNum-1) * pageSize

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "asc"
      }
    }
  ],
  "from": 0,
  "size": 5
}

_source指定字段

"_source"可以指定结果集中只显示哪些字段

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "asc"
      }
    }
  ],
  "_source": ["firstname","lastname","gender"], 
  "from": 5,
  "size": 5
}

在这里插入图片描述

match匹配查询

基本语法如下所示:

GET /bank/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}
  1. 如果match匹配非字符串字段,那么就是精确查询
  2. 如果match匹配字符串字段,那么就是模糊查询,也叫全文检索
# 匹配非字符串字段,就是精确查询
GET /bank/_search
{
  "query": {
    "match": {
      "account_number": 20
    }
  }
}
# 匹配字符串字段,就是模糊查询
# 查询出19条数据,它是分词查询,这些记录按照各自的评分进行排序
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill lane"
    }
  }
}

match_phrase短语匹配

前面使用match匹配查询"address": "mill lane"它是进行的分词查询,如下图
在这里插入图片描述
但有时候就需要将mill lane作为一个整体(短语)进行匹配,这个时候就可以使用match_phrase进行匹配,它会将mill lane作为整体,只要Value中包含mill lane就会被匹配成功

GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "mill lane"
    }
  }
}

在这里插入图片描述

multi_match多字段匹配

比如期望查询出address或state这两个字段中都包含mill,就好比SQL的如下语句

select * from table_name where address like `%mill%` or state like `%mill%`

基本语法格式如下所示;其中query用来指定匹配的值,fields用来指定将从哪些字段中去匹配该值

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query": "",
      "fields": []
    }
  }
}

在这里插入图片描述
多字段匹配的时候会不会进行分词查询呢?
在这里插入图片描述

range范围查询

基本格式

GET bank/_search
{
  "query": {"range": {
    "FIELD": {
      "gte": 10,
      "lte": 20
    }
  }}
}

bool复合查询

bool用来做复合查询;复合语句可以合并任何其他查询语句,包括复合语句,了解这一点很重要的,这就意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑

must必须匹配,可贡献得分

must:必须达到must列举的所有条件,并将有助于得分

期望查询出gender=’M‘并且address中包含’mill‘的记录

# select * from table_name where gender='M' and address like '%mill%'
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"gender": "M"}},
        {"match": {"address": "mill"}}
      ]
    }
  },
  "_source": ["gender","address"]
}

在这里插入图片描述

must_not必须不匹配,可贡献得分

记录一下格式,注意层级格式

# gender=M’ and address like '%mill%' and age <> 28
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"gender": "M"}},
        {"match": {"address": "mill"}}
      ],
      "must_not": [
        {"match": {"age": 28}}
      ]
    }
  },
  "_source": ["gender","address","age"]
}

在这里插入图片描述

should可有可无,可贡献得分,不影响记录数

should:表示可有可无,如果匹配上就会提高该记录的得分,如果没有匹配上也不会影响查询结果集的数量

在这里插入图片描述

filter条件再过滤,不贡献得分

前面的must、must_not筛选出满足条件的记录,并贡献得分;should不会对满足must、must_not的记录数产生任何影响,但是它会对匹配should条件的记录贡献得分;而filter却不会贡献得分,只会在must、must_not的基础上对结果进行再过滤。

如下;在满足must的基础上,再筛选出age大于10并且小于30的记录
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"gender": "M"}},
        {"match": {"address": "mill"}}
      ],
      "filter": [
        {"range": {
          "age": {
            "gte": 10,
            "lte": 30
          }
        }}
      ]
    }
  },
  "_source": ["age","lastname","address"]
}

在这里插入图片描述

term和match

term 和 match 一样。匹配某个属性的值。只是全文检素(text)字段用 match,其他非text 字段匹配用 term。
在这里插入图片描述

match_phrase 和 .keyword

  • match_phrase:只要包含该短语就会被匹配上
  • ***.keyword: 必须是精确匹配

下图使用address字段进行了验证
在这里插入图片描述


http://www.kler.cn/a/106077.html

相关文章:

  • 【Unity3D】实现2D角色/怪物死亡消散粒子效果
  • 《一文读懂!Q-learning状态-动作值函数的直观理解》
  • LeetCode热题100中 17. 20. 53. 78. 215.
  • 第19篇:python高级编程进阶:使用Flask进行Web开发
  • [蓝桥杯 2014 省 AB] 蚂蚁感冒
  • 前端性能优化:HMR热更新和预获取加载
  • HugeGraph Hubble 配置 https 协议的操作步骤
  • iOS安全加固方法及实现
  • Spring三级缓存解决循环依赖问题
  • 【EI会议征稿通知】第二届材料科学与智能制造国际学术会议(MSIM 2024)
  • python yield用法
  • java-- 静态数组
  • 多测师肖sir_高级金牌讲师__接口测试之练习题(6.1)
  • 数据结构与算法——分治法
  • tinymce输入框怎么限制只输入空格或者回车时不能提交
  • 微信JSAPI支付对接
  • 安卓开发实例:随机数
  • BI是什么?想要了解BI需要从哪些方面入手?
  • kali搭建docker
  • 硬件安全与机器学习的结合
  • 在进行自动化测试,遇到验证码的问题,怎么办?
  • FFmpeg编译安装(windows环境)以及在vs2022中调用
  • structs2 重构成SpringBoot架构
  • 解决Visual studio 未能正确加载...包问题
  • 一图读懂融云出海 全球化通信方案
  • 手把手教你安装配置『Oracle Database 19c』