写点什么

Elasticsearch 聚合学习之三:范围限定

  • 2022 年 4 月 26 日
  • 本文字数:1913 字

    阅读完需:约 6 分钟

  1. 不做限定时的默认范围;

  2. 最简单的查询范围

  3. 全局桶

  4. 使用过滤器

  5. 桶内使用过滤器

[](()不做限定时的默认范围

  1. 下面是个普通的聚合请求,将文档按照 color 字段聚合,由于没有做任何范围限定,因此查询的是所有文档:


GET /cars/transactions/_search


{


"size":0,


"aggs":{


"popular_colors":{


"terms": {


"field": "color"


}


}


}


}


下面请求带上了查询条件 match_all,匹配所有文档,和前面不带查询条件的请求达到了同样效果:


GET /cars/transactions/_search


{


"size":0,


"query": { ------查询条件


"match_all": {} ------匹配所有文档


},


"aggs":{


"popular_colors":{


"terms": {


"field": "color"


}


}


}


}

[](()最简单的查询范围

  1. 前面提出了一个问题:福特汽车一共分为几种颜色?这就是最简单的范围限定聚合(限定了汽车品牌),查询 DSL 如下:


GET /cars/transactions/_search


{


"size":0,


"query": { ---范围限定的查询


"term": { ---查询类型是精确匹配


"make": "ford" ---查询条件是品牌为福特


}


},


"aggs":{ ---聚合


"popular_colors":{ ---聚合字段名


"terms": { ---桶类型


"field": "color" ---匹配字段是 color


}


}


}


}


  1. 返回结果如下,只有福特汽车的聚合数据:


{


"took" : 7,


"timed_out" : false,


"_shards" : {


"total" : 5,


"successful" : 5,


"skipped" : 0,


"failed" : 0


},


"hits" : {


"total" : 2,


"max_score" : 0.0,


"hits" : [ ]


},


"aggregations" : { ---聚合结果


"popular_colors" : { ---聚合字段


"doc_count_error_upper_bound" : 0,


"sum_other_doc_count" : 0,


"buckets" : [ ---这个数组的元素是所有的桶


{


"key" : "blue", ---color 为 blue 的文档


"doc_count" : 1 ---文档数为 1


},


{


"key" : "green", ---color 为 blue 的文档


"doc_count" : 1 ---文档数为 1


}


]


}


}


}

[](()全局桶

如果想对比福特汽车的销售额和所有汽车的销售额,可以通过全局桶对所有文档做聚合,关键字是 global,全局桶的聚合不受范围限定的影响:


GET /cars/transactions/_search


{


"size": 0,


"query": { ---范围限定的查询


"term": { ---查询类型是精确匹配


"make": "ford" ---查询条件是品牌为福特


}


},


"aggs": { ---聚合


"ford_sales": { ---聚合字段名


"sum": { ---直接对范围内的所有文档执行 metrics,类型是累加


"field": "price" ---选择 price 字段的值进行累加


}


},


"all": { ---聚合字段名


"global": {}, ---全局桶关键字,表示忽略前面 term 查询的范围限定


"aggs": { ---聚合


"all_sales": { ---聚合字段名


"sum": { ---直接对范围内的所有文档执行 metrics,类型是累加


"field": "price" ---选择 price 字段的值进行累加


}


}


}


}


}


}


来看看结果:


......


"aggregations" : { ---聚合结果


"all" : { ---全局桶的聚合结果(term 查询无效)


"doc_count" : 8, ---文档总数


"all_sales" : { ---聚合字段名


"value" : 212000.0 ---总销售额


}


},


"ford_sales" : { ---聚合字段名(term 查询限定了范围,只有福特汽车的销售记录)


"value" : 55000.0 ---福特汽车销售额


}


}


}

[](()不止是 query

前面的范围限定用到了 query,其实适用于查询的过滤器也能应用在聚合操作中,下面是过滤+聚合的查询,和前面一样,也是统计总销售和和福特汽车的销售额:


GET /cars/transactions/_search


{


"size": 0,


"query": {


"bool": { ---布尔查询,里面可以将 query 和 filter 组合使用


"filter": { ---本例只用到了 filter


"term": { ---精确匹配


"make": "ford" ---匹配福特品牌


}


}


}


},


"aggs": { ---聚合结果


"ford_sales": { ---聚合字段名


"sum": { ---metrics 操作,累加


"field": "price" ---累加字段是 price


}


},


"all": { ---聚合字段名


"global": {}, ---全局桶关键字,表示忽略范围 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 限定


"aggs": { ---聚合


"all_sales": { ---聚合字段名


"sum": { ---metrics 操作,累加


"field": "price" ---累加字段是 price


}


}


}


}


}


}


查询结果如下,和 query 的一样:


......


"aggregations" : {


"all" : {


"doc_count" : 8,


"all_sales" : {


"value" : 212000.0


}


},


"ford_sales" : {


"value" : 55000.0


}


}


}

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Elasticsearch聚合学习之三:范围限定_Java_爱好编程进阶_InfoQ写作社区