diff --git a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregator.java b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregator.java index b35af7440870d..af95211a51b53 100644 --- a/server/src/main/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregator.java +++ b/server/src/main/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregator.java @@ -146,15 +146,13 @@ public void doClose() { public static double computeMAD(TDigestState valuesSketch) { final double approximateMedian = valuesSketch.quantile(0.5); - final TDigestState approximateDeviationsSketch = new TDigestState(valuesSketch.compression()); + final TDigestState approximatedDeviationsSketch = new TDigestState(valuesSketch.compression()); - for (int i = 1; i < 1000; i++) { - final double percentile = i / 1000d; - final double percentileValue = valuesSketch.quantile(percentile); - final double deviation = Math.abs(approximateMedian - percentileValue); - approximateDeviationsSketch.add(deviation); - } + valuesSketch.centroids().forEach(centroid -> { + final double deviation = Math.abs(approximateMedian - centroid.mean()); + approximatedDeviationsSketch.add(deviation, centroid.count()); + }); - return approximateDeviationsSketch.quantile(0.5); + return approximatedDeviationsSketch.quantile(0.5); } } diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregatorTests.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregatorTests.java index 5b126a0a518d8..97713ecc12e65 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregatorTests.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MADAggregatorTests.java @@ -149,7 +149,8 @@ private void testCase(Query query, IndexSearcher indexSearcher = newSearcher(indexReader, true, true); MADAggregationBuilder builder = new MADAggregationBuilder("mad") - .field("number"); + .field("number") + .setCompression(randomDoubleBetween(20, 1000, true)); MappedFieldType fieldType = new NumberFieldMapper.NumberFieldType(NumberFieldMapper.NumberType.LONG); fieldType.setName("number"); diff --git a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MedianAbsoluteDeviationIT.java b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MedianAbsoluteDeviationIT.java index 3dbd1f49d79f2..44a50a793c1cf 100644 --- a/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MedianAbsoluteDeviationIT.java +++ b/server/src/test/java/org/elasticsearch/search/aggregations/metrics/mad/MedianAbsoluteDeviationIT.java @@ -150,7 +150,7 @@ protected Collection> nodePlugins() { private static MADAggregationBuilder randomBuilder() { final MADAggregationBuilder builder = new MADAggregationBuilder("mad"); if (randomBoolean()) { - builder.setCompression(randomDoubleBetween(0, 1000, false)); + builder.setCompression(randomDoubleBetween(20, 1000, false)); } return builder; }