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