大家好,欢迎来到IT知识分享网。
一,基本查询语法
通过ES查询表达式(Query DSL),可以实现复杂的查询功能,ES查询表达式主要由JSON格式编写,可以灵活的组合各种查询语句。
提示:这里先介绍基本的语法结构,后续单独讲解具体的查询语法。
1,查询基本语法结构
GET /{索引名}/_search { "from" : 0, // 返回搜索结果的开始位置 "size" : 10, // 分页大小,一次返回多少数据 "_source" :[ ...需要返回的字段数组... ], "query" : { ...query子句... }, "aggs" : { ..aggs子句.. }, "sort" : { ..sort子句.. } }
还支持一次搜索多个索引
GET /order1,order2/_search
按前缀匹配索引名
GET /order*/_search
查询结果格式
{ "took" : 5, // 查询消耗时间,单位毫秒 "timed_out" : false, // 查询是否超时 "_shards" : { // 本次查询参与的ES分片信息,查询中参与分片的总数,以及这些分片成功了多少个失败了多少个 "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { // hits字段包含我们搜索匹配的结果 "total" : { // 匹配到的文档总数 "value" : 1, // 找到1个文档 "relation" : "eq" }, "max_score" : 1.0, // 匹配到的最大分值 "hits" : [ // 这里就是我们具体的搜索结果,是一个JSON文档数组 ] } }
2.query子句
query子句主要用来编写类似SQL的Where语句,支持布尔查询(and/or)、IN、全文搜索、模糊匹配、范围查询(大于小于)。
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字段。
二,query查询
query子句主要用于编写查询条件,类似SQL中的where语句。
1.匹配单个字段
通过match实现全文搜索
语法:
GET /{索引名}/_search { "query": { "match": { "{FIELD}": "{TEXT}" } } }
说明:
- {FIELD} – 就是我们需要匹配的字段名
- {TEXT} – 就是我们需要匹配的内容
例子:
GET /article/_search { "query": { "match" : { "title" : "ES教程" } } }
article索引中,title字段匹配ES教程的所有文档。
如果title字段的数据类型是text类型,搜索关键词会进行分词处理。
2.精确匹配单个字段
如果我们想要类似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”
3.通过terms实现SQL的in语句
如果我们要实现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)
4.范围查询
通过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 } } } }
select * from order_v2 where shop_id >= 10
5.bool组合查询
前面的例子都是设置单个字段的查询条件,如果需要编写类似SQL的Where语句,组合多个字段的查询条件,可以使用bool语句。
5.1. 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查询语句中进行组合。
5.2. must条件
类似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
5.3. must_not条件
跟must的作用相反。
语法:
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
5.3. should条件
类似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″
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 ] } } ] } } }
等价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)
详情请参看
https://blog.csdn.net/lazyboy2/article/details/125122833
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/30868.html