Elasticsearch aggs 聚合

1,462 阅读3分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

如果❤️我的文章有帮助,欢迎点赞、关注。这是对我继续技术创作最大的鼓励。更多往期文章在我的个人专栏

Elasticsearch aggs 聚合

桶和指标

如何理解 桶和指标,我们可以通过熟悉的 sql 语句来进行举例 SELECT COUNT(tag_code) FROM table GROUP BY tag_code

根据上面例子我们可以看出:

  • COUNT(tag_code) 求数量: 与 Elasticsearch 指标 含义相同。
  • GROUP BY tag_code 根据某一维度聚合: 与 Elasticsearch 含义相同。

桶是拿来装东西的,而我们会把相似的东西放在同一个桶里;在 Elasticsearch 中也是一样, 就是一个集合:筛选符合条件的 文档 集合

举个例子:

  • 以为工程师 属于 前端桶 或者 后端桶
  • 新恒结衣属于 日本桶

在 Elasticsearch 中 能让我们根据 筛选条件 对不同的文档分类出不同的集合。从而对集合进行 相关指标 的聚合统计。多数 指标 都是是加减乘除、对数据的统计(例如最小值、平均值、最大值,还有求数量)

尝试聚合

以每个标签作为, 比如:

{ "size": 0, "aggs": { "tag": { "terms": { "field": "tag_id" } } } }

添加指标每个标签的总消耗

{
  "size": 0,
  "aggs": {
    "tag": {
      "terms": {
        "field": "tag_id"
      },
      "aggs": {
        "total_cost": {
          "sum": {
            "field": "cost"
          }
        }
      }
    }
  }
}

标签消耗中,嵌套桶 每个设计师拥有素材

{
  "size": 0,
  "aggs": {
    "tag": {
      "terms": {
        "field": "tag_id"
      },
      "aggs": {
        "total_cost": {
          "sum": {
            "field": "cost"
          }
        },
        "designer": {
          "terms": {
            "field": "designer_id"
          }
        }
      }
    }
  }
}

标签消耗中,嵌套桶 每个设计师最大、最小消耗

{
  "size": 0,
  "aggs": {
    "tag": {
      "terms": {
        "field": "tag_id"
      },
      "aggs": {
        "total_cost": {
          "sum": {
            "field": "cost"
          }
        },
        "designer": {
          "terms": {
            "field": "designer_id"
          },
          "aggs": {
            "avg_cost": {
              "avg": { "field": "cost" }
            },
            "max_cost": {
              "max": { "field": "cost" }
            }
          }
        }
      }
    }
  }
}

条形图

date_histogram (和 histogram 一样)默认只会返回文档数目非零的 buckets

基础条形图

  • histogram 桶要求两个参数:一个数值字段以及一个定义桶大小间隔。
  • sum 度量嵌套在每个售价区间内,用来显示每个区间内的总收入。

例子:展示&点击之间关系

{
   "size" : 0,
   "aggs":{
      "show":{
         "histogram":{ 
            "field": "show",
            "interval": 1000
         },
         "aggs":{
            "total_click": {
               "sum": { 
                 "field" : "click"
               }
             }
         }
      }
   }
}

按时间统计

每月素材多少展示?

{
   "size" : 0,
   "aggs": {
      "show": {
         "date_histogram": {
            "field": "show",
            "interval": "month", 
            "format": "yyyy-MM-dd" 
         }
      }
   }
}

buckets 中没有文档也返回,需要设置两个参数来实现效果:

{
   "size" : 0,
   "aggs": {
      "show": {
         "date_histogram": {
            "field": "show",
            "interval": "month",
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2019-01-01",
                "max" : "2019-12-31"
            }
         }
      }
   }
}
  • min_doc_count这个参数强制返回空 buckets。
  • extended_bounds这个参数强制返回整年。

范围限定的聚合编辑

id = 259的设计师素材展示&消耗

{
    "query" : {
        "match" : { "designer_id" : "259" }
    },
    "size":0,
    "aggs" : {
        "avg_show": { "avg": { "field": "show" } },
        "avg_cost": { "avg": { "field": "cost" } }
    }
}

id = 259的设计师素材展示&消耗 与 全部素材做对比

{
    "query" : {
        "match" : {
            "designer_id" : "259"
        }
    },
    "size":0,
    "aggs" : {
    	"avg_show": {
           "avg": { "field": "show" } 
        },
        "avg_cost": {
           "avg": { "field": "cost" } 
        },
        "all": {
            "global" : {}, 
            "aggs" : {
			   "all_avg_show": {
                  "avg": { "field": "show" } 
               },
               "all_avg_cost": {
                  "avg": { "field": "cost" } 
               }
            }
        }
    }
}

聚合过滤

消耗大于 1000 的素材 平均消耗

{
    "size" : 0,
    "query" : {
        "constant_score": {
            "filter": {
                "range": {
                    "cost": { "gte": 1000 }
                }
            }
        }
    },
    "aggs" : {
        "single_avg_cost": { "avg" : { "field" : "cost" } },
        "per_designer_sum": {
           "terms": { "field": "designer_id" },
           "aggs":{
              "single_avg_cost": { "avg" : { "field" : "cost" } },
              "single_avg_show": { "avg" : { "field" : "show" } }
           }
       }
    }
}

聚合计算

{
  "size": 0,
  "aggs": {
    "tag_aggs": {
      "terms": {
        "field": "tag_id"
      },
      "aggs": {
        "sum_cost": {
          "sum": {
            "field": "cost"
          }
        },
        "sum_show": {
          "sum": {
            "field": "show"
          }
        },
        "cpm": {
          "bucket_script": {
            "buckets_path": {
              "total_cost": "sum_cost",
              "total_show": "sum_show"
            },
            "script": "( params.total_cost / params.total_show ) * 1000"
          }
        }
      }
    }
  }
}