ElasticSearch 的Bucket Aggregation 桶聚合(包含javaApi)
Global Aggregation
全局聚合,最頂級的聚合,無法嵌入到其他bucket聚合+
example:
POST /sales/_search?size=0
{
"query" : {
"match" : { "type" : "t-shirt" }
},
"aggs" : {
"all_products" : {
"global" : {},
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
},
"t_shirts": { "avg" : { "field" : "price" } }
}
}
result:
{
...
"aggregations" : {
"all_products" : {
"doc_count" : 7,
"avg_price" : {
"value" : 140.71428571428572
}
},
"t_shirts": {
"value" : 128.33333333333334
}
}
}
分析:global 查詢了上下文 所有文檔的 平均價格。avg_price 是為global 注冊的聚合。
javaApi:
\1. 創建聚合請求
AggregationBuilders
.global("agg")
.subAggregation(AggregationBuilders.terms("genders").field("gender"));
2.分析結果
// sr is here your SearchResponse object
Global agg = sr.getAggregations().get("agg");
agg.getDocCount(); // Doc count
Filter Aggregation
定義當前文檔集上下文中與指定篩選器匹配的所有文檔的單個桶。通常,這將用於將當前聚合上下文縮小到特定的一組文檔。
簡而言之 ,就是先查,再根據查到的再聚合。
example:
POST /sales/_search?size=0
{
"aggs" : {
"t_shirts" : {
"filter" : { "term": { "type": "t-shirt" } },
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}
}
{
...
"aggregations" : {
"t_shirts" : {
"doc_count" : 3,
"avg_price" : { "value" : 128.33333333333334 }
}
}
}
分析:我們計算了所有t恤類型產品的平均價格。
javaapi:
AggregationBuilders
.filter("agg", QueryBuilders.termQuery("gender", "male"));
Filters Aggregation
定義一個多桶聚合,其中每個桶與一個過濾器關聯。每個bucket將收集與其關聯的過濾器匹配的所有文檔。
簡而言之,先構建多個過濾器,再根據這些過濾器聚合。應用場景,如果你group by 后面的條件不僅僅是字段,而需要將字段中的各個值,重新分類,定義成不同的類型再group by,可以用這個聚合。
example
PUT /logs/message/_bulk?refresh
{ "index" : { "_id" : 1 } }
{ "body" : "warning: page could not be rendered" }
{ "index" : { "_id" : 2 } }
{ "body" : "authentication error" }
{ "index" : { "_id" : 3 } }
{ "body" : "warning: connection timed out" }
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"filters" : {
"errors" : { "match" : { "body" : "error" }},
"warnings" : { "match" : { "body" : "warning" }}
}
}
}
}
}
{
"took": 9,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": {
"errors": {
"doc_count": 1
},
"warnings": {
"doc_count": 2
}
}
}
}
}
javaapi:
request:
AggregationBuilder aggregation =
AggregationBuilders
.filters("agg",
new FiltersAggregator.KeyedFilter("men", QueryBuilders.termQuery("gender", "male")),
new FiltersAggregator.KeyedFilter("women", QueryBuilders.termQuery("gender", "female")));
response:
// sr is here your SearchResponse object
Filters agg = sr.getAggregations().get("agg");
// For each entry
for (Filters.Bucket entry : agg.getBuckets()) {
String key = entry.getKeyAsString(); // bucket key
long docCount = entry.getDocCount(); // Doc count
logger.info("key [{}], doc_count [{}]", key, docCount);
}
anonymous filters 匿名
詳情見官方文檔,就是filter字段可以用過濾器數組,不需要對過濾器命名
other bucket
可以將other_bucket參數設置為向響應添加一個bucket,該響應將包含與任何給定過濾器不匹配的所有文檔。
PUT logs/message/4?refresh
{
"body": "info: user Bob logged out"
}
GET logs/_search
{
"size": 0,
"aggs" : {
"messages" : {
"filters" : {
"other_bucket_key": "other_messages",
"filters" : {
"errors" : { "match" : { "body" : "error" }},
"warnings" : { "match" : { "body" : "warning" }}
}
}
}
}
}
{
"took": 3,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"messages": {
"buckets": {
"errors": {
"doc_count": 1
},
"warnings": {
"doc_count": 2
},
"other_messages": {
"doc_count": 1
}
}
}
}
}
Missing Aggregation 缺省聚合
一個基於字段數據的單桶聚合,它為當前文檔集 中缺少字段值 的所有文檔創建一個桶(實際上,缺少字段 或具有已配置的 空值集)。此聚合器通常 與其他字段 數據桶聚合器(例如范圍)一起使用,以返回由於缺少字段數據值 而無法放在任何其他桶中 的所有文檔的信息。簡而言之,就是可以將 為空值的數據 放到一個桶中。
POST /sales/_search?size=0
{
"aggs" : {
"products_without_a_price" : {
"missing" : { "field" : "price" }
}
}
}
{
...
"aggregations" : {
"products_without_a_price" : {
"doc_count" : 00
}
}
}
獲得沒有價格的產品總數,為0很正常,產品怎么會沒價格。
javaapi:
AggregationBuilders.missing("agg").field("gender");
分析結果,同上。
Nested Aggregation 嵌套聚合
一種特殊的單桶聚合,支持聚合嵌套文檔。
例如,假設我們有一個產品索引,每個產品都包含分銷商列表——每個分銷商都有自己的產品價格。映射可以是這樣的:
PUT /index
{
"mappings": {
"product" : {
"properties" : {
"resellers" : {
"type" : "nested",
"properties" : {
"name" : { "type" : "text" },
"price" : { "type" : "double" }
}
}
}
}
}
}
GET /_search
{
"query" : {
"match" : { "name" : "led tv" }
},
"aggs" : {
"resellers" : {
"nested" : {
"path" : "resellers"
},
"aggs" : {
"min_price" : { "min" : { "field" : "resellers.price" } }
}
}
}
}
正如您在上面看到的,嵌套聚合需要頂層文檔中的嵌套文檔的路徑。然后可以在這些嵌套文檔上定義任何類型的聚合。
聚合將返回可以購買產品的最低價格
javaapi:
AggregationBuilders
.nested("agg", "resellers");
分析結果同上。
Reverse Nested Aggregation 反轉嵌套聚合
一種特殊的單桶聚合,支持在嵌套文檔中 聚合父文檔。這種聚合可以有效地 跳出 嵌套塊結構,並鏈接到 其他嵌套結構 或根文檔,從而允許 將不屬於嵌套對象 的其他聚合 嵌套在 嵌套聚合中。
The reverse_nested
aggregation 必須被定義在 inside a nested
aggregation.
AggregationBuilder aggregation =
AggregationBuilders
.nested("agg", "resellers")
.subAggregation(
AggregationBuilders
.terms("name").field("resellers.name")
.subAggregation(
AggregationBuilders
.reverseNested("reseller_to_product")
)
);
// sr is here your SearchResponse object
Nested agg = sr.getAggregations().get("agg");
Terms name = agg.getAggregations().get("name");
for (Terms.Bucket bucket : name.getBuckets()) {
ReverseNested resellerToProduct = bucket.getAggregations().get("reseller_to_product");
resellerToProduct.getDocCount(); // Doc count
}
Children Aggregation 孩子子聚合
AggregationBuilder aggregation =
AggregationBuilders
.children("agg", "reseller");
Terms Aggregation 術語聚合
AggregationBuilders
.terms("genders")
.field("gender");
ORDER 排序
1.按桶的doc_count升序排序
AggregationBuilders
.terms("genders")
.field("gender")
.order(BucketOrder.count(true))
2.按桶的英文字母順序,按升序排列:
AggregationBuilders
.terms("genders")
.field("gender")
.order(BucketOrder.key(true))
3.按單值 度量子聚合 (由聚合名稱標識)對桶進行排序:
AggregationBuilders
.terms("genders")
.field("gender")
.order(BucketOrder.aggregation("avg_height", false))
.subAggregation(
AggregationBuilders.avg("avg_height").field("height")
)
4.按多個標准排序桶:
AggregationBuilders
.terms("genders")
.field("gender")
.order(BucketOrder.compound( // in order of priority:
BucketOrder.aggregation("avg_height", false), // sort by sub-aggregation first
BucketOrder.count(true))) // then bucket count as a tie-breaker
.subAggregation(
AggregationBuilders.avg("avg_height").field("height")
)
Significant Terms Aggregation 重要術語聚合
AggregationBuilder aggregation =
AggregationBuilders
.significantTerms("significant_countries")
.field("address.country");
// Let say you search for men only
SearchResponse sr = client.prepareSearch()
.setQuery(QueryBuilders.termQuery("gender", "male"))
.addAggregation(aggregation)
.get();
Range Aggregation 范圍聚合
AggregationBuilder aggregation =
AggregationBuilders
.range("agg")
.field("height")
.addUnboundedTo(1.0f) // from -infinity to 1.0 (excluded)
.addRange(1.0f, 1.5f) // from 1.0 to 1.5 (excluded)
.addUnboundedFrom(1.5f); // from 1.5 to +infinity
Date Range Aggregation 日期范圍聚合
AggregationBuilder aggregation =
AggregationBuilders
.dateRange("agg")
.field("dateOfBirth")
.format("yyyy")
.addUnboundedTo("1950") // from -infinity to 1950 (excluded)
.addRange("1950", "1960") // from 1950 to 1960 (excluded)
.addUnboundedFrom("1960"); // from 1960 to +infinity
Ip Range Aggregation IP范圍聚合
AggregatorBuilder<?> aggregation =
AggregationBuilders
.ipRange("agg")
.field("ip")
.addUnboundedTo("192.168.1.0") // from -infinity to 192.168.1.0 (excluded)
.addRange("192.168.1.0", "192.168.2.0") // from 192.168.1.0 to 192.168.2.0 (excluded)
.addUnboundedFrom("192.168.2.0"); // from 192.168.2.0 to +infinity
Histogram Aggregation 直方圖聚合
AggregationBuilder aggregation =
AggregationBuilders
.histogram("agg")
.field("height")
.interval(1);
Date Histogram Aggregation 日期直方圖句
AggregationBuilder aggregation =
AggregationBuilders
.dateHistogram("agg")
.field("dateOfBirth")
.dateHistogramInterval(DateHistogramInterval.YEAR);
或者你想要設置一個十天的間隔
AggregationBuilder aggregation =
AggregationBuilders
.dateHistogram("agg")
.field("dateOfBirth")
.dateHistogramInterval(DateHistogramInterval.days(10));
Geo Distance Aggregation 地理距離聚合
AggregationBuilder aggregation =
AggregationBuilders
.geoDistance("agg", new GeoPoint(48.84237171118314,2.33320027692004))
.field("address.location")
.unit(DistanceUnit.KILOMETERS)
.addUnboundedTo(3.0)
.addRange(3.0, 10.0)
.addRange(10.0, 500.0);
Geo Hash Grid Aggregation 地理哈希網格聚合
AggregationBuilder aggregation =
AggregationBuilders
.geohashGrid("agg")
.field("address.location")
.precision(4);
####################################
各聚合解釋可看官方文檔:文檔文檔
####################################
####################################
文章轉載自:https://blog.csdn.net/yusen0/article/details/89277768
####################################