Py学习  »  Elasticsearch

Elasticsearch aggs 聚合

锐玩道 • 2 年前 • 477 次点击  
阅读 6

Elasticsearch aggs 聚合

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

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

Elasticsearch aggs 聚合

桶和指标

SELECT COUNT(color) 
FROM table
GROUP BY color 
复制代码
  • COUNT(color) 相当于指标。
  • GROUP BY color 相当于桶.

桶 简单来说就是满足特定条件的文档的集合:

  • 一个雇员属于 男性 桶或者 女性 桶
  • 奥尔巴尼属于 纽约 桶
  • 日期2014-10-28属于 十月 桶

桶能让我们划分文档到有意义的集合, 但有意义的是对这些桶内的文档进行一些指标的计算。


分桶是一种达到目的的手段:它提供了一种给文档分组的方法来让我们可以计算感兴趣的指标。

大多数 指标 是简单的数学运算(例如最小值、平均值、最大值,还有汇总)

尝试聚合

以每个标签作为, 比如:

{ "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这个参数强制返回整年。 // 存疑

// 作为例子,我们构建聚合以便按季度展示所有汽车品牌总销售额。同时按季度、按每个汽车品牌计算销售总额,以便可以找出哪种品牌最赚钱:

{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "quarter", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0
         },
         "aggs": {
            "per_make_sum": {
               "terms": { "field": "make" },
               "aggs": {
                  "sum_price": { "sum": { "field": "price" } }
               }
            },
            "total_sum": {
               "sum": { "field": "price" } 
            }
         }
      }
   }
}
复制代码

范围限定的聚合编辑

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"
          }
        }
      }
    }
  }
}
复制代码
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118398
 
477 次点击