Skip to content

Commit d25ff24

Browse files
jimczikcm
authored andcommitted
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 6ea2e5a commit d25ff24

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
@@ -93,7 +93,7 @@ public void collect(int doc, long bucket) throws IOException {
9393
if (includeExclude != null && !includeExclude.accept(bytes)) {
9494
continue;
9595
}
96-
if (previous.get().equals(bytes)) {
96+
if (i > 0 && previous.get().equals(bytes)) {
9797
continue;
9898
}
9999
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
@@ -158,13 +158,17 @@ public void testSimple() throws Exception {
158158
document.add(new SortedSetDocValuesField("string", new BytesRef("b")));
159159
indexWriter.addDocument(document);
160160
document = new Document();
161+
document.add(new SortedSetDocValuesField("string", new BytesRef("")));
161162
document.add(new SortedSetDocValuesField("string", new BytesRef("c")));
162163
document.add(new SortedSetDocValuesField("string", new BytesRef("a")));
163164
indexWriter.addDocument(document);
164165
document = new Document();
165166
document.add(new SortedSetDocValuesField("string", new BytesRef("b")));
166167
document.add(new SortedSetDocValuesField("string", new BytesRef("d")));
167168
indexWriter.addDocument(document);
169+
document = new Document();
170+
document.add(new SortedSetDocValuesField("string", new BytesRef("")));
171+
indexWriter.addDocument(document);
168172
try (IndexReader indexReader = maybeWrapReaderEs(indexWriter.getReader())) {
169173
IndexSearcher indexSearcher = newIndexSearcher(indexReader);
170174
for (TermsAggregatorFactory.ExecutionMode executionMode : TermsAggregatorFactory.ExecutionMode.values()) {
@@ -181,15 +185,17 @@ public void testSimple() throws Exception {
181185
indexSearcher.search(new MatchAllDocsQuery(), aggregator);
182186
aggregator.postCollection();
183187
Terms result = (Terms) aggregator.buildAggregation(0L);
184-
assertEquals(4, result.getBuckets().size());
185-
assertEquals("a", result.getBuckets().get(0).getKeyAsString());
188+
assertEquals(5, result.getBuckets().size());
189+
assertEquals("", result.getBuckets().get(0).getKeyAsString());
186190
assertEquals(2L, result.getBuckets().get(0).getDocCount());
187-
assertEquals("b", result.getBuckets().get(1).getKeyAsString());
191+
assertEquals("a", result.getBuckets().get(1).getKeyAsString());
188192
assertEquals(2L, result.getBuckets().get(1).getDocCount());
189-
assertEquals("c", result.getBuckets().get(2).getKeyAsString());
190-
assertEquals(1L, result.getBuckets().get(2).getDocCount());
191-
assertEquals("d", result.getBuckets().get(3).getKeyAsString());
193+
assertEquals("b", result.getBuckets().get(2).getKeyAsString());
194+
assertEquals(2L, result.getBuckets().get(2).getDocCount());
195+
assertEquals("c", result.getBuckets().get(3).getKeyAsString());
192196
assertEquals(1L, result.getBuckets().get(3).getDocCount());
197+
assertEquals("d", result.getBuckets().get(4).getKeyAsString());
198+
assertEquals(1L, result.getBuckets().get(4).getDocCount());
193199
}
194200
}
195201
}

0 commit comments

Comments
 (0)