Skip to content

Commit e3dd487

Browse files
committed
Use min_candidates
1 parent 1b2829b commit e3dd487

File tree

2 files changed

+16
-6
lines changed
  • x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql

2 files changed

+16
-6
lines changed

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/Knn.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,10 @@ public class Knn extends FullTextFunction implements OptionalArgument, VectorFun
7979
// Expressions to be used as prefilters in knn query
8080
private final List<Expression> filterExpressions;
8181

82+
public static final String MIN_CANDIDATES_OPTION = "min_candidates";
83+
8284
public static final Map<String, DataType> ALLOWED_OPTIONS = Map.ofEntries(
83-
entry(NUM_CANDS_FIELD.getPreferredName(), INTEGER),
85+
entry(MIN_CANDIDATES_OPTION, INTEGER),
8486
entry(VECTOR_SIMILARITY_FIELD.getPreferredName(), FLOAT),
8587
entry(BOOST_FIELD.getPreferredName(), FLOAT),
8688
entry(KnnQuery.RESCORE_OVERSAMPLE_FIELD, FLOAT)

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/querydsl/query/KnnQuery.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.search.vectors.RescoreVectorBuilder;
1313
import org.elasticsearch.xpack.esql.core.querydsl.query.Query;
1414
import org.elasticsearch.xpack.esql.core.tree.Source;
15+
import org.elasticsearch.xpack.esql.expression.function.vector.Knn;
1516

1617
import java.util.ArrayList;
1718
import java.util.Arrays;
@@ -20,8 +21,6 @@
2021
import java.util.Objects;
2122

2223
import 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;
2524
import static org.elasticsearch.search.vectors.KnnVectorQueryBuilder.VECTOR_SIMILARITY_FIELD;
2625

2726
public 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

Comments
 (0)