ElasticSearch基础入门(四)桶、度量

一、基本概念

通过聚合,我们会得到一个数据的概览。我们需要的是分析和总结全套的数据而不是寻找单个文档。

ElasticSearch中的聚合,常见的有两种,度量

1.桶(bucket)

桶,是按照一定的方式对数据进行分组,每一组数据在ES中称作一个桶,例如我们可以根据大陆对人进行划分,可以得到欧亚桶美洲桶非洲桶等。

Elasticsearch中提供的划分桶的方式有很多:

  • Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为月,会自动每月分为一组
  • Histogram Aggregation:根据数值阶梯分组,与日期类似
  • Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
  • Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
  • ……

bucket aggregations 只负责对数据进行分组,并不进行计算,因此往往bucket中往往会嵌套另一种聚合:度量(metrics aggregations)

2. 度量(metrics)

分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为度量

比较常用的一些度量聚合方式:

  • Avg Aggregation:求平均值
  • Max Aggregation:求最大值
  • Min Aggregation:求最小值
  • Percentiles Aggregation:求百分比
  • Stats Aggregation:同时返回avg、max、min、sum、count等
  • Sum Aggregation:求和
  • Top hits Aggregation:求前几
  • Value Count Aggregation:求总数
  • ……

在ES中,需要进行聚合、排序、过滤的字段其处理方式比较特殊,因此不能被分词。我们需要将字段设置为keyword类型,这个类型不会被分词,将来就可以参与聚合

二、聚合为桶

{
  "size": 0, 
  "aggs": {
    "aggs_colors": {
      "terms": {
        "field": "color"
      }
    }
  }
}
  • size: 查询条数,这里设置为0,不关心搜索到的数据,只关心聚合结果,提高效率
  • aggs:声明这是一个聚合查询,是aggregations的缩写
    • aggs_colors:聚合名称,任意。
      • terms:划分桶的方式,这里是根据词条划分
        • field:划分桶的字段

三、 桶内度量

前面的例子告诉我们每个桶里面的文档数量,这很有用。 但通常,我们的应用需要提供更复杂的文档度量。 例如,每种颜色汽车的平均价格是多少?

因此,我们需要告诉Elasticsearch使用哪个字段使用何种度量方式进行运算,这些信息要嵌套在内,度量的运算会基于内的文档进行

现在,我们为刚刚的聚合结果添加 求价格平均值的度量。

GET /cars/_search
{
    "size" : 0,
    "aggs" : { 
        "aggs_colors" : { 
            "terms" : { 
              "field" : "color"
            },
            "aggs":{
                "avg_price": { 
                   "avg": {
                      "field": "price" 
                   }
                }
            }
        }
    }
}
  • avg:度量的类型,这里是求平均值
  • field:度量运算的字段

四、桶的嵌套

桶内不仅可以做运算,还可以再嵌套桶。简而言之,就是在分组之中,再进行分组。

比如:我们想统计每种颜色的汽车中,分别属于哪个制造商,按照make字段再进行分桶。

GET /cars/_search
{
  "size": 0,
  "aggs": {
    "aggs_colors": {
      "terms": {
        "field": "color"
      },
      "aggs": {
        "aggs_maker": {
          "terms": {
            "field": "make"
          }
        },
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

五、直方图分桶(阶梯)

histogram是把数值类型的字段,按照一定的阶梯大小进行分组。你需要指定一个阶梯值(interval)来划分阶梯大小。

阶梯区间计算公式:

bucket_key = Math.floor((value - offset) / interval) * interval + offset

下面,我们对汽车的价格进行分组,指定间隔interval为10000。

{
  "size": 0,
  "aggs": {
    "price_histogram": {
      "histogram": {
        "field": "price",
        "interval": 10000,
        "min_doc_count": 1
      }
    }
  }
}
  • min_doc_count: 约束最少文档数量。文档数量为0的桶会被过滤

六、范围分桶(range)

范围分桶与阶梯分桶类似,也是把数字按照阶段进行分组,只不过range方式需要你自己指定每一组的起始和结束大小

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值