摘要:本文介绍ES的query子句的语法,query子句主要用于编写查询条件,类似SQL中的where语句,匹配单个字段,通过match实现全文搜索,全文搜索后面在单独介绍...
本文介绍ES的query子句的语法,query子句主要用于编写查询条件,类似SQL中的where语句。
一、匹配单个字段
通过 match 实现全文搜索,全文搜索后面在单独介绍,这里指的是简单的用法:
POST /{索引名}/_search { "query": { "match": { "{FIELD}": "{TEXT}" } } }
{FIELD} - 就是我们需要匹配的字段名
{TEXT} - 就是我们需要匹配的内容
如果 {FIELD} 字段的数据类型是text类型,搜索关键词会进行分词处理。
二、精确匹配单个字段
如果我们想要类似SQL语句中的等值匹配,不需要进行分词处理,例如:订单号、手机号、时间字段,不需要分值处理,只要精确匹配。通过 term 实现精确匹配语法:
POST /{索引名}/_search { "query": { "term": { "{FIELD}": "{VALUE}" } } }
{FIELD} - 就是我们需要匹配的字段名
{VALUE} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。
类似SQL语句:
select * from table_name where title = "yzmcms"
三、通过terms实现SQL的IN语句
如果我们要实现SQL中的in语句,一个字段包含给定数组中的任意一个值就匹配:
POST /{索引名}/_search { "query": { "terms": { "{FIELD}": [ "{VALUE1}", "{VALUE2}" ] } } }
{FIELD} - 就是我们需要匹配的字段名
{VALUE1}, {VALUE2} .... {VALUE N} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。
类似SQL语句:
select * from table_name where {FIELD} in ({VALUE1},{VALUE2})
四、范围查询
通过 range 实现范围查询,类似SQL语句中的>, >=, <, <=表达式:
POST /{索引名}/_search { "query": { "range": { "{FIELD}": { "gte": 10, "lte": 20 } } } }
{FIELD} - 字段名
gte范围参数 - 等价于 >=
gt范围参数 - 等价于 >
lte范围参数 - 等价于 <=
lt范围参数 - 等价于 <
范围参数可以只写一个,例如:仅保留 "gte": 10, 则代表 FIELD字段 >= 10
类似SQL:
select * from table_name where id >= 10 and id <= 20
五、bool组合查询
前面的例子都是设置单个字段的查询条件,如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用bool语句。
在ES中bool查询就是用来组合布尔查询条件,布尔查询条件,就是类似SQL中的and (且)、or (或),在SQL中,我们需要and和or,还有括号来组合查询条件,在ES中使用bool查询可用做到同样的效果。
POST /{索引名}/_search { "query": { "bool": { // bool查询 "must": [], // must条件,类似SQL中的and, 代表必须匹配条件 "must_not": [], // must_not条件,跟must相反,必须不匹配条件 "should": [] // should条件,类似SQL中or, 代表匹配其中一个条件 } } }
可以任意选择must、must_not和should条件的参数都是一个数组,意味着他们都支持设置多个条件。
must条件
POST /{索引名}/_search { "query": { "bool": { "must": [ {匹配条件1}, {匹配条件2}, ...可以有N个匹配条件... ] } } }
例子:
POST /order/_search { "query": { "bool": { "must": [ { "term": { "order_no": "202201012356" } }, { "term": { "shop_id": 123 } } ] } } }
等价SQL:
select * from order where order_no="202201012356" and shop_id=123
must_not条件
POST /{索引名}/_search { "query": { "bool": { "must_not": [ {匹配条件1}, {匹配条件2}, ...可以有N个匹配条件... ] } } }
例子:
POST /order/_search { "query": { "bool": { "must_not": [ { "term": { "shop_id": 1 } }, { "term": { "shop_id": 2 } } ] } } }
等价SQL:
select * from order where shop_id != 1 and shop_id != 2
should条件
POST /{索引名}/_search { "query": { "bool": { "should": [ {匹配条件1}, {匹配条件2}, …可以有N个匹配条件… ] } } }
例子:
POST /order/_search { "query": { "bool": { "should": [ { "match": { "order_no": "202201012355" } }, { "match": { "order_no": "202201012356" } } ] } } }
等价SQL:
select * from order where order_no="202201012355" or order_no="202201012356"
bool综合例子:
POST /order/_search { "query": { "bool": { "should": [ { "bool": { "must": [ { "term": { "order_no": "20220101789" } }, { "range": { "shop_id": { "gte": 10, "lte": 20 } } } ] } }, { "terms": { "typeid": [ 1, 2, 3 ] } } ] } } }
等价SQL:
select * from order where (order_no='20220101789' and (shop_id>=10 and shop_id<=20)) or typeid in (1,2,3)