• ES 查询用法


    一,基本查询语法

    通过ES查询表达式(Query DSL),可以实现复杂的查询功能,ES查询表达式主要由JSON格式编写,可以灵活的组合各种查询语句。

    提示:这里先介绍基本的语法结构,后续单独讲解具体的查询语法。

    1,查询基本语法结构

    GET /{索引名}/_search
    {
            "from" : 0,  // 返回搜索结果的开始位置
            "size" : 10, // 分页大小,一次返回多少数据
            "_source" :[ ...需要返回的字段数组... ],
            "query" : { ...query子句... },
            "aggs" : { ..aggs子句..  },
            "sort" : { ..sort子句..  }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    还支持一次搜索多个索引

    GET /order1,order2/_search
    
    • 1

    按前缀匹配索引名

    GET /order*/_search
    
    • 1

    查询结果格式

    {
      "took" : 5, // 查询消耗时间,单位毫秒 
      "timed_out" : false, // 查询是否超时
      "_shards" : { // 本次查询参与的ES分片信息,查询中参与分片的总数,以及这些分片成功了多少个失败了多少个
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : { // hits字段包含我们搜索匹配的结果
        "total" : { // 匹配到的文档总数
          "value" : 1, // 找到1个文档
          "relation" : "eq"
        },
        "max_score" : 1.0, // 匹配到的最大分值
        "hits" : [ 
             // 这里就是我们具体的搜索结果,是一个JSON文档数组
        ]
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.query子句

    query子句主要用来编写类似SQL的Where语句,支持布尔查询(and/or)、IN、全文搜索、模糊匹配、范围查询(大于小于)。

    3.aggs子句

    aggs子句,主要用来编写统计分析语句,类似SQL的group by语句

    4.sort子句

    sort子句,用来设置排序条件,类似SQL的order by语句

    5.ES查询分页

    ES查询的分页主要通过from和size参数设置,类似MYSQL 的limit和offset语句

    例子:

    GET /order_v2/_search
    {
      "from": 0,
      "size": 20, 
      "query": {
        "match_all": {}
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    查询所有数据,从第0条数据开始,一次返回20条数据。

    6. _source

    _source用于设置查询结果返回什么字段,类似Select语句后面指定字段。

    例子:

    GET /order_v2/_search
    {
      "_source": ["order_no","shop_id"], 
      "query": {
        "match_all": {}
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    仅返回,order_no和shop_id字段。

    二,query查询

    query子句主要用于编写查询条件,类似SQL中的where语句。

    1.匹配单个字段

    通过match实现全文搜索

    语法:

    GET /{索引名}/_search
    {
      "query": {
        "match": {
          "{FIELD}": "{TEXT}"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    说明:

    • {FIELD} - 就是我们需要匹配的字段名

    • {TEXT} - 就是我们需要匹配的内容

    例子:

    GET /article/_search
    {
        "query": {
            "match" : {
                "title" : "ES教程"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    article索引中,title字段匹配ES教程的所有文档。

    如果title字段的数据类型是text类型,搜索关键词会进行分词处理。

    2.精确匹配单个字段

    如果我们想要类似SQL语句中的等值匹配,不需要进行分词处理,例如:订单号、手机号、时间字段,不需要分值处理,只要精确匹配。

    通过term实现精确匹配语法:

    GET /{索引名}/_search
    {
      "query": {
        "term": {
          "{FIELD}": "{VALUE}"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    说明:

    • {FIELD} - 就是我们需要匹配的字段名

    • {VALUE} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。

    例子:

    GET /order_v2/_search
    {
      "query": {
        "term": {
          "order_no": "202003131209120999"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    搜索订单号order_no = "202003131209120999"的文档。

    类似SQL语句:

    select * from order_v2 where order_no = "202003131209120999"
    
    • 1

    3.通过terms实现SQL的in语句

    如果我们要实现SQL中的in语句,一个字段包含给定数组中的任意一个值就匹配。

    terms语法:

    GET /order_v2/_search
    {
      "query": {
        "terms": {
          "{FIELD}": [
            "{VALUE1}",
            "{VALUE2}"
          ]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    说明:

    • {FIELD} - 就是我们需要匹配的字段名

    • {VALUE1}, {VALUE2} … {VALUE N} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。

    例子:

    GET /order_v2/_search
    {
      "query": {
        "terms": {
          "shop_id": [123,100,300]
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    搜索o

  • 相关阅读:
    可视化和跟踪机器学习实验的工具——Wandb
    老卫带你学---leetcode刷题(137. 只出现一次的数字 II)
    Rust的高效易用日志库—tklog
    学了个学教育游戏与源码
    浅谈MDK, IAR,CLANG和GCC的局部变量字节对齐处理差异(2023-10-13)
    springboot jdbctemplate 实现多数据源
    在MAUI中使用Masa Blazor
    相机专业模型详解,各个参数作用,专业模式英文全称和缩写
    Haproxy配合Nginx搭建Web集群
    【Vue】数据表格增删改查与表单验证
  • 原文地址:https://blog.csdn.net/m0_67401270/article/details/126801728