Skip to content

Commit 27c31fa

Browse files
authored
Terms aggs that run as filters ignore shard_min_doc_count (#69323)
This change handles `shard_min_doc_count` for terms aggregation that run as filters. Closes #69312
1 parent 914a85a commit 27c31fa

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

server/src/main/java/org/elasticsearch/search/aggregations/bucket/terms/StringTermsAggregatorFromFilters.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ protected boolean lessThan(OrdBucket a, OrdBucket b) {
159159
};
160160
OrdBucket spare = null;
161161
for (InternalFilters.InternalBucket b : filters.getBuckets()) {
162+
if (b.getDocCount() < bucketCountThresholds.getShardMinDocCount()) {
163+
continue;
164+
}
162165
if (spare == null) {
163166
spare = new OrdBucket(showTermDocCountError, format);
164167
} else {
@@ -194,6 +197,9 @@ protected boolean lessThan(OrdBucket a, OrdBucket b) {
194197
} else {
195198
buckets = new ArrayList<>(filters.getBuckets().size());
196199
for (InternalFilters.InternalBucket b : filters.getBuckets()) {
200+
if (b.getDocCount() < bucketCountThresholds.getShardMinDocCount()) {
201+
continue;
202+
}
197203
buckets.add(buildBucket(b));
198204
}
199205
Collections.sort(buckets, reduceOrder.comparator());

server/src/test/java/org/elasticsearch/search/aggregations/bucket/terms/TermsAggregatorTests.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
import java.io.IOException;
103103
import java.net.InetAddress;
104104
import java.util.ArrayList;
105+
import java.util.Arrays;
105106
import java.util.Collections;
106107
import java.util.Comparator;
107108
import java.util.HashMap;
@@ -258,6 +259,33 @@ public void testSimple() throws Exception {
258259
}, fieldType);
259260
}
260261

262+
public void testStringShardMinDocCount() throws IOException {
263+
MappedFieldType fieldType = new KeywordFieldMapper.KeywordFieldType("string", true, true, null);
264+
for (TermsAggregatorFactory.ExecutionMode executionMode : TermsAggregatorFactory.ExecutionMode.values()) {
265+
TermsAggregationBuilder aggregationBuilder = new TermsAggregationBuilder("_name")
266+
.field("string")
267+
.executionHint(executionMode.toString())
268+
.size(2)
269+
.minDocCount(2)
270+
.shardMinDocCount(2)
271+
.order(BucketOrder.key(true));
272+
testCase(aggregationBuilder, new MatchAllDocsQuery(), iw -> {
273+
// force single shard/segment
274+
iw.addDocuments(Arrays.asList(
275+
doc(fieldType, "a", "b"),
276+
doc(fieldType, "", "c", "d"),
277+
doc(fieldType, "b", "d"),
278+
doc(fieldType, "b")));
279+
}, (InternalTerms<?, ?> result) -> {
280+
assertEquals(2, result.getBuckets().size());
281+
assertEquals("b", result.getBuckets().get(0).getKeyAsString());
282+
assertEquals(3L, result.getBuckets().get(0).getDocCount());
283+
assertEquals("d", result.getBuckets().get(1).getKeyAsString());
284+
assertEquals(2L, result.getBuckets().get(1).getDocCount());
285+
}, fieldType);
286+
}
287+
}
288+
261289
public void testManyUniqueTerms() throws Exception {
262290
MappedFieldType fieldType = new KeywordFieldMapper.KeywordFieldType("string", randomBoolean(), true, null);
263291
TermsAggregationBuilder aggregationBuilder = new TermsAggregationBuilder("_name")

0 commit comments

Comments
 (0)