Skip to content

Commit 94570dd

Browse files
committed
Fix handling of empty keyword in terms aggregation (#34457)
Empty values on keyword fields are filtered by the `map` execution mode of the `terms` aggregation. This commit restores them as valid buckets. Closes #34434
1 parent 566aaba commit 94570dd

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void collect(int doc, long bucket) throws IOException {
8989
if (includeExclude != null && !includeExclude.accept(bytes)) {
9090
continue;
9191
}
92-
if (previous.get().equals(bytes)) {
92+
if (i > 0 && previous.get().equals(bytes)) {
9393
continue;
9494
}
9595
long bucketOrdinal = bucketOrds.add(bytes);

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,17 @@ public void testSimple() throws Exception {
152152
document.add(new SortedSetDocValuesField("string", new BytesRef("b")));
153153
indexWriter.addDocument(document);
154154
document = new Document();
155+
document.add(new SortedSetDocValuesField("string", new BytesRef("")));
155156
document.add(new SortedSetDocValuesField("string", new BytesRef("c")));
156157
document.add(new SortedSetDocValuesField("string", new BytesRef("a")));
157158
indexWriter.addDocument(document);
158159
document = new Document();
159160
document.add(new SortedSetDocValuesField("string", new BytesRef("b")));
160161
document.add(new SortedSetDocValuesField("string", new BytesRef("d")));
161162
indexWriter.addDocument(document);
163+
document = new Document();
164+
document.add(new SortedSetDocValuesField("string", new BytesRef("")));
165+
indexWriter.addDocument(document);
162166
try (IndexReader indexReader = maybeWrapReaderEs(indexWriter.getReader())) {
163167
IndexSearcher indexSearcher = newIndexSearcher(indexReader);
164168
for (TermsAggregatorFactory.ExecutionMode executionMode : TermsAggregatorFactory.ExecutionMode.values()) {
@@ -175,15 +179,17 @@ public void testSimple() throws Exception {
175179
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
176180
aggregator.postCollection();
177181
Terms result = (Terms) aggregator.buildAggregation(0L);
178-
assertEquals(4, result.getBuckets().size());
179-
assertEquals("a", result.getBuckets().get(0).getKeyAsString());
182+
assertEquals(5, result.getBuckets().size());
183+
assertEquals("", result.getBuckets().get(0).getKeyAsString());
180184
assertEquals(2L, result.getBuckets().get(0).getDocCount());
181-
assertEquals("b", result.getBuckets().get(1).getKeyAsString());
185+
assertEquals("a", result.getBuckets().get(1).getKeyAsString());
182186
assertEquals(2L, result.getBuckets().get(1).getDocCount());
183-
assertEquals("c", result.getBuckets().get(2).getKeyAsString());
184-
assertEquals(1L, result.getBuckets().get(2).getDocCount());
185-
assertEquals("d", result.getBuckets().get(3).getKeyAsString());
187+
assertEquals("b", result.getBuckets().get(2).getKeyAsString());
188+
assertEquals(2L, result.getBuckets().get(2).getDocCount());
189+
assertEquals("c", result.getBuckets().get(3).getKeyAsString());
186190
assertEquals(1L, result.getBuckets().get(3).getDocCount());
191+
assertEquals("d", result.getBuckets().get(4).getKeyAsString());
192+
assertEquals(1L, result.getBuckets().get(4).getDocCount());
187193
}
188194
}
189195
}

0 commit comments

Comments
 (0)