您现在的位置是:首页 > 程序 > sticsearch网站首页sticsearch
Elasticsearch查询语法(二)
本文介绍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)
下一篇:已经是最后一篇
相关文章
文章评论 (0)
- 这篇文章还没有收到评论,赶紧来抢沙发吧~

