elasticsearch中aggregation的简单用法

首先创建实例,以汽车经销商为例(数据主要包含:品牌、制造商、售价、销售时间等)

POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }

1. 一个简单的聚合,查出哪个颜色的销量最好:

GET /cars/transactions/_search?search_type=count
{
    "aggs" : {
        "colors" : {
            "terms" : {
                "field" : "color"
            }
        }
    }
}

详解:
1) 聚合语句写在第一层aggs参数之下(aggs也可以写成aggregations)
2) colors是该aggregations的名称。可以随意命名
3) terms是bucket的一种类型。
个人见解:数据都是存放在一个桶里面,查询语句就是为了把数据从大桶里面捞出来然后放到小桶里面进行其他的操作。
terms bucket:在该查询语句中,terms指定的field是color,就是为每一种颜色建立sub bucket(小桶),把那些数据放入几个小桶中进行重新归类。

运行上述语句,查询到的结果是:

{
    ...
    "hits": {
        "hits": []
    },
    "aggregations": {
        "colors": {
            "buckets": [
                {
                    "key": "red",
                    "doc_count": 4
                },
                {
                    "key": "blue",
                    "doc_count": 2
                },
                {
                    "key": "green",
                    "doc_count": 2
                }
            ]
        }
    }
}

看到了吧,根据所有的数据根据颜色的种类,都放到了小桶里面去了,buckets中就是所有的小桶了。其中key就相当于这个桶的label了,doc_count这个跟查询的方式有关系。

2. 聚合中复杂的统计(metric)
简单的buckets及计算每个bucket中的document number是一个简单的基础并且这种方式非常的有用。但是在应用中我们往往需要更复杂的统计。例如:统计每种颜色中车辆销售的均价是多少?
查询语句如下:

GET /cars/transactions/_search?search_type=count
{
    "aggs": {
        "colors": {
            "terms": {
            "field": "color"
            },
            "aggs": {
                "avg_price": {
                    "avg": {
                        "field": "price"
                    }
                }
            }
        }
    }
}

注意看语法结构,有定义了一个aggs,是nest在color中,也就是这个aggs是针对每一种color的。其中avg_price是metric的名字。

该语句的取值结果为:

{
    ...
    "aggregations": {
        "colors": {
            "buckets": [
                {
                    "key": "red",
                    "doc_count": 4,
                    "avg_price": {
                        "value": 32500
                    }
                },
                {
                    "key": "blue",
                    "doc_count": 2,
                    "avg_price": {
                        "value": 20000
                    }
                },
                {
                    "key": "green",
                    "doc_count": 2,
                    "avg_price": {
                        "value": 21000
                    }
                }
            ]
        }
    }
...
}

在每个bucket中增加了avg_price字段,说明每个bucket中添加metric成功!

3. buckets中嵌套buckets
概念简单,直接贴嵌套的查询语句吧:

GET /cars/transactions/_search?search_type=count
{
    "aggs": {
        "colors": {
            "terms": {
                "field": "color"
            },
            "aggs": {
                "avg_price": {
                    "avg": {
                        "field": "price"
                    }
                },
                "make": {
                    "terms": {
                        "field": "make"
                    }
                }
            }
        }
    }
}

注意看嵌套的buckets跟metric是在同一个level下,这个地方需要思考一下他们的嵌套关系,有助于了解aggregation中的buckets和metric的概念了。
查询结果如下:

{
    ...
    "aggregations": {
        "colors": {
            "buckets": [
                {
                    "key": "red",
                    "doc_count": 4,
                    "make": {
                        "buckets": [
                            {
                                "key": "honda",
                                "doc_count": 3
                            },
                            {
                                "key": "bmw",
                                "doc_count": 1
                            }
                        ]
                    },
                    "avg_price": {
                        "value": 32500
                    }
                },
                ...
}

以上就是elasticsearch中关于aggregation的一点理解,需要经常思考一下语法结构,并想明白这种结构的合理性,这样就更容易理解了!

http://blog.csdn.net/dm_vincent/article/details/42387161

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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 聚合查询功能非常强大,支持多种聚合器和聚合规则,可以根据具体需求进行调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值