一,基本查询语法
通过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]
}
}
}
搜索o