• 参加聚合的字段必须是keyword、日期、数值、布尔类型。

Bucket聚合

  1. 要统计所有数据中的酒店品牌有几种,其实就是按照品牌对数据分组。此时可以根据酒店品牌的名称做聚合,也就是Bucket聚合。
  2. 聚合语法:Bucket聚合用来对文档做分组
GET /indexName/_search
{
    // 设置size为0,结果中不包含文档,只包含聚合结果
    "size": 0,
    "aggs": { // 定义聚合
      "brandAgg": { //给聚合起个名字
        "terms": { // 聚合的类型,按照品牌值聚合,所以选择term
          "field": "brand", // 参与聚合的字段
          "size": 20 // 希望获取的聚合结果数量
        }
      }
    }
}

聚合结果排序

  1. 默认情况下,Bucket聚合会统计Bucket内的文档数量,记为_count,并且按照_count降序排序。
  2. 我们可以指定order属性,自定义聚合的排序方式:
GET /indexName/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "order": {
          "_count": "asc" // 按照_count升序排列
        },
        "size": 20
      }
    }
  }
}

限定聚合范围

  1. 默认情况下,Bucket聚合是对索引库的所有文档做聚合,但真实场景下,用户会输入搜索条件,因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。
  2. 我们可以限定要聚合的文档范围,只要添加query条件即可:
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "lte": 200 // 只对200元以下的文档聚合
      }
    }
  }, 
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20
      }
    }
  }
}

Metric聚合

  1. 桶聚合对酒店按照品牌分组,形成了一个个桶。现在我们需要对桶内的酒店做运算,获取每个品牌的用户评分的min、max、avg等值。
  2. Metric聚合,例如stat聚合:就可以获取min、max、avg等结果。
  3. 这次的score_stats聚合是在brandAgg的聚合内部嵌套的子聚合。因为我们需要在每个桶分别计算。
  4. 使用语法:
GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": { 
      "terms": { 
        "field": "brand", 
        "size": 20
      },
      "aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
        "score_stats": { // 聚合名称
          "stats": { // 聚合类型,这里stats可以计算min、max、avg等
            "field": "score" // 聚合字段,这里是score
          }
        }
      }
    }
  }
}
  1. 另外,我们还可以给聚合结果做个排序,例如按照每个桶的酒店平均分做排序:
GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": { 
      "terms": { 
        "field": "brand", 
        "size": 20,
        "order": {
            "scoreAgg.avg": "desc"
        }
      },
      "aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
        "score_stats": { // 聚合名称
          "stats": { // 聚合类型,这里stats可以计算min、max、avg等
            "field": "score" // 聚合字段,这里是score
          }
        }
      }
    }
  }
}