Elasticsearch query查询语法 es

发布时间 2023-11-28 14:20:52作者: 守护式等待

Elasticsearch 查询语法

1.查询基本语法结构

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

{索引名},支持支持一次搜索多个索引,多个索引使用逗号分隔,例子:

GET /order1,order2/_search

按前缀匹配索引名:

GET /order*/_search

2.query子句

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

2.1.匹配单个字段

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

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


GET /article/_search
{
    "query": {
        "match" : {
            "title" : "ES教程"
        }
    }
}     # article索引中,title字段匹配ES教程的所有文档。

2.2.精确匹配单个字段

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

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


GET /order_v2/_search
{
  "query": {
    "term": {
      "order_no": "202003131209120999" 
    }
  }
}   # 搜索订单号order_no = "202003131209120999"的文档。

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

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]其中一个值,就算匹配。

2.4.范围查询

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

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

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


GET /order_v2/_search
{
  "query": {
    "range": {
      "shop_id": {
        "gte": 10,
        "lte": 200
      }
    }
  }
}  # 查询order_v2索引中,shop_id >= 10 且 shop_id <= 200的文档

2.5.bool组合查询

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

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

2.5.1 must条件

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


GET /order_v2/_search
{
  "query": {
    "bool": {
      "must": [
          {
            "term": {
              "order_no":  "202003131209120999"
            }
          },
          {
            "term": {
              "shop_id":  123
            }
          }
        ]
    }
  }
}  # 等价于select * from order_v2 where order_no="202003131209120999" and shop_id=123

2.5.2. must_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
            }
          }
        ]
    }
  }
}  # 等价于select * from order_v2 where shop_id != 1 and shop_id != 2

2.5.3. should条件

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


GET /order_v2/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "order_no": "202003131209120999"
          }
        },
        {
          "match": {
            "order_no": "22222222222222222"
          }
        }
      ]
    }
  }
}   # 等价于select * from order_v2 where order_no="202003131209120999" or order_no="22222222222222222"

2.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
            ]
          }
        }
      ]
    }
  }
}  # 等价于 select * from order_v2 where (order_no='202003131209120999' and (shop_id>=10 and shop_id<=200)) or tag in (1,2,3,4,5)

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": {}
  }
}   # 查询所有数据,从第0条数据开始,一次返回20条数据。

6. _source

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

GET /order_v2/_search
{
  "_source": ["order_no","shop_id"], 
  "query": {
    "match_all": {}
  }
}   # 仅返回,order_no和shop_id字段。