Skip to content

Commit 7ae9909

Browse files
committed
Add test coverage for knn options
1 parent c203766 commit 7ae9909

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

x-pack/plugin/esql/qa/testFixtures/src/main/resources/mapping-all-types.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
"semantic_text": {
6464
"type": "semantic_text",
6565
"inference_id": "foo_inference_id"
66+
},
67+
"dense_vector": {
68+
"type": "dense_vector"
6669
}
6770
}
6871
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public class Knn extends FullTextFunction implements OptionalArgument, VectorFun
6363
entry(NUM_CANDS_FIELD.getPreferredName(), INTEGER),
6464
entry(VECTOR_SIMILARITY_FIELD.getPreferredName(), FLOAT),
6565
entry(BOOST_FIELD.getPreferredName(), FLOAT),
66-
entry(OVERSAMPLE_FIELD.getPreferredName(), FLOAT)
66+
entry(KnnQuery.RESCORE_OVERSAMPLE_FIELD, FLOAT)
6767
);
6868

6969
@FunctionInfo(returnType = "boolean", preview = true, description = """

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class KnnQuery extends Query {
2727
private final float[] query;
2828
private final Map<String, Object> options;
2929

30+
public static final String RESCORE_OVERSAMPLE_FIELD = "rescore_oversample";
31+
3032
public KnnQuery(Source source, String field, float[] query, Map<String, Object> options) {
3133
super(source);
3234
assert options != null;
@@ -40,7 +42,7 @@ protected QueryBuilder asBuilder() {
4042
Integer k = (Integer) options.get(K_FIELD.getPreferredName());
4143
Integer numCands = (Integer) options.get(NUM_CANDS_FIELD.getPreferredName());
4244
RescoreVectorBuilder rescoreVectorBuilder = null;
43-
Float oversample = (Float) options.get(RescoreVectorBuilder.OVERSAMPLE_FIELD.getPreferredName());
45+
Float oversample = (Float) options.get(RESCORE_OVERSAMPLE_FIELD);
4446
if (oversample != null) {
4547
rescoreVectorBuilder = new RescoreVectorBuilder(oversample);
4648
}

x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import org.elasticsearch.index.query.RangeQueryBuilder;
3131
import org.elasticsearch.index.query.SearchExecutionContext;
3232
import org.elasticsearch.license.XPackLicenseState;
33+
import org.elasticsearch.search.vectors.KnnVectorQueryBuilder;
34+
import org.elasticsearch.search.vectors.RescoreVectorBuilder;
3335
import org.elasticsearch.test.VersionUtils;
3436
import org.elasticsearch.xpack.core.enrich.EnrichPolicy;
3537
import org.elasticsearch.xpack.esql.EsqlTestUtils;
@@ -1904,6 +1906,28 @@ public void testMultiMatchOptionsPushDown() {
19041906
assertThat(expectedQuery.toString(), is(planStr.get()));
19051907
}
19061908

1909+
public void testKnnOptionsPushDown() {
1910+
String query = """
1911+
from test
1912+
| where KNN(dense_vector, [0.1, 0.2, 0.3], { "k": 5, "similarity": 0.001, "num_candidates": 10, "rescore_oversample": 7 })
1913+
""";
1914+
var analyzer = makeAnalyzer("mapping-all-types.json");
1915+
var plan = plannerOptimizer.plan(query, IS_SV_STATS, analyzer);
1916+
1917+
AtomicReference<String> planStr = new AtomicReference<>();
1918+
plan.forEachDown(EsQueryExec.class, result -> planStr.set(result.query().toString()));
1919+
1920+
var expectedQuery = new KnnVectorQueryBuilder(
1921+
"dense_vector",
1922+
new float[] { 0.1f, 0.2f, 0.3f },
1923+
5,
1924+
10,
1925+
new RescoreVectorBuilder(7),
1926+
0.001f
1927+
);
1928+
assertThat(expectedQuery.toString(), is(planStr.get()));
1929+
}
1930+
19071931
/**
19081932
* Expecting
19091933
* LimitExec[1000[INTEGER]]

0 commit comments

Comments
 (0)