介绍ES 的query子句的语法,query子句主要用于编写查询条件,类似SQL中的where语句。
query子句主要用来编写类似SQL的Where语句,支持布尔查询(and/or)、IN、全文搜索、模糊匹配、范围查询(大于小于)。
text类型字段支持分词,可以使用模糊查询
keyword类型只能做等值查询,不能进行分词
通过match实现全文搜索,全文搜索的后面有单独的章节讲解,这里大家只要知道简单的用法就可以。
语法:
GET /{索引名}/_search
{
"query": {
"match": {
"{FIELD}": "{TEXT}"
}
}
}
说明:
{FIELD} - 就是我们需要匹配的字段名
{TEXT} - 就是我们需要匹配的内容
例子:
GET /article/_search
{
"query": {
"match" : {
"title" : "ES教程"
}
}
}
article索引中,title字段匹配ES教程的所有文档。
如果title字段的数据类型是text类型,搜索关键词会进行分词处理。
**
**
如果我们想要类似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"
如果我们要实现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)
**
**
通过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
**
**
前面的例子都是设置单个字段的查询条件,如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用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查询语句中进行组合。
类似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
跟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
类似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"
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)