Elasticsearch Java API 的使用(12)—度量聚合之一
度量聚合從文件中提取出來的值並進行計算。這些值通常從文件中的欄位(使用資料欄位)中提取出來,單也可以使用指令碼進行計算。
數字型度量聚合是一種特殊型別的度量聚合,輸出數字型的值。聚合輸出一個數字指標(例如平均值聚合)稱之為單值數字型度量聚合,產生多個指標值(例如統計聚合)稱之為多值數字型度量聚合。當這些聚合直接作為一些分組聚合的子聚合時,單值和多值數字型度量聚合的內容就會發揮巨大的作用。例如分組聚合可以對度量聚合後的返回的值進行排序。
- 最小值聚合
- 最大值聚合
- 平均值聚合
- 和聚合
- 值計數聚合
- 統計聚合
1、最小值聚合
最小值聚合一個單值度量聚合,它跟蹤並返回從聚合文件中提取的數值之間的最小值。這些值可以從文件中的特定數值欄位中提取,也可以由提供的指令碼生成。
Note
計算所有文件的最小价格值:
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();