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字段。