Made all multi-bucket aggs return consistent response format
Closes #4926
This commit is contained in:
parent
f9d1552282
commit
dd389d1cc5
|
@ -111,19 +111,21 @@ Response:
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"articles_over_time": [
|
"articles_over_time": {
|
||||||
{
|
"buckets": [
|
||||||
"key_as_string": "2013-02-02",
|
{
|
||||||
"key": 1328140800000,
|
"key_as_string": "2013-02-02",
|
||||||
"doc_count": 1
|
"key": 1328140800000,
|
||||||
},
|
"doc_count": 1
|
||||||
{
|
},
|
||||||
"key_as_string": "2013-03-02",
|
{
|
||||||
"key": 1330646400000,
|
"key_as_string": "2013-03-02",
|
||||||
"doc_count": 2
|
"key": 1330646400000,
|
||||||
},
|
"doc_count": 2
|
||||||
...
|
},
|
||||||
]
|
...
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
|
@ -34,18 +34,20 @@ Response:
|
||||||
...
|
...
|
||||||
|
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"range": [
|
"range": {
|
||||||
{
|
"buckets": [
|
||||||
"to": 1.3437792E+12,
|
{
|
||||||
"to_as_string": "08-2012",
|
"to": 1.3437792E+12,
|
||||||
"doc_count": 7
|
"to_as_string": "08-2012",
|
||||||
},
|
"doc_count": 7
|
||||||
{
|
},
|
||||||
"from": 1.3437792E+12,
|
{
|
||||||
"from_as_string": "08-2012",
|
"from": 1.3437792E+12,
|
||||||
"doc_count": 2
|
"from_as_string": "08-2012",
|
||||||
}
|
"doc_count": 2
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
|
@ -28,24 +28,26 @@ Response:
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"rings": [
|
"rings" : {
|
||||||
{
|
"buckets": [
|
||||||
"unit": "km",
|
{
|
||||||
"to": 100.0,
|
"unit": "km",
|
||||||
"doc_count": 3
|
"to": 100.0,
|
||||||
},
|
"doc_count": 3
|
||||||
{
|
},
|
||||||
"unit": "km",
|
{
|
||||||
"from": 100.0,
|
"unit": "km",
|
||||||
"to": 300.0,
|
"from": 100.0,
|
||||||
"doc_count": 1
|
"to": 300.0,
|
||||||
},
|
"doc_count": 1
|
||||||
{
|
},
|
||||||
"unit": "km",
|
{
|
||||||
"from": 300.0,
|
"unit": "km",
|
||||||
"doc_count": 7
|
"from": 300.0,
|
||||||
}
|
"doc_count": 7
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
|
@ -34,20 +34,22 @@ And the following may be the response:
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"prices": [
|
"prices" : {
|
||||||
{
|
"buckets": [
|
||||||
"key": 0,
|
{
|
||||||
"doc_count": 2
|
"key": 0,
|
||||||
},
|
"doc_count": 2
|
||||||
{
|
},
|
||||||
"key": 50,
|
{
|
||||||
"doc_count": 4
|
"key": 50,
|
||||||
},
|
"doc_count": 4
|
||||||
{
|
},
|
||||||
"key": 150,
|
{
|
||||||
"doc_count": 3
|
"key": 150,
|
||||||
}
|
"doc_count": 3
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
@ -75,24 +77,26 @@ Response:
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"prices": [
|
"prices" : {
|
||||||
{
|
"buckets": [
|
||||||
"key": 0,
|
{
|
||||||
"doc_count": 2
|
"key": 0,
|
||||||
},
|
"doc_count": 2
|
||||||
{
|
},
|
||||||
"key": 50,
|
{
|
||||||
"doc_count": 4
|
"key": 50,
|
||||||
},
|
"doc_count": 4
|
||||||
{
|
},
|
||||||
"key" : 100,
|
{
|
||||||
"doc_count" : 0
|
"key" : 100,
|
||||||
},
|
"doc_count" : 0
|
||||||
{
|
},
|
||||||
"key": 150,
|
{
|
||||||
"doc_count": 3
|
"key": 150,
|
||||||
}
|
"doc_count": 3
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
@ -187,29 +191,31 @@ NOTE: The special value `0` can be used to add empty buckets to the response b
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"prices": {
|
"prices": {
|
||||||
"0": {
|
"buckets": {
|
||||||
"key": 0,
|
"0": {
|
||||||
"doc_count": 2
|
"key": 0,
|
||||||
},
|
"doc_count": 2
|
||||||
"50": {
|
},
|
||||||
"key": 50,
|
"50": {
|
||||||
"doc_count": 0
|
"key": 50,
|
||||||
},
|
"doc_count": 0
|
||||||
"150": {
|
},
|
||||||
"key": 150,
|
"150": {
|
||||||
"doc_count": 3
|
"key": 150,
|
||||||
},
|
"doc_count": 3
|
||||||
"200": {
|
},
|
||||||
"key": 150,
|
"200": {
|
||||||
"doc_count": 0
|
"key": 150,
|
||||||
},
|
"doc_count": 0
|
||||||
"250": {
|
},
|
||||||
"key": 150,
|
"250": {
|
||||||
"doc_count": 0
|
"key": 150,
|
||||||
},
|
"doc_count": 0
|
||||||
"300": {
|
},
|
||||||
"key": 150,
|
"300": {
|
||||||
"doc_count": 1
|
"key": 150,
|
||||||
|
"doc_count": 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,19 +248,21 @@ Response:
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"prices": {
|
"prices": {
|
||||||
"0": {
|
"buckets": {
|
||||||
"key": 0,
|
"0": {
|
||||||
"doc_count": 2
|
"key": 0,
|
||||||
},
|
"doc_count": 2
|
||||||
"50": {
|
},
|
||||||
"key": 50,
|
"50": {
|
||||||
"doc_count": 4
|
"key": 50,
|
||||||
},
|
"doc_count": 4
|
||||||
"150": {
|
},
|
||||||
"key": 150,
|
"150": {
|
||||||
"doc_count": 3
|
"key": 150,
|
||||||
|
"doc_count": 3
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
|
@ -30,18 +30,20 @@ Response:
|
||||||
...
|
...
|
||||||
|
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"ip_ranges": [
|
"ip_ranges":
|
||||||
{
|
"buckets" : [
|
||||||
"to": 167772165,
|
{
|
||||||
"to_as_string": "10.0.0.5",
|
"to": 167772165,
|
||||||
"doc_count": 4
|
"to_as_string": "10.0.0.5",
|
||||||
},
|
"doc_count": 4
|
||||||
{
|
},
|
||||||
"from": 167772165,
|
{
|
||||||
"from_as_string": "10.0.0.5",
|
"from": 167772165,
|
||||||
"doc_count": 6
|
"from_as_string": "10.0.0.5",
|
||||||
}
|
"doc_count": 6
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
@ -71,24 +73,26 @@ Response:
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"ip_ranges": [
|
"ip_ranges": {
|
||||||
{
|
"buckets": [
|
||||||
"key": "10.0.0.0/25",
|
{
|
||||||
"from": 1.6777216E+8,
|
"key": "10.0.0.0/25",
|
||||||
"from_as_string": "10.0.0.0",
|
"from": 1.6777216E+8,
|
||||||
"to": 167772287,
|
"from_as_string": "10.0.0.0",
|
||||||
"to_as_string": "10.0.0.127",
|
"to": 167772287,
|
||||||
"doc_count": 127
|
"to_as_string": "10.0.0.127",
|
||||||
},
|
"doc_count": 127
|
||||||
{
|
},
|
||||||
"key": "10.0.0.127/25",
|
{
|
||||||
"from": 1.6777216E+8,
|
"key": "10.0.0.127/25",
|
||||||
"from_as_string": "10.0.0.0",
|
"from": 1.6777216E+8,
|
||||||
"to": 167772287,
|
"from_as_string": "10.0.0.0",
|
||||||
"to_as_string": "10.0.0.127",
|
"to": 167772287,
|
||||||
"doc_count": 127
|
"to_as_string": "10.0.0.127",
|
||||||
}
|
"doc_count": 127
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
|
@ -31,21 +31,23 @@ Response:
|
||||||
...
|
...
|
||||||
|
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"price_ranges": [
|
"price_ranges" : {
|
||||||
{
|
"buckets": [
|
||||||
"to": 50,
|
{
|
||||||
"doc_count": 2
|
"to": 50,
|
||||||
},
|
"doc_count": 2
|
||||||
{
|
},
|
||||||
"from": 50,
|
{
|
||||||
"to": 100,
|
"from": 50,
|
||||||
"doc_count": 4
|
"to": 100,
|
||||||
},
|
"doc_count": 4
|
||||||
{
|
},
|
||||||
"from": 100,
|
{
|
||||||
"doc_count": 4
|
"from": 100,
|
||||||
}
|
"doc_count": 4
|
||||||
]
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
@ -81,19 +83,21 @@ Response:
|
||||||
...
|
...
|
||||||
|
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"price_ranges": {
|
"price_ranges" : {
|
||||||
"*-50.0": {
|
"buckets": {
|
||||||
"to": 50,
|
"*-50.0": {
|
||||||
"doc_count": 2
|
"to": 50,
|
||||||
},
|
"doc_count": 2
|
||||||
"50.0-100.0": {
|
},
|
||||||
"from": 50,
|
"50.0-100.0": {
|
||||||
"to": 100,
|
"from": 50,
|
||||||
"doc_count": 4
|
"to": 100,
|
||||||
},
|
"doc_count": 4
|
||||||
"100.0-*": {
|
},
|
||||||
"from": 100,
|
"100.0-*": {
|
||||||
"doc_count": 4
|
"from": 100,
|
||||||
|
"doc_count": 4
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,7 +132,7 @@ It is also possible to customize the key for each range:
|
||||||
{
|
{
|
||||||
"aggs" : {
|
"aggs" : {
|
||||||
"price_ranges" : {
|
"price_ranges" : {
|
||||||
"range" : {
|
"range" : {
|
||||||
"script" : "doc['price'].value",
|
"script" : "doc['price'].value",
|
||||||
"ranges" : [
|
"ranges" : [
|
||||||
{ "to" : 50 },
|
{ "to" : 50 },
|
||||||
|
@ -200,42 +204,44 @@ Response:
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
{
|
{
|
||||||
"aggregations": {
|
"aggregations": {
|
||||||
"price_ranges": [
|
"price_ranges" : {
|
||||||
{
|
"buckets": [
|
||||||
"to": 50,
|
{
|
||||||
"doc_count": 2,
|
"to": 50,
|
||||||
"price_stats": {
|
"doc_count": 2,
|
||||||
"count": 2,
|
"price_stats": {
|
||||||
"min": 20,
|
"count": 2,
|
||||||
"max": 47,
|
"min": 20,
|
||||||
"avg": 33.5,
|
"max": 47,
|
||||||
"sum": 67
|
"avg": 33.5,
|
||||||
|
"sum": 67
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": 50,
|
||||||
|
"to": 100,
|
||||||
|
"doc_count": 4,
|
||||||
|
"price_stats": {
|
||||||
|
"count": 4,
|
||||||
|
"min": 60,
|
||||||
|
"max": 98,
|
||||||
|
"avg": 82.5,
|
||||||
|
"sum": 330
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": 100,
|
||||||
|
"doc_count": 4,
|
||||||
|
"price_stats": {
|
||||||
|
"count": 4,
|
||||||
|
"min": 134,
|
||||||
|
"max": 367,
|
||||||
|
"avg": 216,
|
||||||
|
"sum": 864
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
]
|
||||||
{
|
}
|
||||||
"from": 50,
|
|
||||||
"to": 100,
|
|
||||||
"doc_count": 4,
|
|
||||||
"price_stats": {
|
|
||||||
"count": 4,
|
|
||||||
"min": 60,
|
|
||||||
"max": 98,
|
|
||||||
"avg": 82.5,
|
|
||||||
"sum": 330
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"from": 100,
|
|
||||||
"doc_count": 4,
|
|
||||||
"price_stats": {
|
|
||||||
"count": 4,
|
|
||||||
"min": 134,
|
|
||||||
"max": 367,
|
|
||||||
"avg": 216,
|
|
||||||
"sum": 864
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
|
@ -274,8 +274,8 @@ There are two mechanisms by which terms aggregations can be executed: either by
|
||||||
data per-bucket (`map`), or by using ordinals of the field values instead of the values themselves (`ordinals`). Although the
|
data per-bucket (`map`), or by using ordinals of the field values instead of the values themselves (`ordinals`). Although the
|
||||||
latter execution mode can be expected to be slightly faster, it is only available for use when the underlying data source exposes
|
latter execution mode can be expected to be slightly faster, it is only available for use when the underlying data source exposes
|
||||||
those terms ordinals. Moreover, it may actually be slower if most field values are unique. Elasticsearch tries to have sensible
|
those terms ordinals. Moreover, it may actually be slower if most field values are unique. Elasticsearch tries to have sensible
|
||||||
defaults when it comes to the execution mode that should be used, but in case you know that an execution mode may perform better
|
defaults when it comes to the execution mode that should be used, but in case you know that one execution mode may perform better
|
||||||
than the other one, you have the ability to provide Elasticsearch with a hint:
|
than the other one, you have the ability to "hint" it to Elasticsearch:
|
||||||
|
|
||||||
[source,js]
|
[source,js]
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
|
@ -363,10 +363,11 @@ public class InternalHistogram<B extends InternalHistogram.Bucket> extends Inter
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
|
builder.startObject(name);
|
||||||
if (keyed) {
|
if (keyed) {
|
||||||
builder.startObject(name);
|
builder.startObject(CommonFields.BUCKETS);
|
||||||
} else {
|
} else {
|
||||||
builder.startArray(name);
|
builder.startArray(CommonFields.BUCKETS);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (B bucket : buckets) {
|
for (B bucket : buckets) {
|
||||||
|
@ -396,7 +397,7 @@ public class InternalHistogram<B extends InternalHistogram.Bucket> extends Inter
|
||||||
} else {
|
} else {
|
||||||
builder.endArray();
|
builder.endArray();
|
||||||
}
|
}
|
||||||
return builder;
|
return builder.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -294,26 +294,27 @@ public class InternalRange<B extends InternalRange.Bucket> extends InternalAggre
|
||||||
out.writeDouble(((Bucket) bucket).from);
|
out.writeDouble(((Bucket) bucket).from);
|
||||||
out.writeDouble(((Bucket) bucket).to);
|
out.writeDouble(((Bucket) bucket).to);
|
||||||
out.writeVLong(((Bucket) bucket).docCount);
|
out.writeVLong(((Bucket) bucket).docCount);
|
||||||
((Bucket) bucket).aggregations.writeTo(out);
|
bucket.aggregations.writeTo(out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
|
builder.startObject(name);
|
||||||
if (keyed) {
|
if (keyed) {
|
||||||
builder.startObject(name);
|
builder.startObject(CommonFields.BUCKETS);
|
||||||
} else {
|
} else {
|
||||||
builder.startArray(name);
|
builder.startArray(CommonFields.BUCKETS);
|
||||||
}
|
}
|
||||||
for (B range : ranges) {
|
for (B range : ranges) {
|
||||||
((Bucket) range).toXContent(builder, params, formatter, keyed);
|
range.toXContent(builder, params, formatter, keyed);
|
||||||
}
|
}
|
||||||
if (keyed) {
|
if (keyed) {
|
||||||
builder.endObject();
|
builder.endObject();
|
||||||
} else {
|
} else {
|
||||||
builder.endArray();
|
builder.endArray();
|
||||||
}
|
}
|
||||||
return builder;
|
return builder.endObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue