ElasticSearch查询:query查询语法
跳到导航
跳到搜索
关于
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组合查询(must、must_not、should)
使用 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, 代表【匹配其中一个条件】
}
}
}
- 可以任意选择 must、must_not 和 should 条件的参数都是一个数组,意味着他们都支持设置多个条件。
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)