1212import org .elasticsearch .search .vectors .RescoreVectorBuilder ;
1313import org .elasticsearch .xpack .esql .core .querydsl .query .Query ;
1414import org .elasticsearch .xpack .esql .core .tree .Source ;
15+ import org .elasticsearch .xpack .esql .expression .function .vector .Knn ;
1516
1617import java .util .ArrayList ;
1718import java .util .Arrays ;
2021import java .util .Objects ;
2122
2223import static org .elasticsearch .index .query .AbstractQueryBuilder .BOOST_FIELD ;
23- import static org .elasticsearch .search .vectors .KnnVectorQueryBuilder .K_FIELD ;
24- import static org .elasticsearch .search .vectors .KnnVectorQueryBuilder .NUM_CANDS_FIELD ;
2524import static org .elasticsearch .search .vectors .KnnVectorQueryBuilder .VECTOR_SIMILARITY_FIELD ;
2625
2726public class KnnQuery extends Query {
@@ -36,6 +35,7 @@ public class KnnQuery extends Query {
3635
3736 public KnnQuery (Source source , String field , float [] query , Integer k , Map <String , Object > options , List <QueryBuilder > filterQueries ) {
3837 super (source );
38+ assert k != null && k > 0 : "k must be a positive integer, but was: " + k ;
3939 this .k = k ;
4040 assert options != null ;
4141 this .field = field ;
@@ -46,15 +46,23 @@ public KnnQuery(Source source, String field, float[] query, Integer k, Map<Strin
4646
4747 @ Override
4848 protected QueryBuilder asBuilder () {
49- Integer numCands = (Integer ) options .get (NUM_CANDS_FIELD .getPreferredName ());
5049 RescoreVectorBuilder rescoreVectorBuilder = null ;
5150 Float oversample = (Float ) options .get (RESCORE_OVERSAMPLE_FIELD );
5251 if (oversample != null ) {
5352 rescoreVectorBuilder = new RescoreVectorBuilder (oversample );
5453 }
5554 Float vectorSimilarity = (Float ) options .get (VECTOR_SIMILARITY_FIELD .getPreferredName ());
56-
57- KnnVectorQueryBuilder queryBuilder = new KnnVectorQueryBuilder (field , query , k , numCands , rescoreVectorBuilder , vectorSimilarity );
55+ Integer minCandidates = (Integer ) options .get (Knn .MIN_CANDIDATES_OPTION );
56+ int adjustedK = Math .max (k , minCandidates == null ? 0 : minCandidates );
57+
58+ KnnVectorQueryBuilder queryBuilder = new KnnVectorQueryBuilder (
59+ field ,
60+ query ,
61+ adjustedK ,
62+ minCandidates ,
63+ rescoreVectorBuilder ,
64+ vectorSimilarity
65+ );
5866 for (QueryBuilder filter : filterQueries ) {
5967 queryBuilder .addFilterQuery (filter );
6068 }
0 commit comments