elasticsearch 可视化_大数据搜索与可视化分析(9)elasticsearch聚合分析Bucket Aggregation...

在上一篇文章中,我们介绍了《大数据搜索与可视化分析(9)elasticsearch聚合分析-Metric Aggregation》,本文继续学习elasticsearch聚合分析-Bucket Aggregation。

  • Bucket Aggregation

407886968b726bc06f2371a1964ab4a6.png

图片参考文章《Elasticsearch 之聚合分析入门https://www.cnblogs.com/wupeixuan/p/12549336.html》

Bucket 就是桶的意思,即按照一定的规则将文档分配到不同的桶中,达到分类分析的目的。如上图所示,左边有一堆文档,右边有三个桶,每个桶有不同的规则,比如第一个桶的规则为价格小于 3000 的,第二个桶为价格大于等于 3000 小于 6000 的,最后一个桶的规则为价格大于 6000 的,然后不同的文档根据不同的价格分到不同的桶中,那么我们就实现了分类。

有了 Bucket 聚合分析机制,我们就可以把公司员工以年龄方式进行区分,以地理位置的方式来区分客户,以男性女性来区分演员等。

根据 Bucket 的分桶策略,常见的 Bucket 聚合分析如下

  • Terms:直接按照 term 来分桶,如果是 text 类型,则按照分词后的结果分桶

  • Range:指定数值的范围来设定分桶规则

  • Date Range:指定日期的范围来设定分桶规则

  • Histogram:直方图,以固定间隔的策略来分割数据

  • Date Histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型

首先插入样例数据

POST test_aggregation/_bulk{"index":{"_id":"1"}}{"username":"曹操","job":"主公","age":50,"birth":"1900-01-01","isMarried":true,"salary":100}{"index":{"_id":"2"}}{"username":"曹丕","job":"主公","age":28,"birth":"1980-05-07","isMarried":true,"salary":30}{"index":{"_id":"3"}}{"username":"曹睿","job":"主公","age":20,"birth":"1990-05-07","isMarried":true,"salary":20}{"index":{"_id":"4"}}{"username":"荀彧","job":"军师","age":22,"birth":"1985-08-07","isMarried":false,"salary":15}{"index":{"_id":"5"}}{"username":"司马懿","job":"军师","age":23,"birth":"1989-08-07","isMarried":false,"salary":8}{"index":{"_id":"6"}}{"username":"程昱","job":"军师","age":20,"birth":"1990-08-07","isMarried":false,"salary":5}{"index":{"_id":"7"}}{"username":"典韦","job":"武士","age":18,"birth":"1994-08-07","isMarried":false,"salary":5}{"index":{"_id":"8"}}{"username":"许褚","job":"武士","age":26,"birth":"1987-08-07","isMarried":false,"salary":12}
  • Terms:直接按照 term 来分桶并统计

GET test_aggregation/_search{  "aggs": {    "NAME": {      "terms": {        "field": "job.keyword",        "size": 10      }    }  }}

统计结果:

"aggregations" : {    "NAME" : {      "doc_count_error_upper_bound" : 0,      "sum_other_doc_count" : 0,      "buckets" : [        {          "key" : "主公",          "doc_count" : 3        },        {          "key" : "军师",          "doc_count" : 3        },        {          "key" : "武士",          "doc_count" : 2        }      ]    }  }

从结果中可以看到文档根据job分成了不同的桶,每个桶还包括 doc_count,这样就可以很轻松知道 ES 存储的三国信息中,主公,军师,武士分别有多少条。

  • Range:指定数值的范围来设定分桶规则

根据工资来统计一下小于10的,10-50的,50-90的和大于90的分组

GET test_aggregation/_search{  "aggs": {    "salary_range": {      "range": {        "field": "salary",        "ranges": [          {            "to": 10          },          {            "from": 10,            "to": 50          },          {            "from": 50,            "to":90          },          {            "from": 90          }        ]      }    }  }}

输出结果:

"aggregations" : {    "salary_range" : {      "buckets" : [        {          "key" : "*-10.0",          "to" : 10.0,          "doc_count" : 3        },        {          "key" : "10.0-50.0",          "from" : 10.0,          "to" : 50.0,          "doc_count" : 4        },        {          "key" : "50.0-90.0",          "from" : 50.0,          "to" : 90.0,          "doc_count" : 0        },        {          "key" : "90.0-*",          "from" : 90.0,          "doc_count" : 1        }      ]    }  }

根据输出结果可以看到,工资小于10的有三条,10-50的有4条,50-90的没有,大于90的一条。

  • Date Range:指定日期的范围来设定分桶规则

根据出生年份进行统计,1900年到1980年,1980年到1990年,1990年到2000年。

GET test_aggregation/_search{  "size": 0,  "aggs": {    "date_range": {      "range": {        "field": "birth",        "format": "yyyy",        "ranges": [          {            "from": "1900",            "to": "1980"          },          {            "from": "1980",            "to": "1990"          },          {            "from": "1990",            "to":"2000"          }        ]      }    }  }}

输出结果:

"aggregations" : {    "date_range" : {      "buckets" : [        {          "key" : "1900-1980",          "from" : -2.2089888E12,          "from_as_string" : "1900",          "to" : 3.155328E11,          "to_as_string" : "1980",          "doc_count" : 1        },        {          "key" : "1980-1990",          "from" : 3.155328E11,          "from_as_string" : "1980",          "to" : 6.31152E11,          "to_as_string" : "1990",          "doc_count" : 4        },        {          "key" : "1990-2000",          "from" : 6.31152E11,          "from_as_string" : "1990",          "to" : 9.466848E11,          "to_as_string" : "2000",          "doc_count" : 3        }      ]    }  }
  • Histogram:直方图,以固定间隔的策略来分割数据

按照salary进行聚合分析,直方图间隔为20,最小数据值为0,最大数据值为20.

GET test_aggregation/_search{  "aggs": {    "salary": {      "histogram": {        "field": "salary",        "interval": 20,        "extended_bounds": {          "min": 0,          "max": 120        }      }    }  }}

输出结果:

"aggregations" : {    "salary" : {      "buckets" : [        {          "key" : 0.0,          "doc_count" : 5        },        {          "key" : 20.0,          "doc_count" : 2        },        {          "key" : 40.0,          "doc_count" : 0        },        {          "key" : 60.0,          "doc_count" : 0        },        {          "key" : 80.0,          "doc_count" : 0        },        {          "key" : 100.0,          "doc_count" : 1        },        {          "key" : 120.0,          "doc_count" : 0        }      ]    }  }
  • Date Histogram:针对日期的直方图或者柱状图,是时序数据分析中常用的聚合分析类型

GET test_aggregation/_search{  "size": 0,  "aggs": {    "year_historgram": {      "date_histogram": {        "field": "birth",        "interval": "year",        "format": "yyyy"      }    }  }}

由于输出结果过长,本文就不贴结果了,由读者自行验证。

更多大数据搜索与可视化分析讲解,可点击原文查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch 聚合查询(Aggregation)是一种用于对数据进行多维度分析的功能。聚合查询可以用于分析数据的分布情况、计算数据的统计信息、生成图表等。在 Elasticsearch 中,聚合查询是通过使用特定的聚合器(Aggregator)来完成的。 Java 中使用 Elasticsearch 聚合查询需要使用 Elasticsearch Java API。首先需要创建一个 SearchRequest 对象,并设置需要查询的索引和查询条件。然后创建一个 AggregationBuilder 对象,用于定义聚合查询的规则和参数。最后将 AggregationBuilder 对象添加到 SearchRequest 中,执行查询操作。 以下是一个简单的 Java 代码示例,用于查询某个索引下的数据,并按照某个字段进行分组聚合查询: ``` SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("group_by_field").field("field_name"); searchSourceBuilder.aggregation(aggregationBuilder); searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); Terms terms = searchResponse.getAggregations().get("group_by_field"); for (Terms.Bucket bucket : terms.getBuckets()) { String key = bucket.getKeyAsString(); long count = bucket.getDocCount(); System.out.println("key: " + key + ", count: " + count); } ``` 在上面的代码中,首先创建了一个 SearchRequest 对象,设置需要查询的索引和查询条件。然后创建了一个 TermsAggregationBuilder 对象,用于按照某个字段进行分组聚合查询。最后将 TermsAggregationBuilder 对象添加到 SearchRequest 中,执行查询操作。 查询结果会返回一个 Terms 对象,其中包含了分组聚合查询的结果。可以使用 Terms 对象的 getBuckets() 方法获取分组聚合查询的结果列表。每个分组聚合查询结果由一个 Terms.Bucket 对象表示,其中包含了分组聚合查询的键值和文档数量等信息。 以上是简单的聚合查询示例,Elasticsearch 聚合查询功能非常强大,支持多种聚合器和聚合规则,可以根据具体需求进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值