Taxonomy counts are incorrect due to ordinal sorting (#14008) (#14010)

This commit is contained in:
Paul King 2024-11-23 22:03:23 +10:00 committed by Stefan Vodita
parent cbec73e4c3
commit aa040d5230
3 changed files with 56 additions and 2 deletions

View File

@ -100,6 +100,8 @@ Other
Bug Fixes Bug Fixes
--------------------- ---------------------
* GITHUB#14008: Counts provided by taxonomy facets in addition to another aggregation are now returned together with
their corresponding ordinals. (Paul King)
======================= Lucene 10.0.0 ======================= ======================= Lucene 10.0.0 =======================
@ -399,6 +401,14 @@ Build
* GITHUB#13698: Upgrade to gradle 8.10 (Dawid Weiss) * GITHUB#13698: Upgrade to gradle 8.10 (Dawid Weiss)
======================== Lucene 9.12.1 =======================
Bug Fixes
---------------------
* GITHUB#14008: Counts provided by taxonomy facets in addition to another aggregation are now returned together with
their corresponding ordinals. (Paul King)
======================== Lucene 9.12.0 ======================= ======================== Lucene 9.12.0 =======================
Security Fixes Security Fixes

View File

@ -314,6 +314,7 @@ abstract class TaxonomyFacets extends Facets {
LabelAndValue[] labelValues = new LabelAndValue[q.size()]; LabelAndValue[] labelValues = new LabelAndValue[q.size()];
int[] ordinals = new int[labelValues.length]; int[] ordinals = new int[labelValues.length];
int[] counts = new int[labelValues.length];
Number[] values = new Number[labelValues.length]; Number[] values = new Number[labelValues.length];
for (int i = labelValues.length - 1; i >= 0; i--) { for (int i = labelValues.length - 1; i >= 0; i--) {
@ -321,6 +322,7 @@ abstract class TaxonomyFacets extends Facets {
assert ordAndValue != null; assert ordAndValue != null;
ordinals[i] = ordAndValue.ord; ordinals[i] = ordAndValue.ord;
values[i] = ordAndValue.getValue(); values[i] = ordAndValue.getValue();
counts[i] = getCount(ordinals[i]);
} }
FacetLabel[] bulkPath = taxoReader.getBulkPath(ordinals); FacetLabel[] bulkPath = taxoReader.getBulkPath(ordinals);
@ -329,8 +331,7 @@ abstract class TaxonomyFacets extends Facets {
int childComponentIdx = path.length + 1; int childComponentIdx = path.length + 1;
for (int i = 0; i < labelValues.length; i++) { for (int i = 0; i < labelValues.length; i++) {
labelValues[i] = labelValues[i] =
new LabelAndValue( new LabelAndValue(bulkPath[i].components[childComponentIdx], values[i], counts[i]);
bulkPath[i].components[childComponentIdx], values[i], getCount(ordinals[i]));
} }
return new FacetResult( return new FacetResult(

View File

@ -570,6 +570,49 @@ public class TestTaxonomyFacetAssociations extends FacetTestCase {
IOUtils.close(taxoReader, reader, taxoDir, dir); IOUtils.close(taxoReader, reader, taxoDir, dir);
} }
public void testAggregationCounts() throws IOException {
Directory taxoDir = newDirectory();
TaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
FacetsConfig config = new FacetsConfig();
config.setIndexFieldName("a", "$int_facets");
RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
Document d;
d = new Document();
d.add(new IntAssociationFacetField(1, "a", "1"));
writer.addDocument(config.build(taxoWriter, d));
d = new Document();
d.add(new IntAssociationFacetField(5, "a", "2"));
writer.addDocument(config.build(taxoWriter, d));
d = new Document();
d.add(new IntAssociationFacetField(1, "a", "1"));
writer.addDocument(config.build(taxoWriter, d));
IndexReader reader = writer.getReader();
IOUtils.close(taxoWriter, writer);
IndexSearcher searcher = newSearcher(reader);
Query q = new MatchAllDocsQuery();
FacetsCollector fc = searcher.search(q, new FacetsCollectorManager());
TaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);
IntTaxonomyFacets intFacets =
new TaxonomyFacetIntAssociations(
"$int_facets", taxoReader, config, fc, AssociationAggregationFunction.SUM);
FacetResult result = intFacets.getTopChildren(10, "a");
assertEquals("dim=a path=[] value=7 childCount=2\n 2 (5)\n 1 (2)\n", result.toString());
assertEquals(1, result.labelValues[0].count);
assertEquals(2, result.labelValues[1].count);
IOUtils.close(taxoReader, reader, taxoDir);
}
private void validateInts( private void validateInts(
String dim, String dim,
Map<String, Integer> expected, Map<String, Integer> expected,