Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added an option to show the upper bound of the error for the terms aggregation #6778

Closed

Conversation

Projects
None yet
3 participants
@colings86
Copy link
Member

colings86 commented Jul 8, 2014

...he terms aggregation.

This is only applicable when the order is set to _count. The upper bound of the error in the doc count is calculated by summing the doc count of the last term on each shard which did not return the term. The implementation calculates the error by summing the doc count for the last term on each shard for which the term IS returned and then subtracts this value from the sum of the doc counts for the last term from ALL shards.

Closes #6696

@colings86 colings86 added the review label Jul 8, 2014

@jpountz

View changes

docs/reference/search/aggregations/bucket/terms-aggregation.asciidoc Outdated
@@ -70,6 +70,9 @@ NOTE: `shard_size` cannot be smaller than `size` (as it doesn't make much sens
added[1.1.0] It is possible to not limit the number of terms that are returned by setting `size` to `0`. Don't use this
on high-cardinality fields as this will kill both your CPU since terms need to be return sorted, and your network.

coming[1.3.0] The `show_doc_count_error` parameter can be set to true when sorting by `doc_count` to show the upper bound
of the error in the document count for each term. This can be useful for deciding on an appropriate `shard_size` value.

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 10, 2014

Contributor

Any reason to have an option for it instead of returning it all the time? It doesn't seem to add much overhead to terms aggs?

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 10, 2014

Contributor

Oops sorry, I just realized that you are returning the error per bucket and not only for the whole agg! Maybe we should also have the max error for the whole aggregation, and this one would not be optional? I think this would help raise awareness that this aggregation in not accurate all the time?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
@@ -141,6 +143,7 @@ public void writeTo(StreamOutput out) throws IOException {
out.writeDouble(((Bucket) bucket).term);
out.writeVLong(bucket.getDocCount());
((InternalAggregations) bucket.getAggregations()).writeTo(out);
out.writeLong(bucket.docCountError);
}
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 10, 2014

Contributor

In these writeTo/readFrom methods, you need to make sure that you can talk to a node that is running an old version by adding checks on in/out.getVersion()

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
@@ -155,6 +158,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
builder.field(CommonFields.KEY_AS_STRING, formatter.format(((Bucket) bucket).term));
}
builder.field(CommonFields.DOC_COUNT, bucket.getDocCount());
if (showDocCountError) {
builder.field("error", bucket.getDocCountError());

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 10, 2014

Contributor

I think we should have a name that makes it clear that this error is an upper bound?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/LongTermsAggregator.java Outdated
if ((this.order == InternalOrder.COUNT_ASC || this.order == InternalOrder.COUNT_DESC) && list.length == bucketCountThresholds.getShardSize())
{
docCountError = list[list.length - 1].docCount;
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 10, 2014

Contributor

I don't think this works for COUNT_ASC? (and more precisely I think we could only give a very high upper bound for COUNT_ASC, so maybe we should have a special value to say that the error is unbounded, eg. -1?)

@jpountz

This comment has been minimized.

Copy link
Contributor

jpountz commented Jul 11, 2014

I just played with it and I think this is an interesting feature to raise awareness about the accuracy issues of the terms aggregation and although as a way to test the impact of the shard_size parameter. The per-term error is interesting, but I think the global error that you added is also interesting because it also gives information about terms that didn't make it to the top terms.

To move forward, I think it would be nice to have it on all sort orders (potentially by using a special value of eg. -1 when the maximum error cannot be estimated or would be so large that it would not be really useful).

@jpountz

This comment has been minimized.

Copy link
Contributor

jpountz commented Jul 11, 2014

On a side note, if it goes into release X, I think we should try to have another change in the same release that would change the default value of shard_size.

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
@@ -53,6 +56,10 @@ public long getDocCount() {
return docCount;
}

public long getDocCountError() {
return docCountError;

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 11, 2014

Contributor

should it throw an exception when show_term_doc_count is false?

@jpountz

View changes

src/test/java/org/elasticsearch/search/aggregations/bucket/StringTermsTests.java Outdated
@@ -149,6 +159,63 @@ public void singleValueField() throws Exception {
}

@Test
public void singleValueField_showTermDocCountError() throws Exception {
int size = randomIntBetween(5, 20);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 11, 2014

Contributor

maybe start at 1 instead of 5? I think it would expose even more the accuracy issues?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/TermsBuilder.java Outdated

@Override
protected XContentBuilder doInternalXContent(XContentBuilder builder, Params params) throws IOException {

bucketCountThresholds.toXContent(builder);

if (showTermDocCountError) {
builder.field("showTermDocCountError", true);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 11, 2014

Contributor

we usually prefer underscore case

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTermsAggregator.java Outdated
// Now build the aggs
for (int i = 0; i < list.length; i++) {
list[i].aggregations = bucketAggregations(list[i].bucketOrd);
}

list[i].docCountError = docCountError;

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 11, 2014

Contributor

I think it is a bit confusing to call it an error at that point since top counts would be accurate. Maybe it should remain 0 and then in the reduce phase the code would compute it based on the doc count of the last term?

@jpountz jpountz removed the review label Jul 11, 2014

@colings86

This comment has been minimized.

Copy link
Member Author

colings86 commented Jul 11, 2014

I largely agree although during my testing of this feature I have had quite a few situations where the error for the whole aggregation has been quite big relative to the doc count for the last returned term (e.g error of 3600 with a doc count for the last returned term of 5400) but the error on all of the terms was 0. This seems confusing for a user? Although maybe this just highlights the importance of clearly explaining the way the error is calculated and what it means?

Agree regarding your suggestions for moving forward and the issue around default shard size

@colings86 colings86 added the review label Jul 14, 2014

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
this.order = InternalOrder.Streams.readOrder(in);
this.formatter = ValueFormatterStreams.readOptional(in);
this.requiredSize = readSize(in);
this.shardSize = in.readInt();

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

This needs to be protected by a if (in.getVersion().onOrAfter(Version.V_1_3_0)) {

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

and maybe it should use the same readSize method as requiredSize?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
long bucketDocCountError = -1;
boolean showDocCountError = false;
if (in.getVersion().onOrAfter(Version.V_1_3_0)) {
showDocCountError = in.readBoolean();

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

Could we try to have this boolean serialized once for the whole agg instead of once per bucket?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
out.writeVLong(minDocCount);
out.writeVInt(buckets.size());
for (InternalTerms.Bucket bucket : buckets) {
out.writeDouble(((Bucket) bucket).term);
out.writeVLong(bucket.getDocCount());
if (out.getVersion().onOrAfter(Version.V_1_3_0)) {
out.writeBoolean(bucket.showDocCountError);
out.writeLong(bucket.docCountError);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

Maybe we should try to use a vLong? 8 bytes per bucket can be significant if there are lots of buckets

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTermsAggregator.java Outdated
@@ -44,11 +44,13 @@
private final ValueFormatter formatter;
private final LongHash bucketOrds;
private DoubleValues values;
private boolean showTermDocCountError;

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

can it be final?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
@@ -36,16 +37,23 @@
*/
public abstract class InternalTerms extends InternalAggregation implements Terms, ToXContent, Streamable {

protected static final String ERROR_UPPER_BOUND_FIELD_NAME = "error_upper_bound";

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

maybe the name should contain doc_count to make clear what it applies to

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
@@ -53,6 +61,13 @@ public long getDocCount() {
return docCount;
}

public long getDocCountError() {
if (!showDocCountError) {
throw new ElasticsearchIllegalStateException("showDocCountError is false");

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

can you use underscore_case as this will also be rendered in json responses in case of errors?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
else
{
thisAggDocCountError = -1;
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

Should it set thisAggDocCountError to 0 when terms.buckets.size() is less than shard_size?

This comment has been minimized.

Copy link
@colings86

colings86 Jul 16, 2014

Author Member

I think so. If the shard has returned less buckets than we asked for then we know that the shard cannot contribute to the overall docCountError.

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
if (sumDocCountError == -1) {
docCountError = -1;
} else {
docCountError = sumDocCountError - minDocCountError;

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

That is what I thought would be the right formula in the beginning but I don't think it works for terms that are not part of the final results. Eg, imagine the following shard counts and a size of 2.

Shard 1: A:3, B:2, C:2
Shard 2: B:3, A:2, C:2

Result: A:5, B:5 and the upper bound on the error would be 2 + 2 - 2 = 2. However, the error on C is 4. I'm wondering if we want to return both (max error on terms that are in the top terms, and max potential count of a missing term) but maybe that is too complicated. What do you think?

This comment has been minimized.

Copy link
@colings86

colings86 Jul 16, 2014

Author Member

I think having both will be confusing. The max error for terms in the top terms gives you an idea of why the returned terms are in the order they are and how out of order they might be (arguably this is better served by the per term error). The max potential count of a missing term helps you understand why a term might have been included in place of another one and how close to dropping off the end the last term was. I personally think information about the missing term would be more useful as I think generally the absolute ordering of the results is less important than understanding why a result is not in the list at all.

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 21, 2014

Contributor

+1

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/LongTerms.java Outdated
this.order = InternalOrder.Streams.readOrder(in);
this.formatter = ValueFormatterStreams.readOptional(in);
this.requiredSize = readSize(in);
this.shardSize = in.readInt();

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

version check

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/LongTerms.java Outdated
InternalOrder.Streams.writeOrder(order, out);
ValueFormatterStreams.writeOptional(formatter, out);
writeSize(requiredSize, out);
out.writeInt(shardSize);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

version check

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/StringTerms.java Outdated
this.order = InternalOrder.Streams.readOrder(in);
this.requiredSize = readSize(in);
this.shardSize = in.readInt();

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

version check

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/StringTerms.java Outdated
InternalOrder.Streams.writeOrder(order, out);
writeSize(requiredSize, out);
out.writeInt(shardSize);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

version

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/TermsBuilder.java Outdated

@Override
protected XContentBuilder doInternalXContent(XContentBuilder builder, Params params) throws IOException {

bucketCountThresholds.toXContent(builder);

if (showTermDocCountError) {
builder.field("show_term_doc_count_error", true);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

maybe we should have a constant for it

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

oh, we already have SHOW_TERM_DOC_COUNT_ERROR, can we reuse it here?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/UnmappedTerms.java Outdated
@@ -67,6 +66,7 @@ public Type type() {
@Override
public void readFrom(StreamInput in) throws IOException {
this.name = in.readString();
this.docCountError = in.readLong();

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

do we really need it on unmapped terms? It would always be 0?

assertThat(accurateBucket, notNullValue());
assertThat(accurateBucket.getDocCountError(), equalTo(0l));
assertThat(testBucket.getDocCountError(), equalTo(0l));
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

This part of the test is very similar across tests, maybe we should try to share it?

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 16, 2014

Contributor

Also maybe we should assert on the doc counts of terms that are in the accurate response but not in the tested one?

This comment has been minimized.

Copy link
@colings86

colings86 Jul 16, 2014

Author Member

Do you mean check that the doc count error is 0 for all buckets in the accurate response?

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 21, 2014

Contributor

I mean that if a term is in the accurate response but not in the accurate one, we should assert that the count in the accurate response is less than the agg-level error margin on the inaccurate one

@jpountz jpountz removed the review label Jul 16, 2014

@jpountz

View changes

docs/reference/search/aggregations/bucket/terms-aggregation.asciidoc Outdated
enough to put Product C into the top 5 list for that shard. Product Z was also returned only by 2 shards but the third shard does not contain the
term. There is no way of knowing, at the point of combining the results to produce the final list of terms, that there is an error in the
document count for Product C and not for Product Z. Product H has a document count of 44 across all 3 shards but was not included in the final
list of terms because it did not make it into the top five terms on any of the shards.

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

That section is really great!

@jpountz

View changes

docs/reference/search/aggregations/bucket/terms-aggregation.asciidoc Outdated
@@ -70,6 +148,81 @@ NOTE: `shard_size` cannot be smaller than `size` (as it doesn't make much sens
added[1.1.0] It is possible to not limit the number of terms that are returned by setting `size` to `0`. Don't use this
on high-cardinality fields as this will kill both your CPU since terms need to be return sorted, and your network.

==== Calculating Document Count Error

coming[1.3.0]

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

This would be 1.4.0 now

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
this.order = InternalOrder.Streams.readOrder(in);
this.formatter = ValueFormatterStreams.readOptional(in);
this.requiredSize = readSize(in);
if (in.getVersion().onOrAfter(Version.V_1_3_0)) {

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

1.4

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
out.writeVLong(minDocCount);
out.writeVInt(buckets.size());
for (InternalTerms.Bucket bucket : buckets) {
out.writeDouble(((Bucket) bucket).term);
out.writeVLong(bucket.getDocCount());
if (out.getVersion().onOrAfter(Version.V_1_3_0)) {
out.writeLong(bucket.docCountError);

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

Can we try to only write it when it is requested?

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

ie. when showTermDocCountError is true

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
thisAggDocCountError = 0;
}
else if (this.order == InternalOrder.COUNT_DESC)
{

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

For style consistency, can you put opening brackets at ends of line?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/LongTerms.java Outdated
}

@Override
public void readFrom(StreamInput in) throws IOException {
this.name = in.readString();
if (in.getVersion().onOrAfter(Version.V_1_3_0)) {

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

1.4

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/LongTerms.java Outdated
long term = in.readLong();
long docCount = in.readVLong();
long bucketDocCountError = -1;
if (in.getVersion().onOrAfter(Version.V_1_3_0)) {

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

1.4

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTerms.java Outdated
this.shardSize = readSize(in);
this.showTermDocCountError = in.readBoolean();
} else {
this.shardSize = Integer.MAX_VALUE;

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

Hmm, I though this would be the safe side, but it would always return an error of 0? Maybe the safe side should rather be to set shardSize to requiredSize?

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/TermsBuilder.java Outdated
@@ -43,6 +43,8 @@
private String executionHint;
private SubAggCollectionMode collectionMode;

private boolean showTermDocCountError;

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

In order to care about the defaults in a single place, we usually prefer using Boolean in the builders, with null meaning unset.

This way, if we want to change the default to true in the future, we only need to do it in the parser (not in the builder).

@jpountz

View changes

src/test/java/org/elasticsearch/search/aggregations/bucket/SignificantTermsTests.java Outdated
@@ -316,7 +316,7 @@ public void testDefaultSignificanceHeuristic() throws Exception {
assertSearchResponse(response);
SignificantTerms topTerms = response.getAggregations().get("mySignificantTerms");
checkExpectedStringTermsFound(topTerms);
}
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

Indentation

@jpountz

View changes

src/test/java/org/elasticsearch/search/aggregations/bucket/StringTermsTests.java Outdated
.startObject()
.field(SINGLE_VALUED_FIELD_NAME, "val" + randomInt(numUniqueTerms))
.endObject()));
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 24, 2014

Contributor

doesn't look used?

@jpountz

This comment has been minimized.

Copy link
Contributor

jpountz commented Jul 24, 2014

I think long is ok if we can avoid serializing the errors when show_term_doc_count_error is false.

I left some comments, but I think it's close!

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/DoubleTermsAggregator.java Outdated
collectExistingBucket(doc, bucketOrdinal);
} else {
collectBucket(doc, bucketOrdinal);
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 25, 2014

Contributor

indentation issue

@jpountz

View changes

.../org/elasticsearch/search/aggregations/bucket/terms/GlobalOrdinalsStringTermsAggregator.java Outdated
@@ -88,7 +88,7 @@ protected Collector newCollector(final RandomAccessOrds ords) {
final SortedDocValues singleValues = DocValues.unwrapSingleton(ords);
if (singleValues != null) {
return new Collector() {
@Override
@Override

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 25, 2014

Contributor

indentation

@jpountz

View changes

.../org/elasticsearch/search/aggregations/bucket/terms/GlobalOrdinalsStringTermsAggregator.java Outdated
@@ -126,7 +126,7 @@ public void setNextReader(AtomicReaderContext reader) {
public void collect(int doc, long owningBucketOrdinal) throws IOException {
assert owningBucketOrdinal == 0;
collector.collect(doc);
}
}

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 25, 2014

Contributor

indentation

@jpountz

View changes

.../org/elasticsearch/search/aggregations/bucket/terms/GlobalOrdinalsStringTermsAggregator.java Outdated
@@ -258,7 +260,7 @@ protected Collector newCollector(final RandomAccessOrds ords) {
final SortedDocValues singleValues = DocValues.unwrapSingleton(ords);
if (singleValues != null) {
return new Collector() {
@Override
@Override

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 25, 2014

Contributor

indentation

@jpountz

View changes

src/main/java/org/elasticsearch/search/aggregations/bucket/terms/InternalTerms.java Outdated
@@ -124,6 +175,14 @@ public InternalAggregation reduce(ReduceContext reduceContext) {
for (Collection<Bucket> l : buckets.asMap().values()) {
List<Bucket> sameTermBuckets = (List<Bucket>) l; // cast is ok according to javadocs
final Bucket b = sameTermBuckets.get(0).reduce(sameTermBuckets, reduceContext.bigArrays());
if (b.docCountError != -1)
{

This comment has been minimized.

Copy link
@jpountz

jpountz Jul 25, 2014

Contributor

can you put in on the previous line?

@jpountz

This comment has been minimized.

Copy link
Contributor

jpountz commented Jul 25, 2014

LGTM but can you fix indentation issues and trailing spaces that have been added on some lines before pushing?

@jpountz jpountz removed the review label Jul 25, 2014

Aggregations: Added an option to show the upper bound of the error fo…
…r the terms aggregation.

This is only applicable when the order is set to _count.  The upper bound of the error in the doc count is calculated by summing the doc count of the last term on each shard which did not return the term.  The implementation calculates the error by summing the doc count for the last term on each shard for which the term IS returned and then subtracts this value from the sum of the doc counts for the last term from ALL shards.

Closes #6696
@colings86

This comment has been minimized.

Copy link
Member Author

colings86 commented Jul 25, 2014

Merged into 1.x and master

@colings86 colings86 closed this Jul 25, 2014

@colings86 colings86 self-assigned this Aug 21, 2014

@clintongormley clintongormley changed the title Aggregations: Added an option to show the upper bound of the error for t... Aggregations: Added an option to show the upper bound of the error for the terms aggregation Sep 11, 2014

@clintongormley clintongormley changed the title Aggregations: Added an option to show the upper bound of the error for the terms aggregation Added an option to show the upper bound of the error for the terms aggregation Jun 7, 2015

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.