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) { 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..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 @@ -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,13 @@ 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()) + ); } } }