|
34 | 34 | import org.apache.lucene.document.BinaryDocValuesField;
|
35 | 35 | import org.apache.lucene.document.Document;
|
36 | 36 | import org.apache.lucene.document.Field;
|
| 37 | +import org.apache.lucene.document.FieldType; |
37 | 38 | import org.apache.lucene.document.InetAddressPoint;
|
38 | 39 | import org.apache.lucene.document.LatLonDocValuesField;
|
39 | 40 | import org.apache.lucene.document.NumericDocValuesField;
|
|
42 | 43 | import org.apache.lucene.document.SortedSetDocValuesField;
|
43 | 44 | import org.apache.lucene.document.StringField;
|
44 | 45 | import org.apache.lucene.index.DirectoryReader;
|
| 46 | +import org.apache.lucene.index.DocValuesType; |
| 47 | +import org.apache.lucene.index.IndexOptions; |
45 | 48 | import org.apache.lucene.index.IndexReader;
|
46 | 49 | import org.apache.lucene.index.IndexableField;
|
47 | 50 | import org.apache.lucene.index.NoMergePolicy;
|
|
75 | 78 | import org.opensearch.index.mapper.RangeFieldMapper;
|
76 | 79 | import org.opensearch.index.mapper.RangeType;
|
77 | 80 | import org.opensearch.index.mapper.SeqNoFieldMapper;
|
| 81 | +import org.opensearch.index.mapper.TextFieldMapper; |
| 82 | +import org.opensearch.index.mapper.TextParams; |
78 | 83 | import org.opensearch.index.mapper.Uid;
|
79 | 84 | import org.opensearch.index.query.MatchAllQueryBuilder;
|
80 | 85 | import org.opensearch.index.query.QueryBuilders;
|
@@ -1578,6 +1583,95 @@ public void testOrderByPipelineAggregation() throws Exception {
|
1578 | 1583 | }
|
1579 | 1584 | }
|
1580 | 1585 |
|
| 1586 | + public void testBucketInTermsAggregationWithMissingValue() throws IOException { |
| 1587 | + try (Directory directory = newDirectory()) { |
| 1588 | + try (RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory)) { |
| 1589 | + // test text |
| 1590 | + { |
| 1591 | + FieldType type = TextParams.buildFieldType(() -> true, () -> false, () -> "positions", () -> false, () -> "no"); |
| 1592 | + Document document = new Document(); |
| 1593 | + document.add(new Field("mv_field", "name1", type)); |
| 1594 | + document.add(new Field("mv_field", "name2", type)); |
| 1595 | + indexWriter.addDocument(document); |
| 1596 | + document = new Document(); |
| 1597 | + document.add(new Field("mv_field1", "value1", type)); |
| 1598 | + indexWriter.addDocument(document); |
| 1599 | + document = new Document(); |
| 1600 | + document.add(new Field("mv_field1", "value2", type)); |
| 1601 | + indexWriter.addDocument(document); |
| 1602 | + indexWriter.flush(); |
| 1603 | + try (IndexReader indexReader = maybeWrapReaderEs(indexWriter.getReader())) { |
| 1604 | + IndexSearcher indexSearcher = newIndexSearcher(indexReader); |
| 1605 | + TextFieldMapper.TextFieldType fieldType = new TextFieldMapper.TextFieldType("mv_field"); |
| 1606 | + fieldType.setFielddata(true); |
| 1607 | + |
| 1608 | + TermsAggregationBuilder aggregationBuilder = new TermsAggregationBuilder("nick").userValueTypeHint(ValueType.STRING) |
| 1609 | + .field("mv_field") |
| 1610 | + .missing("no_nickname"); |
| 1611 | + TermsAggregator aggregator = createAggregator(aggregationBuilder, indexSearcher, fieldType); |
| 1612 | + assertThat(aggregator, instanceOf(GlobalOrdinalsStringTermsAggregator.class)); |
| 1613 | + |
| 1614 | + aggregator.preCollection(); |
| 1615 | + indexSearcher.search(new MatchAllDocsQuery(), aggregator); |
| 1616 | + aggregator.postCollection(); |
| 1617 | + Terms result = reduce(aggregator); |
| 1618 | + assertEquals(3, result.getBuckets().size()); |
| 1619 | + assertEquals("no_nickname", result.getBuckets().get(0).getKeyAsString()); |
| 1620 | + assertEquals(2L, result.getBuckets().get(0).getDocCount()); |
| 1621 | + assertEquals("name1", result.getBuckets().get(1).getKeyAsString()); |
| 1622 | + assertEquals(1L, result.getBuckets().get(1).getDocCount()); |
| 1623 | + assertEquals("name2", result.getBuckets().get(2).getKeyAsString()); |
| 1624 | + assertEquals(1L, result.getBuckets().get(2).getDocCount()); |
| 1625 | + |
| 1626 | + } |
| 1627 | + indexWriter.deleteAll(); |
| 1628 | + } |
| 1629 | + |
| 1630 | + // test keyword |
| 1631 | + { |
| 1632 | + FieldType fieldtype = new FieldType(KeywordFieldMapper.Defaults.FIELD_TYPE); |
| 1633 | + fieldtype.setDocValuesType(DocValuesType.SORTED_SET); |
| 1634 | + fieldtype.setIndexOptions(IndexOptions.NONE); |
| 1635 | + fieldtype.setStored(true); |
| 1636 | + |
| 1637 | + Document document = new Document(); |
| 1638 | + document.add(new SortedSetDocValuesField("mv_field1", new BytesRef("name1"))); |
| 1639 | + document.add(new SortedSetDocValuesField("mv_field1", new BytesRef("name2"))); |
| 1640 | + indexWriter.addDocument(document); |
| 1641 | + document = new Document(); |
| 1642 | + document.add(new SortedSetDocValuesField("mv_field2", new BytesRef("value1"))); |
| 1643 | + indexWriter.addDocument(document); |
| 1644 | + document = new Document(); |
| 1645 | + document.add(new SortedSetDocValuesField("mv_field2", new BytesRef("value2"))); |
| 1646 | + indexWriter.addDocument(document); |
| 1647 | + indexWriter.flush(); |
| 1648 | + try (IndexReader indexReader = maybeWrapReaderEs(indexWriter.getReader())) { |
| 1649 | + IndexSearcher indexSearcher = newIndexSearcher(indexReader); |
| 1650 | + KeywordFieldMapper.KeywordFieldType fieldType = new KeywordFieldMapper.KeywordFieldType("mv_field1"); |
| 1651 | + |
| 1652 | + TermsAggregationBuilder aggregationBuilder = new TermsAggregationBuilder("_name").userValueTypeHint( |
| 1653 | + ValueType.STRING |
| 1654 | + ).field("mv_field1").missing("no_nickname1"); |
| 1655 | + TermsAggregator aggregator = createAggregator(aggregationBuilder, indexSearcher, fieldType); |
| 1656 | + assertThat(aggregator, instanceOf(GlobalOrdinalsStringTermsAggregator.class)); |
| 1657 | + |
| 1658 | + aggregator.preCollection(); |
| 1659 | + indexSearcher.search(new MatchAllDocsQuery(), aggregator); |
| 1660 | + aggregator.postCollection(); |
| 1661 | + Terms result = reduce(aggregator); |
| 1662 | + assertEquals(3, result.getBuckets().size()); |
| 1663 | + assertEquals("no_nickname1", result.getBuckets().get(0).getKeyAsString()); |
| 1664 | + assertEquals(2L, result.getBuckets().get(0).getDocCount()); |
| 1665 | + assertEquals("name1", result.getBuckets().get(1).getKeyAsString()); |
| 1666 | + assertEquals(1L, result.getBuckets().get(1).getDocCount()); |
| 1667 | + assertEquals("name2", result.getBuckets().get(2).getKeyAsString()); |
| 1668 | + assertEquals(1L, result.getBuckets().get(2).getDocCount()); |
| 1669 | + } |
| 1670 | + } |
| 1671 | + } |
| 1672 | + } |
| 1673 | + } |
| 1674 | + |
1581 | 1675 | private final SeqNoFieldMapper.SequenceIDFields sequenceIDFields = SeqNoFieldMapper.SequenceIDFields.emptySeqID();
|
1582 | 1676 |
|
1583 | 1677 | private List<Document> generateDocsWithNested(String id, int value, int[] nestedValues) {
|
|
0 commit comments