ElasticSearch+聚合+Aggregation+示例

Posted Data+Science+Insight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch+聚合+Aggregation+示例相关的知识,希望对你有一定的参考价值。

ElasticSearch+聚合+Aggregation+示例

 

聚合提供了分组并统计数据的能力。理解聚合的最简单的方式是将其粗略地等同为SQL的GROUP BY和SQL聚合函数。在Elasticsearch中,你可以在一个响应中同时返回命中的数据和聚合结果。你可以使用简单的API同时运行查询和多个聚合,并以一次返回,这避免了来回的网络通信,这是非常强大和高效的。

    

    作为开始的一个例子,我们按照state分组,按照州名的计数倒序排序:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" } } } }'

    在SQL中,上面的聚合在概念上类似于:

SELECT COUNT(*) from bank GROUP BY state ORDER BY COUNT(*) DESC   

   响应(其中一部分)是:

"hits" : { "total" : 1000, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "group_by_state" : { "buckets" : [ { "key" : "al", "doc_count" : 21 }, { "key" : "tx", "doc_count" : 17 }, { "key" : "id", "doc_count" : 15 }, { "key" : "ma", "doc_count" : 15 }, { "key" : "md", "doc_count" : 15 }, { "key" : "pa", "doc_count" : 15 }, { "key" : "dc", "doc_count" : 14 }, { "key" : "me", "doc_count" : 14 }, { "key" : "mo", "doc_count" : 14 }, { "key" : "nd", "doc_count" : 14 } ] } } }

    我们可以看到AL(abama)有21个账户,TX有17个账户,ID(daho)有15个账户,依此类推。

    

    注意我们将size设置成0,这样我们就可以只看到聚合结果了,而不会显示命中的结果。

    

    在先前聚合的基础上,现在这个例子计算了每个州的账户的平均余额(还是按照账户数量倒序排序的前10个州):

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }'

    注意,我们把average_balance聚合嵌套在了group_by_state聚合之中。这是所有聚合的一个常用模式。你可以任意的聚合之中嵌套聚合,这样你就可以从你的数据中抽取出想要的概述。

    

    基于前面的聚合,现在让我们按照平均余额进行排序:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state", "order": { "average_balance": "desc" } }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } }'

    下面的例子显示了如何使用年龄段(20-29,30-39,40-49)分组,然后在用性别分组,然后为每一个年龄段的每一个性别计算平均账户余额:

curl -XPOST 'localhost:9200/bank/_search?pretty' -d ' { "size": 0, "aggs": { "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 30, "to": 40 }, { "from": 40, "to": 50 } ] }, "aggs": { "group_by_gender": { "terms": { "field": "gender" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } } } }'

Elasticsearch的Aggregation功能也异常强悍。

Aggregation共分为三种:Metric Aggregations、Bucket Aggregations、 Pipeline Aggregations。下面将分别进行总结。

 

以下所有内容都来自官网:喜欢原汁原味的参看下方网址,不喜欢英文的参看本人总结。

官网(权威):https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-aggregations-metrics-avg-aggregation.html

 

 

#########################################

1、Metric Aggregations

1>Avg Aggregation  #计算出字段平均值

{ "aggs" : { "avg_grade" : { "avg" : { "field" : "grade" } } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "avg_grade": {

      "avg": {

        "field": "grade"

      }

    }

  }

}

参数:search_type=count 表示只返回aggregation部分的结果。

 

2>Cardinality Aggregation  #计算出字段的唯一值。相当于sql中的distinct

 

{ "aggs" : { "author_count" : { "cardinality" : { "field" : "author" } } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "author_count": {

      "cardinality": {

        "field": "author"

      }

    }

  }

}

 

3>Extended Stats Aggregation #字段的其他属性,包括最大最小,方差等等。

 

{ "aggs" : { "grades_stats" : { "extended_stats" : { "field" : "grade" } } } }

 

 

例子:GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "grades_stats": {

      "extended_stats": {

        "field": "grade"

      }

    }

  }

}

返回值:

 

{ ... "aggregations": { "grade_stats": { "count": 9, "min": 72, "max": 99, "avg": 86, "sum": 774, "sum_of_squares": 67028, "variance": 51.55555555555556, "std_deviation": 7.180219742846005, "std_deviation_bounds": { "upper": 100.36043948569201, "lower": 71.63956051430799 } } } }

 

 

4>Geo Bounds Aggregation #计算出所有的地理坐标将会落在一个矩形区域。比如说朝阳区域有很多饭店,我就可以用一个矩形把这些饭店都圈起来,看看范围。

 

{ "query" : { "match" : { "business_type" : "shop" } }, "aggs" : { "viewport" : { "geo_bounds" : { "field" : "location", "wrap_longitude" : true } } } }

 

 

例子:

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "viewport": {

      "geo_bounds": {

        "field": "location",

        "wrap_longitude": true

      }

    }

  }

}

返回值:

 

{ ... "aggregations": { "viewport": { "bounds": { "top_left": { "lat": 80.45, "lon": -160.22 }, "bottom_right": { "lat": 40.65, "lon": 42.57 } } } } }

 

 

注释:这个矩形区域左上角坐标,和右下角坐标已经给出。也就是说你查出来的数据将会都落在这个地理范围内。

 

 

5>Geo Centroid Aggregation   #计算出所有文档的大概的中心点。比如说某个地区盗窃犯罪很多,那我这样就可以看到这片区域到底哪个点(街道)偷盗事件最猖狂。

 

{ "query" : { "match" : { "crime" : "burglary" } }, "aggs" : { "centroid" : { "geo_centroid" : { "field" : "location" } } } }

 

 

例子:

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "centroid": {

      "geo_centroid": {

        "field": "location"

      }

    }

  }

}

 

6>Max Aggregation  #求最大值

 

{ "aggs" : { "max_price" : { "max" : { "field" : "price" } } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "max_price": {

      "max": {

        "field": "price"

      }

    }

  }

}

 

7>Min Aggregation #求最小值

 

{ "aggs" : { "min_price" : { "min" : { "field" : "price" } } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "min_price": {

      "min": {

        "field": "price"

      }

    }

  }

}

 

 

8>Percentiles Aggregation #百分比统计。可以看出你网站的所有页面。加载时间的差异。

 

{ "aggs" : { "load_time_outlier" : { "percentiles" : { "field" : "load_time" } } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "load_time_outlier": {

      "percentiles": {

        "field": "load_time"

      }

    }

  }

}

 

返回:可以看出这个网站75%页面在29毫秒左右就加载完毕了。有5%的页面超过了60毫秒。

 

{ ... "aggregations": { "load_time_outlier": { "values" : { "1.0": 15, "5.0": 20, "25.0": 23, "50.0": 25, "75.0": 29, "95.0": 60, "99.0": 150 } } } }

 

9>Percentile Ranks Aggregation #看看15毫秒和30毫秒内大概有多少页面加载完。

 

{ "aggs" : { "load_time_outlier" : { "percentile_ranks" : { "field" : "load_time", "values" : [15, 30] } } } }

 

例子:

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "load_time_outlier": {

      "percentile_ranks": {

        "field": "load_time",

        "values": [

          15,

          30

        ]

      }

    }

  }

}

 

返回:看出15毫秒时大概92%页面加载完毕。30毫秒时基本都加载完成。

 

{ ... "aggregations": { "load_time_outlier": { "values" : { "15": 92, "30": 100 } } } }

 

 

10>Stats Aggregation  #最大、最小、和、平均值。一起求出来

 

{ "aggs" : { "grades_stats" : { "stats" : { "field" : "grade" } } } }

 

例子:

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "grades_stats": {

      "stats": {

        "field": "grade"

      }

    }

  }

}

 

11>Sum Aggregation #求和

 

"aggs" : { "intraday_return" : { "sum" : { "field" : "change" } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "intraday_return": {

      "sum": {

        "field": "change"

      }

    }

  }

}

 

12>Top hits Aggregation  #较为常用的统计。获取到每组前n条数据。相当于sql 中 group by 后取出前n条。 

 

{ "aggs": { "top-tags": { "terms": { "field": "tags", "size": 3 }, "aggs": { "top_tag_hits": { "top_hits": { "sort": [ { "last_activity_date": { "order": "desc" } } ], "_source": { "include": [ "title" ] }, "size" : 1 } } } } } }

例子:取100组,每组只要第一条。为了见bain没用order和_source,请自行测试他们。

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "all_interests": {

      "terms": {

        "field": "zxw_id",

        "size": 100

      },

      "aggs": {

        "top_tag_hits": {

          "top_hits": {

            "size": 1

          }

        }

      }

    }

  }

}

 

14>Value Count Aggregation  #数量统计,看看这个字段一共有多少个不一样的数值。

 

{ "aggs" : { "grades_count" : { "value_count" : { "field" : "grade" } } } }

例子:

 

GET index/type/_search?search_type=count

{

  "query": {

    "match_all": {}

  },

  "aggs": {

    "grades_count": {

      "value_count": {

        "field": "grade"

      }

    }

  }

}

 

2、Bucket Aggregations 这是第二种类型的统计(用的也是最多的,最实用的。)。后续也是抄写,各位自己看吧。有问题需要讨论的=》1250134974@qq.com发邮件.

网站:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-aggregations-bucket-children-aggregation.html

 

3、Pipeline Aggregations #这是第三中类型的聚合。

 

 

参考:Elasticsearch聚合——aggregation

参考:Elasticsearch--Aggregation详细总结(聚合统计)

参考:ElasticSearch聚合

以上是关于ElasticSearch+聚合+Aggregation+示例的主要内容,如果未能解决你的问题,请参考以下文章

Java 代码中的聚合和组合

如何在 Django JSONField 数据上聚合(最小/最大等)?

Elasticsearch聚合查询

Elasticsearch多字段聚合查询

Elasticsearch 聚合功能

Elasticsearch 聚合后排序 --- 2022-04-03