美文网首页
Elasticsearch query查询语法 --- 2022

Elasticsearch query查询语法 --- 2022

作者: 一位先生_ | 来源:发表于2022-06-01 01:28 被阅读0次

    本章介绍ES 的query子句的语法,query子句主要用于编写查询条件,类似SQL中的where语句。

    1.匹配单个字段
    通过match实现全文搜索,全文搜索的后面有单独的章节讲解,这里大家只要知道简单的用法就可以。

    语法:

    GET /{索引名}/_search
    {
      "query": {
        "match": {
          "{FIELD}": "{TEXT}"
        }
      }
    }
    

    说明:

    {FIELD} - 就是我们需要匹配的字段名
    {TEXT} - 就是我们需要匹配的内容
    例子:

    GET /article/_search
    {
        "query": {
            "match" : {
                "title" : "ES教程"
            }
        }
    }
    

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

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

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

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

    GET /{索引名}/_search
    {
      "query": {
        "term": {
          "{FIELD}": "{VALUE}"
        }
      }
    }
    

    说明:

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

    GET /order_v2/_search
    {
      "query": {
        "term": {
          "order_no": "202003131209120999"
        }
      }
    }
    

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

    类似SQL语句:

    select * from order_v2 where order_no = "202003131209120999"
    3.通过terms实现SQL的in语句
    如果我们要实现SQL中的in语句,一个字段包含给定数组中的任意一个值就匹配。

    terms语法:

    GET /order_v2/_search
    {
      "query": {
        "terms": {
          "{FIELD}": [
            "{VALUE1}",
            "{VALUE2}"
          ]
        }
      }
    }
    

    说明:

    {FIELD} - 就是我们需要匹配的字段名
    {VALUE1}, {VALUE2} .... {VALUE N} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。
    例子:

    GET /order_v2/_search
    {
      "query": {
        "terms": {
          "shop_id": [123,100,300]
        }
      }
    }
    

    搜索order_v2索引中,shop_id字段,只要包含[123,100,300]其中一个值,就算匹配。

    类似SQL语句:

    select * from order_v2 where shop_id in (123,100,300)
    4.范围查询
    通过range实现范围查询,类似SQL语句中的>, >=, <, <=表达式。

    range语法:

    GET /{索引名}/_search
    {
      "query": {
        "range": {
          "{FIELD}": {
            "gte": 10, 
            "lte": 20
          }
        }
      }
    }
    

    参数说明:

    {FIELD} - 字段名
    gte范围参数 - 等价于>=
    lte范围参数 - 等价于 <=
    范围参数可以只写一个,例如:仅保留 "gte": 10, 则代表 FIELD字段 >= 10
    范围参数如下:

    gt - 大于 ( > )
    gte - 大于且等于 ( >= )
    lt - 小于 ( < )
    lte - 小于且等于 ( <= )
    例子1:

    GET /order_v2/_search
    {
      "query": {
        "range": {
          "shop_id": {
            "gte": 10,
            "lte": 200
          }
        }
      }
    }
    

    查询order_v2索引中,shop_id >= 10 且 shop_id <= 200的文档

    类似SQL:

    select * from order_v2 where shop_id >= 10 and shop_id <= 200
    

    例子2:

    GET /order_v2/_search
    {
      "query": {
        "range": {
          "shop_id": {
            "gte": 10      
           }
        }
      }
    }
    

    类似SQL:

    select * from order_v2 where shop_id >= 10
    

    5.bool组合查询
    前面的例子都是设置单个字段的查询条件,如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用bool语句。

    5.1. bool查询基本语法结构
    在ES中bool查询就是用来组合布尔查询条件,布尔查询条件,就是类似SQL中的and (且)、or (或)。

    在SQL中,我们需要and和or,还有括号来组合查询条件,在ES中使用bool查询可用做到同样的效果。

    bool语法结构:

    GET /{索引名}/_search
    {
      "query": {
        "bool": { // bool查询
          "must": [], // must条件,类似SQL中的and, 代表必须匹配条件
          "must_not": [], // must_not条件,跟must相反,必须不匹配条件
          "should": [] // should条件,类似SQL中or, 代表匹配其中一个条件
        }
      }
    }
    

    可以任意选择must、must_not和should条件的参数都是一个数组,意味着他们都支持设置多个条件。

    提示:前面介绍的单个字段的匹配语句,都可以用在bool查询语句中进行组合。

    5.2. must条件
    类似SQL的and,代表必须匹配的条件。

    语法:

    GET /{索引名}/_search
    {
      "query": {
        "bool": {
          "must": [
             {匹配条件1},
             {匹配条件2},
             ...可以有N个匹配条件...
            ]
        }
      }
    }
    

    例子1:

    GET /order_v2/_search
    {
      "query": {
        "bool": {
          "must": [
              {
                "term": {
                  "order_no":  "202003131209120999"
                }
              },
              {
                "term": {
                  "shop_id":  123
                }
              }
            ]
        }
      }
    }
    

    这里的Must条件,使用了term精确匹配。

    等价SQL:

    select * from order_v2 where order_no="202003131209120999" and shop_id=123
    

    5.3. must_not条件
    跟must的作用相反。

    语法:

    GET /{索引名}/_search
    {
      "query": {
        "bool": {
          "must_not": [
             {匹配条件1},
             {匹配条件2},
             ...可以有N个匹配条件...
            ]
        }
      }
    }
    

    例子:

    GET /order_v2/_search
    {
      "query": {
        "bool": {
          "must_not": [
              {
                "term": {
                  "shop_id": 1
                }
              },
              {
                "term": {
                  "shop_id":  2
                }
              }
            ]
        }
      }
    }
    

    等价sql:

    select * from order_v2 where shop_id != 1 and shop_id != 2
    

    5.3. should条件
    类似SQL中的 or, 只要匹配其中一个条件即可

    语法:

    GET /{索引名}/_search
     {
       "query": {
         "bool": {
           "should": [
              {匹配条件1},
              {匹配条件2},
              …可以有N个匹配条件…
             ]
         }
       }
     }
    

    例子:

    GET /order_v2/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "order_no": "202003131209120999"
              }
            },
            {
              "match": {
                "order_no": "22222222222222222"
              }
            }
          ]
        }
      }
    }
    

    等价SQL:

    select * from order_v2 where order_no="202003131209120999" or order_no="22222222222222222"
    

    5.4. bool综合例子

    GET /order_v2/_search
    {
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "order_no": "2020031312091209991"
                    }
                  },
                  {
                    "range": {
                      "shop_id": {
                        "gte": 10,
                        "lte": 200
                      }
                    }
                  }
                ]
              }
            },
            {
              "terms": {
                "tag": [
                  1,
                  2,
                  3,
                  4,
                  5,
                  12
                ]
              }
            }
          ]
        }
      }
    }
    

    等价SQL:

    select * from order_v2 where (order_no='202003131209120999' and (shop_id>=10 and shop_id<=200)) or tag in (1,2,3,4,5)
    

    相关文章

      网友评论

          本文标题:Elasticsearch query查询语法 --- 2022

          本文链接:https://www.haomeiwen.com/subject/rjnfsrtx.html