diff --git a/docs/changelog/135709.yaml b/docs/changelog/135709.yaml new file mode 100644 index 0000000000000..11ddfb9e91cb1 --- /dev/null +++ b/docs/changelog/135709.yaml @@ -0,0 +1,5 @@ +pr: 135709 +summary: ES|QL - KNN function +area: ES|QL +type: feature +issues: [] diff --git a/docs/reference/query-languages/esql/_snippets/functions/layout/knn.md b/docs/reference/query-languages/esql/_snippets/functions/layout/knn.md index dae08f95757b9..c834b317bcd3f 100644 --- a/docs/reference/query-languages/esql/_snippets/functions/layout/knn.md +++ b/docs/reference/query-languages/esql/_snippets/functions/layout/knn.md @@ -2,7 +2,7 @@ ## `KNN` [esql-knn] ```{applies_to} -stack: development +stack: preview serverless: preview ``` diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/knn.json b/docs/reference/query-languages/esql/kibana/definition/functions/knn.json index 33845ebd490ce..5aa44b7917eb6 100644 --- a/docs/reference/query-languages/esql/kibana/definition/functions/knn.json +++ b/docs/reference/query-languages/esql/kibana/definition/functions/knn.json @@ -59,5 +59,5 @@ "from colors metadata _score\n| where knn(rgb_vector, [0, 120, 0])\n| sort _score desc, color asc" ], "preview" : true, - "snapshot_only" : true + "snapshot_only" : false } diff --git a/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/KnnSemanticTextTestCase.java b/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/KnnSemanticTextTestCase.java index 7b2909c1d2104..545dce156c74f 100644 --- a/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/KnnSemanticTextTestCase.java +++ b/x-pack/plugin/esql/qa/server/src/main/java/org/elasticsearch/xpack/esql/qa/rest/KnnSemanticTextTestCase.java @@ -12,7 +12,6 @@ import org.elasticsearch.test.rest.ESRestTestCase; import org.elasticsearch.xpack.esql.AssertWarnings; import org.elasticsearch.xpack.esql.CsvTestsDataLoader; -import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -43,7 +42,6 @@ public void checkCapability() { @SuppressWarnings("unchecked") public void testKnnQueryWithSemanticText() throws IOException { - assumeTrue("knn with semantic text not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); String knnQuery = """ FROM semantic-test METADATA _score | WHERE knn(dense_semantic, [0, 1, 2]) @@ -65,7 +63,6 @@ public void testKnnQueryWithSemanticText() throws IOException { } public void testKnnQueryOnTextField() throws IOException { - assumeTrue("knn with semantic text not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); String knnQuery = """ FROM semantic-test METADATA _score | WHERE knn(text, [0, 1, 2]) @@ -80,7 +77,6 @@ public void testKnnQueryOnTextField() throws IOException { } public void testKnnQueryOnSparseSemanticTextField() throws IOException { - assumeTrue("knn with semantic text not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); String knnQuery = """ FROM semantic-test METADATA _score | WHERE knn(sparse_semantic, [0, 1, 2]) diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/KnnFunctionIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/KnnFunctionIT.java index c8a426113eaf6..f6635defd1857 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/KnnFunctionIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/KnnFunctionIT.java @@ -21,7 +21,6 @@ import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.VerificationException; import org.elasticsearch.xpack.esql.action.AbstractEsqlIntegTestCase; -import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.action.EsqlQueryRequest; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.parser.ParserUtils; @@ -231,8 +230,6 @@ public void testKnnWithLookupJoin() { @Before public void setup() throws IOException { - assumeTrue("Needs KNN support", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var indexName = "test"; var client = client().admin().indices(); XContentBuilder mapping = XContentFactory.jsonBuilder() diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java index 483da630bb4c3..06d9166174852 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java @@ -1321,7 +1321,7 @@ public enum Cap { /** * Support knn function */ - KNN_FUNCTION_V5(Build.current().isSnapshot()), + KNN_FUNCTION_V5, /** * Support for the {@code TEXT_EMBEDDING} function for generating dense vector embeddings. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java index a648c2f77d9c6..2d2c644bbcace 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java @@ -506,6 +506,7 @@ private static FunctionDefinition[][] functions() { new FunctionDefinition[] { def(Decay.class, quad(Decay::new), "decay"), def(Kql.class, uni(Kql::new), "kql"), + def(Knn.class, tri(Knn::new), "knn"), def(Match.class, tri(Match::new), "match"), def(MultiMatch.class, MultiMatch::new, "multi_match"), def(QueryString.class, bi(QueryString::new), "qstr"), @@ -540,7 +541,6 @@ private static FunctionDefinition[][] snapshotFunctions() { def(Last.class, bi(Last::new), "last"), def(Score.class, uni(Score::new), Score.NAME), def(Term.class, bi(Term::new), "term"), - def(Knn.class, tri(Knn::new), "knn"), def(CosineSimilarity.class, CosineSimilarity::new, "v_cosine"), def(DotProduct.class, DotProduct::new, "v_dot_product"), def(L1Norm.class, L1Norm::new, "v_l1_norm"), diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/Knn.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/Knn.java index 79930ef057837..8588bbffaf0f0 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/Knn.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/Knn.java @@ -103,7 +103,7 @@ public class Knn extends FullTextFunction description = "Finds the k nearest vectors to a query vector, as measured by a similarity metric. " + "knn function finds nearest vectors through approximate search on indexed dense_vectors or semantic_text fields.", examples = { @Example(file = "knn-function", tag = "knn-function") }, - appliesTo = { @FunctionAppliesTo(lifeCycle = FunctionAppliesToLifecycle.DEVELOPMENT) } + appliesTo = { @FunctionAppliesTo(lifeCycle = FunctionAppliesToLifecycle.PREVIEW) } ) public Knn( Source source, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/VectorWritables.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/VectorWritables.java index d43ec3e92981d..9c57db4509aee 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/VectorWritables.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/vector/VectorWritables.java @@ -27,9 +27,7 @@ private VectorWritables() { public static List getNamedWritables() { List entries = new ArrayList<>(); - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - entries.add(Knn.ENTRY); - } + entries.add(Knn.ENTRY); if (EsqlCapabilities.Cap.COSINE_VECTOR_SIMILARITY_FUNCTION.isEnabled()) { entries.add(CosineSimilarity.ENTRY); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java index 6de798562548d..cff2ffdd061e2 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/AnalyzerTests.java @@ -2356,22 +2356,14 @@ public void testImplicitCasting() { } public void testDenseVectorImplicitCastingKnn() { - assumeTrue("dense_vector capability not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkDenseVectorCastingHexKnn("float_vector"); - checkDenseVectorCastingKnn("float_vector"); - } - if (EsqlCapabilities.Cap.DENSE_VECTOR_FIELD_TYPE_BYTE_ELEMENTS.isEnabled()) { - checkDenseVectorCastingKnn("byte_vector"); - checkDenseVectorCastingHexKnn("byte_vector"); - checkDenseVectorEvalCastingKnn("byte_vector"); - } - if (EsqlCapabilities.Cap.DENSE_VECTOR_FIELD_TYPE_BIT_ELEMENTS.isEnabled()) { - checkDenseVectorCastingKnn("bit_vector"); - checkDenseVectorCastingHexKnn("bit_vector"); - checkDenseVectorEvalCastingKnn("bit_vector"); - } + checkDenseVectorCastingHexKnn("float_vector"); + checkDenseVectorCastingKnn("float_vector"); + checkDenseVectorCastingKnn("byte_vector"); + checkDenseVectorCastingHexKnn("byte_vector"); + checkDenseVectorEvalCastingKnn("byte_vector"); + checkDenseVectorCastingKnn("bit_vector"); + checkDenseVectorCastingHexKnn("bit_vector"); + checkDenseVectorEvalCastingKnn("bit_vector"); } private static void checkDenseVectorCastingKnn(String fieldName) { @@ -2535,9 +2527,7 @@ private void checkDenseVectorEvalCastingSimilarityFunction(String similarityFunc } public void testVectorFunctionHexImplicitCastingError() { - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkVectorFunctionHexImplicitCastingError("where knn(float_vector, \"notcorrect\")"); - } + checkVectorFunctionHexImplicitCastingError("where knn(float_vector, \"notcorrect\")"); if (EsqlCapabilities.Cap.DOT_PRODUCT_VECTOR_SIMILARITY_FUNCTION.isEnabled()) { checkVectorFunctionHexImplicitCastingError("eval s = v_dot_product(\"notcorrect\", 0.342)"); } @@ -3920,7 +3910,6 @@ public void testTextEmbeddingFunctionWithoutModel() { } public void testKnnFunctionWithTextEmbedding() { - assumeTrue("KNN function capability required", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); assumeTrue("TEXT_EMBEDDING function required", EsqlCapabilities.Cap.TEXT_EMBEDDING_FUNCTION.isEnabled()); LogicalPlan plan = analyze( diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 305d495b21e62..3c9e5aa36f373 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1306,9 +1306,7 @@ public void testFieldBasedFullTextFunctions() throws Exception { checkFieldBasedWithNonIndexedColumn("Term", "term(text, \"cat\")", "function"); checkFieldBasedFunctionNotAllowedAfterCommands("Term", "function", "term(title, \"Meditation\")"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkFieldBasedFunctionNotAllowedAfterCommands("KNN", "function", "knn(vector, [1, 2, 3])"); - } + checkFieldBasedFunctionNotAllowedAfterCommands("KNN", "function", "knn(vector, [1, 2, 3])"); } private void checkFieldBasedFunctionNotAllowedAfterCommands(String functionName, String functionType, String functionInvocation) { @@ -1433,16 +1431,13 @@ public void testFullTextFunctionsOnlyAllowedInWhere() throws Exception { checkFullTextFunctionsOnlyAllowedInWhere("QSTR", "qstr(\"Meditation\")", "function"); checkFullTextFunctionsOnlyAllowedInWhere("KQL", "kql(\"Meditation\")", "function"); checkFullTextFunctionsOnlyAllowedInWhere("MatchPhrase", "match_phrase(title, \"Meditation\")", "function"); + checkFullTextFunctionsOnlyAllowedInWhere("KNN", "knn(vector, [0, 1, 2])", "function"); if (EsqlCapabilities.Cap.TERM_FUNCTION.isEnabled()) { checkFullTextFunctionsOnlyAllowedInWhere("Term", "term(title, \"Meditation\")", "function"); } if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { checkFullTextFunctionsOnlyAllowedInWhere("MultiMatch", "multi_match(\"Meditation\", title, body)", "function"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkFullTextFunctionsOnlyAllowedInWhere("KNN", "knn(vector, [0, 1, 2])", "function"); - } - } private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, String functionInvocation, String functionType) @@ -1488,15 +1483,13 @@ public void testFullTextFunctionsDisjunctions() { checkWithFullTextFunctionsDisjunctions("qstr(\"title: Meditation\")"); checkWithFullTextFunctionsDisjunctions("kql(\"title: Meditation\")"); checkWithFullTextFunctionsDisjunctions("match_phrase(title, \"Meditation\")"); + checkWithFullTextFunctionsDisjunctions("knn(vector, [1, 2, 3])"); if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { checkWithFullTextFunctionsDisjunctions("multi_match(\"Meditation\", title, body)"); } if (EsqlCapabilities.Cap.TERM_FUNCTION.isEnabled()) { checkWithFullTextFunctionsDisjunctions("term(title, \"Meditation\")"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkWithFullTextFunctionsDisjunctions("knn(vector, [1, 2, 3])"); - } } private void checkWithFullTextFunctionsDisjunctions(String functionInvocation) { @@ -1553,15 +1546,13 @@ public void testFullTextFunctionsWithNonBooleanFunctions() { checkFullTextFunctionsWithNonBooleanFunctions("QSTR", "qstr(\"title: Meditation\")", "function"); checkFullTextFunctionsWithNonBooleanFunctions("KQL", "kql(\"title: Meditation\")", "function"); checkFullTextFunctionsWithNonBooleanFunctions("MatchPhrase", "match_phrase(title, \"Meditation\")", "function"); + checkFullTextFunctionsWithNonBooleanFunctions("KNN", "knn(vector, [1, 2, 3])", "function"); if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { checkFullTextFunctionsWithNonBooleanFunctions("MultiMatch", "multi_match(\"Meditation\", title, body)", "function"); } if (EsqlCapabilities.Cap.TERM_FUNCTION.isEnabled()) { checkFullTextFunctionsWithNonBooleanFunctions("Term", "term(title, \"Meditation\")", "function"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkFullTextFunctionsWithNonBooleanFunctions("KNN", "knn(vector, [1, 2, 3])", "function"); - } } private void checkFullTextFunctionsWithNonBooleanFunctions(String functionName, String functionInvocation, String functionType) { @@ -1624,15 +1615,13 @@ public void testFullTextFunctionsTargetsExistingField() throws Exception { testFullTextFunctionTargetsExistingField("match(title, \"Meditation\")"); testFullTextFunctionTargetsExistingField("title : \"Meditation\""); testFullTextFunctionTargetsExistingField("match_phrase(title, \"Meditation\")"); + testFullTextFunctionTargetsExistingField("knn(vector, [0, 1, 2], 10)"); if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { testFullTextFunctionTargetsExistingField("multi_match(\"Meditation\", title)"); } if (EsqlCapabilities.Cap.TERM_FUNCTION.isEnabled()) { testFullTextFunctionTargetsExistingField("term(fist_name, \"Meditation\")"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - testFullTextFunctionTargetsExistingField("knn(vector, [0, 1, 2], 10)"); - } } private void testFullTextFunctionTargetsExistingField(String functionInvocation) throws Exception { @@ -2309,12 +2298,10 @@ public void testFullTextFunctionOptions() { checkOptionDataTypes(Match.ALLOWED_OPTIONS, "FROM test | WHERE match(title, \"Jean\", {\"%s\": %s})"); checkOptionDataTypes(QueryString.ALLOWED_OPTIONS, "FROM test | WHERE QSTR(\"title: Jean\", {\"%s\": %s})"); checkOptionDataTypes(MatchPhrase.ALLOWED_OPTIONS, "FROM test | WHERE MATCH_PHRASE(title, \"Jean\", {\"%s\": %s})"); + checkOptionDataTypes(Knn.ALLOWED_OPTIONS, "FROM test | WHERE KNN(vector, [0.1, 0.2, 0.3], {\"%s\": %s})"); if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { checkOptionDataTypes(MultiMatch.OPTIONS, "FROM test | WHERE MULTI_MATCH(\"Jean\", title, body, {\"%s\": %s})"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkOptionDataTypes(Knn.ALLOWED_OPTIONS, "FROM test | WHERE KNN(vector, [0.1, 0.2, 0.3], {\"%s\": %s})"); - } } /** @@ -2397,6 +2384,8 @@ public void testFullTextFunctionsNullArgs() throws Exception { checkFullTextFunctionNullArgs("kql(null)", ""); checkFullTextFunctionNullArgs("match_phrase(null, \"query\")", "first"); checkFullTextFunctionNullArgs("match_phrase(title, null)", "second"); + checkFullTextFunctionNullArgs("knn(null, [0, 1, 2])", "first"); + checkFullTextFunctionNullArgs("knn(vector, null)", "second"); if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { checkFullTextFunctionNullArgs("multi_match(null, title)", "first"); checkFullTextFunctionNullArgs("multi_match(\"query\", null)", "second"); @@ -2405,10 +2394,6 @@ public void testFullTextFunctionsNullArgs() throws Exception { checkFullTextFunctionNullArgs("term(null, \"query\")", "first"); checkFullTextFunctionNullArgs("term(title, null)", "second"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkFullTextFunctionNullArgs("knn(null, [0, 1, 2])", "first"); - checkFullTextFunctionNullArgs("knn(vector, null)", "second"); - } } private void checkFullTextFunctionNullArgs(String functionInvocation, String argOrdinal) throws Exception { @@ -2433,12 +2418,10 @@ public void testFullTextFunctionsInStats() { checkFullTextFunctionsInStats("qstr(\"title: Meditation\")"); checkFullTextFunctionsInStats("kql(\"title: Meditation\")"); checkFullTextFunctionsInStats("match_phrase(title, \"Meditation\")"); + checkFullTextFunctionsInStats("knn(vector, [0, 1, 2])"); if (EsqlCapabilities.Cap.MULTI_MATCH_FUNCTION.isEnabled()) { checkFullTextFunctionsInStats("multi_match(\"Meditation\", title, body)"); } - if (EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()) { - checkFullTextFunctionsInStats("knn(vector, [0, 1, 2])"); - } } public void testDecayFunctionNullArgs() { @@ -2517,7 +2500,6 @@ public void testVectorSimilarityFunctionsNullArgs() throws Exception { } public void testFullTextFunctionsWithSemanticText() { - assumeTrue("requires knn function", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); checkFullTextFunctionsWithSemanticText("knn(semantic, [0, 1, 2])"); checkFullTextFunctionsWithSemanticText("match(semantic, \"hello world\")"); checkFullTextFunctionsWithSemanticText("semantic:\"hello world\""); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/KnnTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/KnnTests.java index 9871b9ce2e25e..17147ce60f82a 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/KnnTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/KnnTests.java @@ -11,7 +11,6 @@ import com.carrotsearch.randomizedtesting.annotations.ParametersFactory; import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.FieldAttribute; import org.elasticsearch.xpack.esql.core.expression.Literal; @@ -24,7 +23,6 @@ import org.elasticsearch.xpack.esql.expression.function.vector.Knn; import org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput; import org.elasticsearch.xpack.esql.optimizer.rules.physical.local.LucenePushdownPredicates; -import org.junit.Before; import java.util.ArrayList; import java.util.List; @@ -51,11 +49,6 @@ public static Iterable parameters() { return parameterSuppliersFromTypedData(addFunctionNamedParams(testCaseSuppliers())); } - @Before - public void checkCapability() { - assumeTrue("KNN is not enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - } - private static List testCaseSuppliers() { List suppliers = new ArrayList<>(); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index d53c370a572d5..5980ab3fa6a32 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -1384,8 +1384,6 @@ public void testMultiMatchOptionsPushDown() { } public void testKnnOptionsPushDown() { - assumeTrue("knn capability not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where KNN(dense_vector, [0.1, 0.2, 0.3], @@ -1410,8 +1408,6 @@ public void testKnnOptionsPushDown() { } public void testKnnUsesLimitForK() { - assumeTrue("knn capability not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where KNN(dense_vector, [0.1, 0.2, 0.3]) @@ -1428,8 +1424,6 @@ public void testKnnUsesLimitForK() { } public void testKnnKAndMinCandidatesLowerK() { - assumeTrue("knn capability not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where KNN(dense_vector, [0.1, 0.2, 0.3], {"min_candidates": 50}) @@ -1446,8 +1440,6 @@ public void testKnnKAndMinCandidatesLowerK() { } public void testKnnKAndMinCandidatesHigherK() { - assumeTrue("knn capability not available", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where KNN(dense_vector, [0.1, 0.2, 0.3], {"min_candidates": 10}) @@ -1905,8 +1897,6 @@ public void testFullTextFunctionWithStatsBy(FullTextFunctionTestCase testCase) { } public void testKnnPrefilters() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where knn(dense_vector, [0, 1, 2]) and integer > 10 @@ -1938,8 +1928,6 @@ public void testKnnPrefilters() { } public void testKnnPrefiltersWithMultipleFilters() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where knn(dense_vector, [0, 1, 2]) @@ -1975,8 +1963,6 @@ public void testKnnPrefiltersWithMultipleFilters() { } public void testPushDownConjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where knn(dense_vector, [0, 1, 2]) and integer > 10 @@ -2013,8 +1999,6 @@ public void testPushDownConjunctionsToKnnPrefilter() { } public void testPushDownNegatedConjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where knn(dense_vector, [0, 1, 2]) and NOT integer > 10 @@ -2051,8 +2035,6 @@ public void testPushDownNegatedConjunctionsToKnnPrefilter() { } public void testNotPushDownDisjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where knn(dense_vector, [0, 1, 2]) or integer > 10 @@ -2088,8 +2070,6 @@ public void testNotPushDownDisjunctionsToKnnPrefilter() { } public void testNotPushDownKnnWithNonPushablePrefilters() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where ((knn(dense_vector, [0, 1, 2]) AND integer > 10) and ((keyword == "test") or length(text) > 10)) @@ -2122,8 +2102,6 @@ public void testNotPushDownKnnWithNonPushablePrefilters() { } public void testPushDownComplexNegationsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where ((knn(dense_vector, [0, 1, 2]) or NOT integer > 10) @@ -2172,8 +2150,6 @@ and NOT ((keyword == "test") or knn(dense_vector, [4, 5, 6]))) } public void testMultipleKnnQueriesInPrefilters() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - String query = """ from test | where ((knn(dense_vector, [0, 1, 2]) or integer > 10) and ((keyword == "test") or knn(dense_vector, [4, 5, 6]))) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index 5453f3bcd7679..b98c825159215 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -8615,8 +8615,6 @@ public void testSampleNoPushDownChangePoint() { } public void testPushDownConjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test | where knn(dense_vector, [0, 1, 2]) and integer > 10 @@ -8635,8 +8633,6 @@ public void testPushDownConjunctionsToKnnPrefilter() { } public void testPushDownMultipleFiltersToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test | where knn(dense_vector, [0, 1, 2]) @@ -8658,8 +8654,6 @@ public void testPushDownMultipleFiltersToKnnPrefilter() { } public void testNotPushDownDisjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test | where knn(dense_vector, [0, 1, 2]) or integer > 10 @@ -8675,8 +8669,6 @@ public void testNotPushDownDisjunctionsToKnnPrefilter() { } public void testPushDownConjunctionsAndNotDisjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - /* and and @@ -8710,8 +8702,6 @@ public void testPushDownConjunctionsAndNotDisjunctionsToKnnPrefilter() { } public void testMorePushDownConjunctionsAndNotDisjunctionsToKnnPrefilter() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - /* or or @@ -8742,8 +8732,6 @@ public void testMorePushDownConjunctionsAndNotDisjunctionsToKnnPrefilter() { } public void testMultipleKnnQueriesInPrefilters() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - /* and or @@ -8785,8 +8773,6 @@ public void testMultipleKnnQueriesInPrefilters() { } public void testKnnImplicitLimit() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test | where knn(dense_vector, [0, 1, 2]) @@ -8800,8 +8786,6 @@ public void testKnnImplicitLimit() { } public void testKnnWithLimit() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test | where knn(dense_vector, [0, 1, 2]) @@ -8816,8 +8800,6 @@ public void testKnnWithLimit() { } public void testKnnWithTopN() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test metadata _score | where knn(dense_vector, [0, 1, 2]) @@ -8833,8 +8815,6 @@ public void testKnnWithTopN() { } public void testKnnWithMultipleLimitsAfterTopN() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test metadata _score | where knn(dense_vector, [0, 1, 2]) @@ -8853,8 +8833,6 @@ public void testKnnWithMultipleLimitsAfterTopN() { } public void testKnnWithMultipleLimitsCombined() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test metadata _score | where knn(dense_vector, [0, 1, 2]) @@ -8871,8 +8849,6 @@ public void testKnnWithMultipleLimitsCombined() { } public void testKnnWithMultipleClauses() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test metadata _score | where knn(dense_vector, [0, 1, 2]) and match(keyword, "test") @@ -8894,8 +8870,6 @@ public void testKnnWithMultipleClauses() { } public void testKnnWithStats() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - assertThat( typesError("from test | where knn(dense_vector, [0, 1, 2]) | stats c = count(*)"), containsString("Knn function must be used with a LIMIT clause") @@ -8903,8 +8877,6 @@ public void testKnnWithStats() { } public void testKnnWithRerankAmdTopN() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - assertThat(typesError(""" from test metadata _score | where knn(dense_vector, [0, 1, 2]) @@ -8915,8 +8887,6 @@ public void testKnnWithRerankAmdTopN() { } public void testKnnWithRerankAmdLimit() { - assumeTrue("knn must be enabled", EsqlCapabilities.Cap.KNN_FUNCTION_V5.isEnabled()); - var query = """ from test metadata _score | where knn(dense_vector, [0, 1, 2])