ElasticSearch查询:query查询语法

来自Wikioe
跳到导航 跳到搜索


关于

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

匹配单个字段(match

(通过 match 实现全文搜索

语法:

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

其中:

  • {FIELD}:需要匹配的字段名;
  • {TEXT}:需要匹配的内容;


示例:article索引中,title字段匹配“ES教程”的所有文档。

GET /article/_search
{
   "query": {
      "match" : {
         "title" : "ES教程"
      }
   }
}
  • 如果 title 字段的数据类型是 text 类型,搜索关键词会进行分词处理。

精确匹配单个字段(term

如果想要类似 SQL 语句中的等值匹配,不需要进行分词处理,只要精确匹配,可以通过 term 实现精确匹配

例如:订单号、手机号、时间字段。


语法:

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

其中:

  • {FIELD}:需要匹配的字段名;
  • {VALUE}:需要匹配的内容,除了 TEXT 类型字段以外的任意类型


示例:搜索订单号order_no = "202003131209120999"的文档

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

类似SQL语句:

select * from order_v2 where order_no = "202003131209120999"

通过 terms 实现SQL的 in 语句

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


语法:

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

其中:

  • {FIELD}:需要匹配的字段名
  • {VALUE1}, {VALUE2} .... {VALUE N}:需要匹配的内容,除了 TEXT 类型字段以外的任意类型


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

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

类似SQL语句:

select * from order_v2 where shop_id in (123,100,300)

范围查询(range

通过 range 实现范围查询,类似SQL语句中的 >, >=, <, <= 表达式。


常用范围参数如下:

  • gt:大于 ( > )
  • gte:大于且等于 ( >= )
  • lt:小于 ( < )
  • lte:小于且等于 ( <= )


语法:

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

其中:

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


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

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

类似SQL语句:

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

bool组合查询(mustmust_notshould

使用 bool 语句组合多个字段的查询条件。

基本语法结构

在 ES 中 bool 查询就是用来组合布尔查询条件

  • 布尔查询条件,就是类似 SQL 中的 and (且)、or (或)。


bool语法结构:

GET /{索引名}/_search
{
   "query": {
      "bool": { // bool查询
         "must": [], // must 条件,类似SQL中的 and, 代表【必须匹配条件】
         "must_not": [], // must_not 条件,跟 must 相反,【必须不匹配条件】
         "should": [] // should 条件,类似SQL中 or, 代表【匹配其中一个条件】
      }
   }
}
  • 可以任意选择 mustmust_notshould 条件的参数都是一个数组,意味着他们都支持设置多个条件。

must

语法:

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


示例:

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

类似SQL语句:

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

must_not

(must_not 表示的是 NOT...AND...NOT)

语法:

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

should

语法:

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"

综合示例

示例:

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)