From 60fa19d50938784742be273697c9b38990c3067b Mon Sep 17 00:00:00 2001 From: Michael Sokolov Date: Sat, 20 Aug 2022 08:40:50 -0400 Subject: [PATCH] don't call BitSet.cardinality() more than needed (#1075) --- .../java/org/apache/lucene/search/KnnVectorQuery.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lucene/core/src/java/org/apache/lucene/search/KnnVectorQuery.java b/lucene/core/src/java/org/apache/lucene/search/KnnVectorQuery.java index a4164647917..32329792a6a 100644 --- a/lucene/core/src/java/org/apache/lucene/search/KnnVectorQuery.java +++ b/lucene/core/src/java/org/apache/lucene/search/KnnVectorQuery.java @@ -131,20 +131,21 @@ public class KnnVectorQuery extends Query { } BitSet acceptDocs = createBitSet(scorer.iterator(), liveDocs, maxDoc); + int cost = acceptDocs.cardinality(); - if (acceptDocs.cardinality() <= k) { + if (cost <= k) { // If there are <= k possible matches, short-circuit and perform exact search, since HNSW // must always visit at least k documents - return exactSearch(ctx, new BitSetIterator(acceptDocs, acceptDocs.cardinality())); + return exactSearch(ctx, new BitSetIterator(acceptDocs, cost)); } // Perform the approximate kNN search - TopDocs results = approximateSearch(ctx, acceptDocs, acceptDocs.cardinality()); + TopDocs results = approximateSearch(ctx, acceptDocs, cost); if (results.totalHits.relation == TotalHits.Relation.EQUAL_TO) { return results; } else { // We stopped the kNN search because it visited too many nodes, so fall back to exact search - return exactSearch(ctx, new BitSetIterator(acceptDocs, acceptDocs.cardinality())); + return exactSearch(ctx, new BitSetIterator(acceptDocs, cost)); } }