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

ishan pushed a commit to branch jira/solr-17927
in repository https://gitbox.apache.org/repos/asf/solr.git

commit e0b16e156daed7c49bdfa28e0ae98172e44055f7
Author: punAhuja <[email protected]>
AuthorDate: Fri Sep 26 14:14:34 2025 +0530

    Added a configurable ef-search parameter
---
 .../apache/solr/handler/component/QueryComponent.java   | 15 +++++++++++++++
 .../java/org/apache/solr/schema/DenseVectorField.java   | 17 +++++++++++++++++
 .../java/org/apache/solr/search/vector/KnnQParser.java  | 12 ++++--------
 3 files changed, 36 insertions(+), 8 deletions(-)

diff --git 
a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java 
b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
index 30875caa70f..b2f2cf502e7 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java
@@ -218,6 +218,21 @@ public class QueryComponent extends SearchComponent {
       rb.setSortSpec(parser.getSortSpec(true));
       rb.setQparser(parser);
 
+      // If this is a KNN request, cap effective rows to topK
+      Object tk = req.getContext().get("knn.topK");
+      if (tk instanceof Integer) {
+        int topK = (Integer) tk;
+
+        // Adjust the SortSpec count
+        SortSpec ss = rb.getSortSpec();
+        int rows = ss.getCount();
+        int start = ss.getOffset();
+        if (rows > topK) {
+          rb.setSortSpec(new SortSpec(ss.getSort(), ss.getSchemaFields(), 
topK, start));
+          rb.shards_rows = topK;
+        }
+      }
+
       String[] fqs = req.getParams().getParams(CommonParams.FQ);
       if (fqs != null && fqs.length != 0) {
         List<Query> filters = rb.getFilters();
diff --git a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java 
b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
index 21c8d0d789c..8c2eac4c0ec 100644
--- a/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
+++ b/solr/core/src/java/org/apache/solr/schema/DenseVectorField.java
@@ -553,6 +553,23 @@ public class DenseVectorField extends FloatPointField {
     };
   }
 
+  public Query getKnnVectorQuery(
+      String fieldName, String vectorToSearch, int topK, int efSearch, Query 
filterQuery) {
+    final int k = efSearch;
+    DenseVectorParser vectorBuilder =
+        getVectorBuilder(vectorToSearch, DenseVectorParser.BuilderPhase.QUERY);
+    switch (vectorEncoding) {
+      case FLOAT32:
+        return new KnnFloatVectorQuery(fieldName, 
vectorBuilder.getFloatVector(), k, filterQuery);
+      case BYTE:
+        return new KnnByteVectorQuery(fieldName, 
vectorBuilder.getByteVector(), k, filterQuery);
+      default:
+        throw new SolrException(
+            SolrException.ErrorCode.SERVER_ERROR,
+            "Unexpected state. Vector Encoding: " + vectorEncoding);
+    }
+  }
+
   /**
    * Not Supported. Please use the {!knn} query parser to run K nearest 
neighbors search queries.
    */
diff --git a/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java 
b/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java
index 08fa6a5fc9a..544e054ce51 100644
--- a/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java
+++ b/solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java
@@ -108,15 +108,11 @@ public class KnnQParser extends AbstractVectorQParserBase 
{
     final DenseVectorField denseVectorType = getCheckedFieldType(schemaField);
     final String vectorToSearch = getVectorToSearch();
     final int topK = localParams.getInt(TOP_K, DEFAULT_TOP_K);
-    final Integer filteredSearchThreshold = 
localParams.getInt(FILTERED_SEARCH_THRESHOLD);
+    final int efSearch = localParams.getInt("ef-search", topK * 2);
+
+    req.getContext().put("knn.topK", topK);
 
     return denseVectorType.getKnnVectorQuery(
-        schemaField.getName(),
-        vectorToSearch,
-        topK,
-        getFilterQuery(),
-        getSeedQuery(),
-        getEarlyTerminationParams(),
-        filteredSearchThreshold);
+        schemaField.getName(), vectorToSearch, topK, efSearch, 
getFilterQuery(), getEarlyTerminationParams());
   }
 }

Reply via email to