1. 程式人生 > >Elasticsearch Java API 的使用(12)—度量聚合之一

Elasticsearch Java API 的使用(12)—度量聚合之一

度量聚合從文件中提取出來的值並進行計算。這些值通常從文件中的欄位(使用資料欄位)中提取出來,單也可以使用指令碼進行計算。
數字型度量聚合是一種特殊型別的度量聚合,輸出數字型的值。聚合輸出一個數字指標(例如平均值聚合)稱之為單值數字型度量聚合,產生多個指標值(例如統計聚合)稱之為多值數字型度量聚合。當這些聚合直接作為一些分組聚合的子聚合時,單值和多值數字型度量聚合的內容就會發揮巨大的作用。例如分組聚合可以對度量聚合後的返回的值進行排序。

  1. 最小值聚合
  2. 最大值聚合
  3. 平均值聚合
  4. 和聚合
  5. 值計數聚合
  6. 統計聚合
1、最小值聚合

最小值聚合一個單值度量聚合,它跟蹤並返回從聚合文件中提取的數值之間的最小值。這些值可以從文件中的特定數值欄位中提取,也可以由提供的指令碼生成。
Note

:最小和最大聚合操作資料的雙重表示。因此,當其絕對值大於2×53時,其結果可能是近似的。
計算所有文件的最小价格值:

POST /sales/_search?size=0
{
    "aggs" : {
        "min_price" : { "min" : { "field" : "price" } }
    }
}

返回值:

{
    ...

    "aggregations": {
        "min_price": {"value": 10.0}           //聚合返回的名稱
    }
}

可以看出,聚合的名稱(min_price以上)也作為關鍵字在響應的結果中返回。
Java API呼叫


匯入聚合定義類:

import org.elasticsearch.search.aggregations.metrics.min.Min;

下面是一個如何建立聚合請求的示例:

MinAggregationBuilder aggregation = AggregationBuilders
                .min("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
                .setTypes(typeName);
srb.addAggregation(aggregation);

SearchResponse response =  srb.execute().actionGet();

Min agg = response.getAggregations().get("agg"
); double value = agg.getValue();
2、最大值聚合

最大值一個單值度量聚合,它跟蹤並返回從聚合文件中提取的數值之間的最大值。這些值可以從文件中的特定數值欄位中提取,也可以由提供的指令碼生成。
Note:最小和最大聚合操作資料的雙重表示。因此,當其絕對值大於2×53時,其結果可能是近似的。
計算所有文件的最大價格值:

POST /sales/_search?size=0
{
    "aggs" : {
        "max_price" : { "max" : { "field" : "price" } }
    }
}

返回值:

{
    ...
    "aggregations": {
        "max_price": {"value": 200.0}         //聚合返回的名稱
    }
}

可以看出,聚合的名稱(max_price以上)也作為關鍵字在響應的結果中返回。
Java API呼叫
匯入聚合定義類:

import org.elasticsearch.search.aggregations.metrics.max.Max;

下面是一個如何建立聚合請求的示例:

MaxAggregationBuilder aggregation = AggregationBuilders
                .max("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
                .setTypes(typeName);
srb.addAggregation(aggregation);

SearchResponse response =  srb.execute().actionGet();

Max agg = response.getAggregations().get("agg");
double value = agg.getValue();
3、平均值聚合

統計聚合是計算彙總文件中提取的數值平均值的單個值度量彙總。這些值可以從文件中的特定數值欄位中提取,也可以由提供的指令碼生成。
假設資料由代表考試成績的檔案組成(學生在0到100之間),我們可以用分數來表示他們的分數:

POST /exams/_search?size=0
{
    "aggs" : {
        "avg_grade" : { "avg" : { "field" : "grade" } }
    }
}

以上聚合計算所有文件的平均級別。聚合型別為AVG,欄位設定定義文件的數值欄位,平均值將計算在。以上將返回以下內容:

{
    ...
    "aggregations": {
        "avg_grade": {"value": 75.0}
    }
}

可以看出,聚合的名稱(avg_grade以上)也作為關鍵字在響應的結果中返回。
Java API呼叫
匯入聚合定義類:

import org.elasticsearch.search.aggregations.metrics.avg.Avg;

下面是一個如何建立聚合請求的示例:

AvgAggregationBuilder aggregation = AggregationBuilders
                .avg("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
                .setTypes(typeName);
srb.addAggregation(aggregation);

SearchResponse response =  srb.execute().actionGet();

Avg agg = response.getAggregations().get("agg");
double value = agg.getValue();
4、和聚合

和聚合是彙總彙總文件中提取的數值的單值度量彙總。這些值可以從文件中的特定數值欄位中提取,也可以由提供的指令碼生成。
假設資料由代表銷售記錄的檔案組成,我們可以將所有帽子的銷售價格與:

POST /sales/_search?size=0
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "match" : { "type" : "hat" }
            }
        }
    },
    "aggs" : {
        "hat_prices" : { "sum" : { "field" : "price" } }
    }
}

返回值:

{
    ...
    "aggregations": {
        "hat_prices": {"value": 450.0}
    }
}

可以看出,聚合的名稱(intraday_return以上)也作為關鍵字在響應的結果中返回。
Java API呼叫
匯入聚合定義類:

import org.elasticsearch.search.aggregations.metrics.sum.Sum;

下面是一個如何建立聚合請求的示例:

SumAggregationBuilder aggregation = AggregationBuilders
                .sum("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
                .setTypes(typeName);
srb.addAggregation(aggregation);

SearchResponse response =  srb.execute().actionGet();

Sum agg = response.getAggregations().get("agg");
double value = agg.getValue();
5、值計數聚合

值計數聚合是一個單值度量聚合,它計算從聚合文件中提取的值的數量。這些值可以從文件中的特定欄位中提取,也可以由提供的指令碼生成。通常情況下,這個集合將用於與其他單值聚集一起。
例如,在計算AVG時,可能會對平均值的計算數感興趣。

POST /sales/_search?size=0
{
    "aggs" : {
        "types_count" : { "value_count" : { "field" : "type" } }
    }
}

返回值:

{
    ...
    "aggregations": {
        "types_count": {"value": 7}
    }
}

可以看出,聚合的名稱(types_count以上)也作為關鍵字在響應的結果中返回。
Java API呼叫
匯入聚合定義類:

import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount;

下面是一個如何建立聚合請求的示例:

ValueCountAggregationBuilder aggregation = AggregationBuilders
                .count("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
                .setTypes(typeName);
srb.addAggregation(aggregation);

SearchResponse response =  srb.execute().actionGet();

ValueCount agg = response.getAggregations().get("agg");
long value = agg.getValue();
5、統計聚合

統計聚合一個多值度量聚合,對聚合文件中提起的數字型計算進行統計。這些值可以從文件中的特定欄位中提取,也可以由提供的指令碼生成。通常情況下,這個集合將用於與其他單值聚集一起。
例如,在計算AVG時,可能會對平均值的計算數感興趣。

POST /sales/_search?size=0
{
    "aggs" : {
        "grades_stats" : { "stats" : { "field" : "grade" } }
    }
}

以上聚合計算所有文件的等級統計資訊。聚合型別是統計資料,欄位設定定義了統計資料將被計算的文件的數值欄位。以上將返回以下內容:

{
    ...

    "aggregations": {
        "grades_stats": {
            "count": 2,
            "min": 50.0,
            "max": 100.0,
            "avg": 75.0,
            "sum": 150.0
        }
    }
}

可以看出,聚合的名稱(grades_stats以上)也作為關鍵字在響應的結果中返回。
Java API呼叫
匯入聚合定義類:

import org.elasticsearch.search.aggregations.metrics.stats.Stats;

下面是一個如何建立聚合請求的示例:

StatsAggregationBuilder aggregation = AggregationBuilders
                .stats("agg")
                .field("height");
SearchRequestBuilder srb = client.prepareSearch(indexName)
                .setTypes(typeName);
srb.addAggregation(aggregation);

SearchResponse response =  srb.execute().actionGet();

// sr is here your SearchResponse object
Stats agg = response.getAggregations().get("agg");
double min = agg.getMin();
double max = agg.getMax();
double avg = agg.getAvg();
double sum = agg.getSum();
long count = agg.getCount();