From 3214d6c346556d11856cdd700f0a53451f8049b5 Mon Sep 17 00:00:00 2001 From: Ignacio Vera Date: Fri, 21 Nov 2025 17:32:30 +0100 Subject: [PATCH 1/3] [DiskBBQ] do not build empty priority queue --- .../diskbbq/next/ESNextDiskBBQVectorsReader.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/server/src/main/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsReader.java b/server/src/main/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsReader.java index b30d560002679..ec0183ffb1c34 100644 --- a/server/src/main/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsReader.java +++ b/server/src/main/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsReader.java @@ -324,6 +324,20 @@ private static CentroidIterator getCentroidIteratorWithParents( final NeighborQueue currentParentQueue = new NeighborQueue(maxChildrenSize, true); final int bufferSize = (int) Math.min(Math.max(centroidRatio * numCentroids, 1), numCentroids); final int numCentroidsFiltered = acceptCentroids == null ? numCentroids : acceptCentroids.cardinality(); + if (numCentroidsFiltered == 0) { + // TODO maybe this makes CentroidIterator polymorphic? + return new CentroidIterator() { + @Override + public boolean hasNext() { + return false; + } + + @Override + public CentroidOffsetAndLength nextPostingListOffsetAndLength() { + return null; + } + }; + } final float[] scores = new float[ES92Int7VectorsScorer.BULK_SIZE]; final NeighborQueue neighborQueue; if (acceptCentroids != null && numCentroidsFiltered <= bufferSize) { From 8ec3f1697578e390d0dcbd65dac53420cebde806 Mon Sep 17 00:00:00 2001 From: Ignacio Vera Date: Fri, 21 Nov 2025 18:02:29 +0100 Subject: [PATCH 2/3] add test --- .../next/ESNextDiskBBQVectorsFormatTests.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java b/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java index 59c4dc05bdd77..2466d7f3e4920 100644 --- a/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java +++ b/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java @@ -29,6 +29,7 @@ import org.apache.lucene.index.VectorEncoding; import org.apache.lucene.index.VectorSimilarityFunction; import org.apache.lucene.search.AcceptDocs; +import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.KnnCollector; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TopKnnCollector; @@ -382,6 +383,17 @@ private void doRestrictiveFilter(boolean dense) throws IOException { uniqueDocIds.add(topDocs.scoreDocs[i].doc); } assertEquals(matchingDocs, uniqueDocIds.size()); + // match no docs + leafReader.searchNearestVectors( + "f", + vector, + new TopKnnCollector(2, Integer.MAX_VALUE), + AcceptDocs.fromIteratorSupplier( + DocIdSetIterator::empty, + leafReader.getLiveDocs(), + leafReader.maxDoc() + ) + ); } } } From 6238374eb6a3d333590689fcd02202ce7c158035 Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Fri, 21 Nov 2025 17:11:32 +0000 Subject: [PATCH 3/3] [CI] Auto commit changes from spotless --- .../diskbbq/next/ESNextDiskBBQVectorsFormatTests.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java b/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java index 2466d7f3e4920..c1eba4aa66a67 100644 --- a/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java +++ b/server/src/test/java/org/elasticsearch/index/codec/vectors/diskbbq/next/ESNextDiskBBQVectorsFormatTests.java @@ -388,11 +388,7 @@ private void doRestrictiveFilter(boolean dense) throws IOException { "f", vector, new TopKnnCollector(2, Integer.MAX_VALUE), - AcceptDocs.fromIteratorSupplier( - DocIdSetIterator::empty, - leafReader.getLiveDocs(), - leafReader.maxDoc() - ) + AcceptDocs.fromIteratorSupplier(DocIdSetIterator::empty, leafReader.getLiveDocs(), leafReader.maxDoc()) ); } }