ElasticSearch6(四) restful风格 聚合查询-分组聚合

聚合分为三大类:

  • 度量聚合:在一组文档中对某一个数字字段进行计算得出指标值
  • 分组聚合:创建多个分组,每个分组都关联一个关键字和相关文档标准。当聚合执行的时候,所有的分组会根据自身标准评估每一个符合的文档。(分组聚合可以嵌套一个或者多个字聚合)
  • 管道聚合:这一类聚合的数据源是其他聚合的输出,然后进行相关指标的计算。

分组聚合

分组聚合不像度量聚合那样通过字段进行计算,而是根据文档创建分组

1. 直方图集合

直方图集合是一个多分组聚合。可以动态生成间隔分组

{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram":{
       "field":"price",
        "interval":150
      }
    }
  }
}

得出结果是[0, 150) 有3个,[150, 300) 有0个, [300, MAX) 有一个

因为[150, 300) 有0个 ,若想要让他不显示出,则可以假如一个“min_doc_count”:1 这个表示最少要有一个文档

{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram":{
       "field":"price",
        "interval":150,
        "min_doc_count":1
      }
    }
  }
}

没有 150

1.1 extended_bounds

可以强制直方图聚合从指定的最小值开始分组,直到最大值(即使没有任何文档存在)

{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram":{
       "field":"price",
        "interval":100,
        "extended_bounds":{
          "min":0,
          "max":500
        }

      }
    }
  }
}

1.2 排序

{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram":{
       "field":"price",
        "interval":100,
        "order":{
          "_key":"desc"
        }
      }
    }
  }
}

或者
{
  "size":0,
  "aggs":{
    "price_histogram":{
      "histogram":{
       "field":"price",
        "interval":100,
        "order":{
          "_count":"desc"
        }
      }
    }
  }
}

2. 日期直方图聚合

只能处理日期型的值

{
  "size":0,
  "aggs":{
    "book_publishDate":{
      "date_histogram":{
       "field":"publishDate",
        "interval":"day"
      }
    }
  }
}

可用的时间间隔:year/month/week/day/hour/quarter/minute/second 

3. 时间范围聚合

与普通的范围聚合最大的区别是,from和to参数值可以使用日期数学表达式,注意每个范围包含from 不包含to

{
  "size":0,
  "aggs":{
    "book_publishDate":{
      "date_range":{
       "field":"publishDate",
        "format":"yyyy-MM-dd",
        "ranges":[
          {"from":"now-4d/d"},
          {"to":"now-4d/d"}
        ]
      }
    }
  }
}

说明:现在时间减去4天,如下图,可以看到2018-08-13 之前没有,之后有4条

4. 范围聚合

范围聚合的每个范围内包含from但是排除to

这个有点类似直方图聚合,只不过,直方图是有规律的范围查询,而范围聚合,是可以自定义范围去聚合

{
  "size":0,
  "aggs":{
    "price_ranges":{
      "range":{
       "field":"price",
        "ranges":[
          {"to":100},
          {"from":100,"to":300},
          {"from":300}
        ]
      }
    }
  }
}

5. 过滤聚合

{
  "size":0,
  "aggs":{
    "price_java":{
      "filter":{
        "match":{
          "title":"java"
        }
      },
      "aggs":{
        "price_avg":{
          "avg":{
            "field":"price"
          }
        }  
      }
    }
  }
}

查询java书籍价格的平均值

6. 多重过滤聚合

多重过滤聚合是定义一个多分组聚合,每个分组关联一个过滤条件,并收集所有满足自身过滤条件的文档

{
  "size":0,
  "aggs":{
    "messages" : {
      "filters":{
        "filters" :{
          "infos":{
            "term":{
              "type":"info"
            }
          },
          "errors":{
            "term":{
              "type":"error"
            }
          }
        }
      },
      "aggs":{
        "monthly":{
          "date_histogram":{
            "field":"logTime",
            "interval":"month"
          }
        }
      }
    }
  }
}

从结果来看,聚合会创建两个关于日志数据的分组,一个收集info级别,一个收集error级别,并且是按月份划分

other_bucket_key

用来收集所有没有匹配到任何给出的过滤条件的文档

{
  "size":0,
  "aggs":{
    "messages" : {
      "filters":{
        "other_bucket_key":"other_message",
        "filters" :{
          "infos":{
            "term":{
              "type":"info"
            }
          },
          "errors":{
            "term":{
              "type":"error"
            }
          }
        }
      },
      "aggs":{
        "monthly":{
          "date_histogram":{
            "field":"logTime",
            "interval":"month"
          }
        }
      }
    }
  }
}

7. 空值聚合

对字段值为空或者null的文档进行分组

{
  "size":0,
  "aggs":{
    "without_price":{
      "missing":{
        "field":"price"
      }
    }
  }
}

8. 索引词聚合

{
  "size":0,
  "aggs":{
    "terms_type":{
      "terms":{
        "field":"type"
      }
    }
  }
}

9. ip聚合

{
  "size":0,
  "aggs":{
    "ip_ranges":{
      "ip_range":{
       "field":"ip",
        "ranges":[
          {"to":'10.0.0.10'},
          {"from":'10.0.0.10',"to":'10.0.0.100'},
          {"from":'10.0.0.100'}
        ]
      }
    }
  }
}

 后面还有几个聚合,等下次再写

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值