You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by to...@apache.org on 2025/06/25 09:01:06 UTC

(lucene) branch branch_10x updated: Make it possible to extend Patience/Seeded knn queries (#14838)

This is an automated email from the ASF dual-hosted git repository.

tommaso pushed a commit to branch branch_10x
in repository https://gitbox.apache.org/repos/asf/lucene.git


The following commit(s) were added to refs/heads/branch_10x by this push:
     new 52597fa4cac Make it possible to extend Patience/Seeded knn queries (#14838)
52597fa4cac is described below

commit 52597fa4cacb9001851290e40fb000c793d15e36
Author: Tommaso Teofili <to...@elastic.co>
AuthorDate: Wed Jun 25 10:59:26 2025 +0200

    Make it possible to extend Patience/Seeded knn queries (#14838)
    
    (cherry picked from commit 2b47cd3cd69b83c9798bfa109ba05b2666947b8e)
---
 lucene/CHANGES.txt                                 |  2 +
 .../search/HnswQueueSaturationCollector.java       |  3 +-
 .../lucene/search/PatienceKnnVectorQuery.java      | 58 +++++++++++++++++++---
 .../apache/lucene/search/SeededKnnVectorQuery.java | 42 ++++++++++++++--
 .../search/TestSeededKnnByteVectorQuery.java       |  2 +-
 5 files changed, 96 insertions(+), 11 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index dc0b7dade9c..220f8e3ed87 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -104,6 +104,8 @@ Bug Fixes
 
 * GITHUB#14755: Fix too many documents collected when only bool-filter condition is present. (Ke Wei)
 
+* GITHUB#14838: Make it possible to extend Patience/Seeded knn queries (Tommaso Teofili)
+
 Build
 ---------------------
 * Upgrade forbiddenapis to version 3.9.  (Uwe Schindler)
diff --git a/lucene/core/src/java/org/apache/lucene/search/HnswQueueSaturationCollector.java b/lucene/core/src/java/org/apache/lucene/search/HnswQueueSaturationCollector.java
index 1d46baba4ff..a67b28689f8 100644
--- a/lucene/core/src/java/org/apache/lucene/search/HnswQueueSaturationCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/HnswQueueSaturationCollector.java
@@ -37,7 +37,8 @@ public class HnswQueueSaturationCollector extends KnnCollector.Decorator {
   private int previousQueueSize;
   private int currentQueueSize;
 
-  HnswQueueSaturationCollector(KnnCollector delegate, double saturationThreshold, int patience) {
+  public HnswQueueSaturationCollector(
+      KnnCollector delegate, double saturationThreshold, int patience) {
     super(delegate);
     this.delegate = delegate;
     this.previousQueueSize = 0;
diff --git a/lucene/core/src/java/org/apache/lucene/search/PatienceKnnVectorQuery.java b/lucene/core/src/java/org/apache/lucene/search/PatienceKnnVectorQuery.java
index ad7332e4ca8..170a26a714e 100644
--- a/lucene/core/src/java/org/apache/lucene/search/PatienceKnnVectorQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/PatienceKnnVectorQuery.java
@@ -48,7 +48,7 @@ public class PatienceKnnVectorQuery extends AbstractKnnVectorQuery {
   /**
    * Construct a new PatienceKnnVectorQuery instance for a float vector field
    *
-   * @param knnQuery the knn query to be seeded
+   * @param knnQuery the knn query to be wrapped
    * @param saturationThreshold the early exit saturation threshold
    * @param patience the patience parameter
    * @return a new PatienceKnnVectorQuery instance
@@ -62,7 +62,7 @@ public class PatienceKnnVectorQuery extends AbstractKnnVectorQuery {
   /**
    * Construct a new PatienceKnnVectorQuery instance for a float vector field
    *
-   * @param knnQuery the knn query to be seeded
+   * @param knnQuery the knn query to be wrapped
    * @return a new PatienceKnnVectorQuery instance
    * @lucene.experimental
    */
@@ -74,7 +74,7 @@ public class PatienceKnnVectorQuery extends AbstractKnnVectorQuery {
   /**
    * Construct a new PatienceKnnVectorQuery instance for a byte vector field
    *
-   * @param knnQuery the knn query to be seeded
+   * @param knnQuery the knn query to be wrapped
    * @param saturationThreshold the early exit saturation threshold
    * @param patience the patience parameter
    * @return a new PatienceKnnVectorQuery instance
@@ -124,13 +124,55 @@ public class PatienceKnnVectorQuery extends AbstractKnnVectorQuery {
   }
 
   PatienceKnnVectorQuery(
-      AbstractKnnVectorQuery knnQuery, double saturationThreshold, int patience) {
-    super(knnQuery.field, knnQuery.k, knnQuery.filter, knnQuery.searchStrategy);
+      AbstractKnnVectorQuery knnQuery,
+      String field,
+      int k,
+      Query filter,
+      KnnSearchStrategy searchStrategy,
+      double saturationThreshold,
+      int patience) {
+    super(field, k, filter, searchStrategy);
     this.delegate = knnQuery;
     this.saturationThreshold = saturationThreshold;
     this.patience = patience;
   }
 
+  public PatienceKnnVectorQuery(
+      SeededKnnVectorQuery knnQuery, double saturationThreshold, int patience) {
+    this(
+        knnQuery,
+        knnQuery.field,
+        knnQuery.k,
+        knnQuery.filter,
+        knnQuery.searchStrategy,
+        saturationThreshold,
+        patience);
+  }
+
+  public PatienceKnnVectorQuery(
+      KnnFloatVectorQuery knnQuery, double saturationThreshold, int patience) {
+    this(
+        knnQuery,
+        knnQuery.field,
+        knnQuery.k,
+        knnQuery.filter,
+        knnQuery.searchStrategy,
+        saturationThreshold,
+        patience);
+  }
+
+  public PatienceKnnVectorQuery(
+      KnnByteVectorQuery knnQuery, double saturationThreshold, int patience) {
+    this(
+        knnQuery,
+        knnQuery.field,
+        knnQuery.k,
+        knnQuery.filter,
+        knnQuery.searchStrategy,
+        saturationThreshold,
+        patience);
+  }
+
   private static int defaultPatience(AbstractKnnVectorQuery delegate) {
     return Math.max(7, (int) (delegate.k * 0.3));
   }
@@ -243,7 +285,11 @@ public class PatienceKnnVectorQuery extends AbstractKnnVectorQuery {
           new SeededKnnVectorQuery(
               seededKnnVectorQuery.delegate,
               seededKnnVectorQuery.seed,
-              seededKnnVectorQuery.createSeedWeight(indexSearcher));
+              seededKnnVectorQuery.createSeedWeight(indexSearcher),
+              delegate.field,
+              delegate.k,
+              delegate.filter,
+              delegate.searchStrategy);
     }
     return super.rewrite(indexSearcher);
   }
diff --git a/lucene/core/src/java/org/apache/lucene/search/SeededKnnVectorQuery.java b/lucene/core/src/java/org/apache/lucene/search/SeededKnnVectorQuery.java
index 98d8599f116..5b8b37b1c53 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SeededKnnVectorQuery.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SeededKnnVectorQuery.java
@@ -69,13 +69,42 @@ public class SeededKnnVectorQuery extends AbstractKnnVectorQuery {
     return new SeededKnnVectorQuery(knnQuery, seed, null);
   }
 
-  SeededKnnVectorQuery(AbstractKnnVectorQuery knnQuery, Query seed, Weight seedWeight) {
-    super(knnQuery.field, knnQuery.k, knnQuery.filter, knnQuery.searchStrategy);
+  SeededKnnVectorQuery(
+      AbstractKnnVectorQuery knnQuery,
+      Query seed,
+      Weight seedWeight,
+      String field,
+      int k,
+      Query filter,
+      KnnSearchStrategy searchStrategy) {
+    super(field, k, filter, searchStrategy);
     this.delegate = knnQuery;
     this.seed = Objects.requireNonNull(seed);
     this.seedWeight = seedWeight;
   }
 
+  public SeededKnnVectorQuery(KnnFloatVectorQuery knnQuery, Query seed, Weight seedWeight) {
+    this(
+        knnQuery,
+        seed,
+        seedWeight,
+        knnQuery.field,
+        knnQuery.k,
+        knnQuery.filter,
+        knnQuery.searchStrategy);
+  }
+
+  public SeededKnnVectorQuery(KnnByteVectorQuery knnQuery, Query seed, Weight seedWeight) {
+    this(
+        knnQuery,
+        seed,
+        seedWeight,
+        knnQuery.field,
+        knnQuery.k,
+        knnQuery.filter,
+        knnQuery.searchStrategy);
+  }
+
   @Override
   public String toString(String field) {
     return "SeededKnnVectorQuery{"
@@ -94,7 +123,14 @@ public class SeededKnnVectorQuery extends AbstractKnnVectorQuery {
       return super.rewrite(indexSearcher);
     }
     SeededKnnVectorQuery rewritten =
-        new SeededKnnVectorQuery(delegate, seed, createSeedWeight(indexSearcher));
+        new SeededKnnVectorQuery(
+            delegate,
+            seed,
+            createSeedWeight(indexSearcher),
+            delegate.field,
+            delegate.k,
+            delegate.filter,
+            delegate.searchStrategy);
     return rewritten.rewrite(indexSearcher);
   }
 
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSeededKnnByteVectorQuery.java b/lucene/core/src/test/org/apache/lucene/search/TestSeededKnnByteVectorQuery.java
index c4a3aa23303..025910fc037 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSeededKnnByteVectorQuery.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSeededKnnByteVectorQuery.java
@@ -238,7 +238,7 @@ public class TestSeededKnnByteVectorQuery extends BaseKnnVectorQueryTestCase {
 
     public AssertingSeededKnnVectorQuery(
         AbstractKnnVectorQuery query, Query seed, Weight seedWeight, AtomicInteger seedCalls) {
-      super(query, seed, seedWeight);
+      super(query, seed, seedWeight, query.field, query.k, query.filter, query.searchStrategy);
       this.seedCalls = seedCalls;
     }