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;
}