elasticsearch学习(二)之Aggregations(聚合)

原创 2015年12月04日 20:13:37

基本概念

 Elasticsearch有一个功能叫做聚合(aggregations),它允许你在数据上生成复杂的分析统计。它很像SQL中的GROUP BY但是功能更强大。

官方java-api原文 

地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/1.7/java-aggs.html

There are many different types of aggregations, each with its own purpose and output. To better understand these types, it is often easier to break them into two main families:

Bucketing
A family of aggregations that build buckets, where each bucket is associated with a key and a document criterion. When the aggregation is executed, all the buckets criteria are evaluated on every document in the context and when a criterion matches, the document is considered to "fall in" the relevant bucket. By the end of the aggregation process, we’ll end up with a list of buckets - each one with a set of documents that "belong" to it.
Metric
Aggregations that keep track and compute metrics over a set of documents.

The interesting part comes next. Since each bucket effectively defines a document set (all documents belonging to the bucket), one can potentially associate aggregations on the bucket level, and those will execute within the context of that bucket. This is where the real power of aggregations kicks in:

对应译文

有许多不同类型的聚合的,每个都有其自己的目的和输出。为了更好地理解这些类型的,它通常更容易将它们分解为两个主要的家族:
大雨(大量桶)--(这个真不知道如何译好)
一个家庭聚集的建立桶,每个桶都与一个键和一个文档标准相关联的。当聚合被执行时,在每一个文档的上下文中所有的桶的标准都被评估,如果标准匹配那么就认为将这个文档扔进这个相关的同种进行处理。等到聚合进程全部结束,我们将会获得一的桶的清单--其中每一个桶包含着一系列的属于这个桶的文档。
度量
聚集跟踪和度量一系列的文档。有趣的部分随之而来。由于每一个桶被有效的定义为一个文档集(所有的文档属于这个桶),我们就可以潜在地在桶的级别上联系聚合,同时这些将会被执行在桶的环境之下。这就是聚合的真正力量所在:聚合可以被嵌套!

Metric Aggregation(聚合操作)

Es的java api支持很多种的聚合操作,也就是大部分的搜索相关的操作都可以通过aggregation的组合来进行操作,相当于普通关系型数据库的group by的操作。
其中Metric Aggregation包括很多的聚合类型,可以参照官方的api,地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/1.7/_metrics_aggregations.html#_metrics_aggregations
主要说一下其中一个不太好理解的一个:

Percentile Aggregation 

Here is an example on how to create the aggregation request:

MetricsAggregationBuilder aggregation =
        AggregationBuilders
                .percentiles("agg")
                .field("height");

You can provide your own percentiles instead of using defaults:

MetricsAggregationBuilder aggregation =
        AggregationBuilders
                .percentiles("agg")
                .field("height")
                .percentiles(1.0, 5.0, 10.0, 20.0, 30.0, 75.0, 95.0, 99.0);

Use aggregation responseedit

Import Aggregation definition classes:

import org.elasticsearch.search.aggregations.metrics.percentiles.Percentile;
import org.elasticsearch.search.aggregations.metrics.percentiles.Percentiles;
// sr is here your SearchResponse object
Percentiles agg = sr.getAggregations().get("agg");
// For each entry
for (Percentile entry : agg) {
    double percent = entry.getPercent();    // Percent
    double value = entry.getValue();        // Value

    logger.info("percent [{}], value [{}]", percent, value);
}

This will basically produce for the first example:

percent [1.0], value [0.814338896154595]
percent [5.0], value [0.8761912455821302]
percent [25.0], value [1.173346540141847]
percent [50.0], value [1.5432023318692198]
percent [75.0], value [1.923915462033674]
percent [95.0], value [2.2273644908535335]
percent [99.0], value [2.284989339108279]
以上截取的官方文档,主要是说明下其返回结果的意义:
如上所示:percent代表的百分比,本以为这是个很简单的东东,但是才发现这个percentiles实现的背后是用的一个比较复杂的算法--

digest具体可参考文章:https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf

经过自己的研究和测试,目前发现这个的作用就是对观测field的一种统计,比如可以取10%对应的具体的值,也可以参照其分布了解数据的大致分布,比如下面的所示,可以看到大部分数据在15-29之间,但也会偶然陡峭到60-150
整体来说,没有弄太明白它的percentiles的作用和具体意义,但是据说作用很大,以后用到再好好研究啦
"values" : {
            "1.0": 15,
            "5.0": 20,
            "25.0": 23,
            "50.0": 25,
            "75.0": 29,
            "95.0": 60,
            "99.0": 150
         }



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Elasticsearch过滤与聚合的先后顺序java实现

Elasticsearch的聚合结果是先过滤或者搜索后聚合,那么如果我们想要先聚合,然后对结果进行再一次的过滤或者搜索应该如何实现呢,在此给出简单的java实现demo...

[Elasticsearch] 聚合的测试数据

本章翻译自Elasticsearch官方指南的Aggregation Test-Drive一章。 聚合的测试数据(Aggregation Test-Drive) 我们将学习...

elasticsearch中aggregation的简单用法

首先创建实例,以汽车经销商为例(数据主要包含:品牌、制造商、售价、销售时间等)POST /cars/transactions/_bulk { "index": {}} { "price" : 1000...
  • fsz9065
  • fsz9065
  • 2016年08月21日 20:08
  • 1196

Mongodb高级查询Aggregation聚合组件分页

用Mongo的聚合组件Aggregation要用到两个方法skip和limit。skip设置起点(分页的时候不包含起点,从起点的下一行开始),limit设置条数。如: Aggregation.skip...

ElasticSearch入门之彼行我释(四)

散仙在上篇文章中,介绍了关于ElasticSearch基本的增删改查的基本粒子,本篇呢,我们来学下稍微高级一点的知识:  (1)如何在ElasticSearch中批量提交索引 ?  (2)...

Elasticsearch java API (17)Aggregations 聚合 函数

指标聚合编辑 分钟聚合编辑 下面是如何使用 Min Aggregation 与Java API。 准备聚合请求编辑 这里有一个例子关于如何创建聚合的要求:Met...

ElasticSearch之Java Api聚合分组实战

转自:http://qindongliang.iteye.com/blog/2289590#rd 最近有个日志收集监控的项目采用的技术栈是ELK+JAVA+Spring,客户端语言使用的是Java,以...

[Elasticsearch] 聚合 - 时间数据处理(Looking at Time)

本章翻译自Elasticsearch官方指南的Looking at Time一章。 时间数据处理(Looking at Time) 如果在ES中,搜索是最常见的行为,那么创...

ES 2.4 java API aggregation API

链接地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.4/_bucket_aggregations.html 聚合...
  • ata_123
  • ata_123
  • 2017年10月19日 11:56
  • 61

Elasticsearch分析聚合

Elasticsearch不仅仅适合做全文检索,分析聚合功能也很好用。下面通过实例来学习。一、准备数据{"index":{ "_index": "books", "_type": "IT", "_id...
  • napoay
  • napoay
  • 2016年12月06日 11:15
  • 5441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:elasticsearch学习(二)之Aggregations(聚合)
举报原因:
原因补充:

(最多只允许输入30个字)