diff --git a/docs/changelog/135604.yaml b/docs/changelog/135604.yaml
new file mode 100644
index 0000000000000..d91daf7325c96
--- /dev/null
+++ b/docs/changelog/135604.yaml
@@ -0,0 +1,5 @@
+pr: 135604
+summary: ES|QL - add `dense_vector` field type
+area: ES|QL
+type: feature
+issues: []
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/case.md b/docs/reference/query-languages/esql/_snippets/functions/types/case.md
index bb20353ebe7c7..dcc18f4f73660 100644
--- a/docs/reference/query-languages/esql/_snippets/functions/types/case.md
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/case.md
@@ -14,6 +14,8 @@
| boolean | date | | date |
| boolean | date_nanos | date_nanos | date_nanos |
| boolean | date_nanos | | date_nanos |
+| boolean | dense_vector | dense_vector | dense_vector |
+| boolean | dense_vector | | dense_vector |
| boolean | double | double | double |
| boolean | double | | double |
| boolean | geo_point | geo_point | geo_point |
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/knn.md b/docs/reference/query-languages/esql/_snippets/functions/types/knn.md
new file mode 100644
index 0000000000000..8b7a555d81665
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/knn.md
@@ -0,0 +1,9 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| field | query | options | result |
+| --- | --- | --- | --- |
+| dense_vector | dense_vector | named parameters | boolean |
+| text | dense_vector | named parameters | boolean |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/to_dense_vector.md b/docs/reference/query-languages/esql/_snippets/functions/types/to_dense_vector.md
new file mode 100644
index 0000000000000..6a7d025f6a43d
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/to_dense_vector.md
@@ -0,0 +1,11 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| field | result |
+| --- | --- |
+| double | dense_vector |
+| integer | dense_vector |
+| keyword | dense_vector |
+| long | dense_vector |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/to_string.md b/docs/reference/query-languages/esql/_snippets/functions/types/to_string.md
index 77fd3adaf8c56..1c63eb7b367e8 100644
--- a/docs/reference/query-languages/esql/_snippets/functions/types/to_string.md
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/to_string.md
@@ -9,6 +9,7 @@
| cartesian_shape | keyword |
| date | keyword |
| date_nanos | keyword |
+| dense_vector | keyword |
| double | keyword |
| geo_point | keyword |
| geo_shape | keyword |
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/v_cosine.md b/docs/reference/query-languages/esql/_snippets/functions/types/v_cosine.md
new file mode 100644
index 0000000000000..4d9804aae2395
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/v_cosine.md
@@ -0,0 +1,8 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| left | right | result |
+| --- | --- | --- |
+| dense_vector | dense_vector | double |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/v_dot_product.md b/docs/reference/query-languages/esql/_snippets/functions/types/v_dot_product.md
new file mode 100644
index 0000000000000..4d9804aae2395
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/v_dot_product.md
@@ -0,0 +1,8 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| left | right | result |
+| --- | --- | --- |
+| dense_vector | dense_vector | double |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/v_hamming.md b/docs/reference/query-languages/esql/_snippets/functions/types/v_hamming.md
new file mode 100644
index 0000000000000..4d9804aae2395
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/v_hamming.md
@@ -0,0 +1,8 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| left | right | result |
+| --- | --- | --- |
+| dense_vector | dense_vector | double |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/v_l1_norm.md b/docs/reference/query-languages/esql/_snippets/functions/types/v_l1_norm.md
new file mode 100644
index 0000000000000..4d9804aae2395
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/v_l1_norm.md
@@ -0,0 +1,8 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| left | right | result |
+| --- | --- | --- |
+| dense_vector | dense_vector | double |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/v_l2_norm.md b/docs/reference/query-languages/esql/_snippets/functions/types/v_l2_norm.md
new file mode 100644
index 0000000000000..4d9804aae2395
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/v_l2_norm.md
@@ -0,0 +1,8 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| left | right | result |
+| --- | --- | --- |
+| dense_vector | dense_vector | double |
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/types/v_magnitude.md b/docs/reference/query-languages/esql/_snippets/functions/types/v_magnitude.md
new file mode 100644
index 0000000000000..664cb86a5d11e
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/types/v_magnitude.md
@@ -0,0 +1,8 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Supported types**
+
+| input | result |
+| --- | --- |
+| dense_vector | double |
+
diff --git a/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md b/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md
index 0a1179d8b1218..333818f6d05d0 100644
--- a/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md
+++ b/docs/reference/query-languages/esql/_snippets/operators/types/is_not_null.md
@@ -12,6 +12,7 @@
| counter_long | boolean |
| date | boolean |
| date_nanos | boolean |
+| dense_vector | boolean |
| double | boolean |
| geo_point | boolean |
| geo_shape | boolean |
diff --git a/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md b/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md
index 0a1179d8b1218..333818f6d05d0 100644
--- a/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md
+++ b/docs/reference/query-languages/esql/_snippets/operators/types/is_null.md
@@ -12,6 +12,7 @@
| counter_long | boolean |
| date | boolean |
| date_nanos | boolean |
+| dense_vector | boolean |
| double | boolean |
| geo_point | boolean |
| geo_shape | boolean |
diff --git a/docs/reference/query-languages/esql/images/functions/to_dense_vector.svg b/docs/reference/query-languages/esql/images/functions/to_dense_vector.svg
index 54304ee44b11f..36a8f66b3af2a 100644
--- a/docs/reference/query-languages/esql/images/functions/to_dense_vector.svg
+++ b/docs/reference/query-languages/esql/images/functions/to_dense_vector.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/case.json b/docs/reference/query-languages/esql/kibana/definition/functions/case.json
index 96a3089e7f63c..b37f20a21dff9 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/case.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/case.json
@@ -214,6 +214,48 @@
"variadic" : true,
"returnType" : "date_nanos"
},
+ {
+ "params" : [
+ {
+ "name" : "condition",
+ "type" : "boolean",
+ "optional" : false,
+ "description" : "A condition."
+ },
+ {
+ "name" : "trueValue",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "The value that’s returned when the corresponding condition is the first to evaluate to `true`. The default value is returned when no condition matches."
+ }
+ ],
+ "variadic" : true,
+ "returnType" : "dense_vector"
+ },
+ {
+ "params" : [
+ {
+ "name" : "condition",
+ "type" : "boolean",
+ "optional" : false,
+ "description" : "A condition."
+ },
+ {
+ "name" : "trueValue",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "The value that’s returned when the corresponding condition is the first to evaluate to `true`. The default value is returned when no condition matches."
+ },
+ {
+ "name" : "elseValue",
+ "type" : "dense_vector",
+ "optional" : true,
+ "description" : "The value that’s returned when no condition evaluates to `true`."
+ }
+ ],
+ "variadic" : true,
+ "returnType" : "dense_vector"
+ },
{
"params" : [
{
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 cd5541f8e7bfe..33845ebd490ce 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/knn.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/knn.json
@@ -3,7 +3,58 @@
"type" : "scalar",
"name" : "knn",
"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.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Field that the query will target. knn function can be used with dense_vector or semantic_text fields. Other text fields are not allowed"
+ },
+ {
+ "name" : "query",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Vector value to find top nearest neighbours for."
+ },
+ {
+ "name" : "options",
+ "type" : "function_named_parameters",
+ "mapParams" : "{name='boost', values=[2.5], description='Floating point number used to decrease or increase the relevance scores of the query.Defaults to 1.0.'}, {name='min_candidates', values=[10], description='The minimum number of nearest neighbor candidates to consider per shard while doing knn search. KNN may use a higher number of candidates in case the query can't use a approximate results. Cannot exceed 10,000. Increasing min_candidates tends to improve the accuracy of the final results. Defaults to 1.5 * LIMIT used for the query.'}, {name='rescore_oversample', values=[3.5], description='Applies the specified oversampling for rescoring quantized vectors. See [oversampling and rescoring quantized vectors](docs-content://solutions/search/vector/knn.md#dense-vector-knn-search-rescoring) for details.'}, {name='similarity', values=[0.01], description='The minimum similarity required for a document to be considered a match. The similarity value calculated relates to the raw similarity used, not the document score.'}",
+ "optional" : true,
+ "description" : "(Optional) kNN additional options as <>. See <> for more information."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "boolean"
+ },
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "text",
+ "optional" : false,
+ "description" : "Field that the query will target. knn function can be used with dense_vector or semantic_text fields. Other text fields are not allowed"
+ },
+ {
+ "name" : "query",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Vector value to find top nearest neighbours for."
+ },
+ {
+ "name" : "options",
+ "type" : "function_named_parameters",
+ "mapParams" : "{name='boost', values=[2.5], description='Floating point number used to decrease or increase the relevance scores of the query.Defaults to 1.0.'}, {name='min_candidates', values=[10], description='The minimum number of nearest neighbor candidates to consider per shard while doing knn search. KNN may use a higher number of candidates in case the query can't use a approximate results. Cannot exceed 10,000. Increasing min_candidates tends to improve the accuracy of the final results. Defaults to 1.5 * LIMIT used for the query.'}, {name='rescore_oversample', values=[3.5], description='Applies the specified oversampling for rescoring quantized vectors. See [oversampling and rescoring quantized vectors](docs-content://solutions/search/vector/knn.md#dense-vector-knn-search-rescoring) for details.'}, {name='similarity', values=[0.01], description='The minimum similarity required for a document to be considered a match. The similarity value calculated relates to the raw similarity used, not the document score.'}",
+ "optional" : true,
+ "description" : "(Optional) kNN additional options as <>. See <> for more information."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "boolean"
+ }
+ ],
"examples" : [
"from colors metadata _score\n| where knn(rgb_vector, [0, 120, 0])\n| sort _score desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/to_dense_vector.json b/docs/reference/query-languages/esql/kibana/definition/functions/to_dense_vector.json
index 932937bf10c6c..56949532a872c 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/to_dense_vector.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/to_dense_vector.json
@@ -3,10 +3,59 @@
"type" : "scalar",
"name" : "to_dense_vector",
"description" : "Converts a multi-valued input of numbers, or a hexadecimal string, to a dense_vector.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "double",
+ "optional" : false,
+ "description" : "multi-valued input of numbers or hexadecimal string to convert."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "dense_vector"
+ },
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "integer",
+ "optional" : false,
+ "description" : "multi-valued input of numbers or hexadecimal string to convert."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "dense_vector"
+ },
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "keyword",
+ "optional" : false,
+ "description" : "multi-valued input of numbers or hexadecimal string to convert."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "dense_vector"
+ },
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "long",
+ "optional" : false,
+ "description" : "multi-valued input of numbers or hexadecimal string to convert."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "dense_vector"
+ }
+ ],
"examples" : [
"row ints = [1, 2, 3]\n| eval vector = to_dense_vector(ints)\n| keep vector"
],
- "preview" : false,
- "snapshot_only" : true
+ "preview" : true,
+ "snapshot_only" : false
}
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/to_string.json b/docs/reference/query-languages/esql/kibana/definition/functions/to_string.json
index 7e81f967db12e..e95e4fc682a83 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/to_string.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/to_string.json
@@ -64,6 +64,18 @@
"variadic" : false,
"returnType" : "keyword"
},
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Input value. The input can be a single- or multi-valued column or an expression."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "keyword"
+ },
{
"params" : [
{
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_cosine.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_cosine.json
index f3b3df1d88c6a..aac52a2385ce3 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/v_cosine.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_cosine.json
@@ -3,7 +3,26 @@
"type" : "scalar",
"name" : "v_cosine",
"description" : "Calculates the cosine similarity between two dense_vectors.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "left",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "first dense_vector to calculate cosine similarity"
+ },
+ {
+ "name" : "right",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "second dense_vector to calculate cosine similarity"
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "double"
+ }
+ ],
"examples" : [
" from colors\n | where color != \"black\"\n | eval similarity = v_cosine(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_dot_product.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_dot_product.json
index 05b8f0aa1c3f7..a00eaf6dc8387 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/v_dot_product.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_dot_product.json
@@ -3,7 +3,26 @@
"type" : "scalar",
"name" : "v_dot_product",
"description" : "Calculates the dot product between two dense_vectors.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "left",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "first dense_vector to calculate dot product similarity"
+ },
+ {
+ "name" : "right",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "second dense_vector to calculate dot product similarity"
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "double"
+ }
+ ],
"examples" : [
" from colors\n | eval similarity = v_dot_product(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json
index 51e3660ae8650..6d9885918f5df 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_hamming.json
@@ -3,7 +3,26 @@
"type" : "scalar",
"name" : "v_hamming",
"description" : "Calculates the Hamming distance between two dense vectors.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "left",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "First dense_vector to use to calculate the Hamming distance"
+ },
+ {
+ "name" : "right",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Second dense_vector to use to calculate the Hamming distance"
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "double"
+ }
+ ],
"examples" : [
" from colors\n | eval similarity = v_hamming(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_l1_norm.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_l1_norm.json
index 2dcd2ac95c980..6cdf7ba32aacd 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/v_l1_norm.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_l1_norm.json
@@ -3,7 +3,26 @@
"type" : "scalar",
"name" : "v_l1_norm",
"description" : "Calculates the l1 norm between two dense_vectors.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "left",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "first dense_vector to calculate l1 norm similarity"
+ },
+ {
+ "name" : "right",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "second dense_vector to calculate l1 norm similarity"
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "double"
+ }
+ ],
"examples" : [
" from colors\n | eval similarity = v_l1_norm(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_l2_norm.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_l2_norm.json
index 573de7891d893..344d0c1746456 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/v_l2_norm.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_l2_norm.json
@@ -3,7 +3,26 @@
"type" : "scalar",
"name" : "v_l2_norm",
"description" : "Calculates the l2 norm between two dense_vectors.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "left",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "first dense_vector to calculate l2 norm similarity"
+ },
+ {
+ "name" : "right",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "second dense_vector to calculate l2 norm similarity"
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "double"
+ }
+ ],
"examples" : [
" from colors\n | eval similarity = v_l2_norm(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/functions/v_magnitude.json b/docs/reference/query-languages/esql/kibana/definition/functions/v_magnitude.json
index 2835d403e656e..1f69905176ed8 100644
--- a/docs/reference/query-languages/esql/kibana/definition/functions/v_magnitude.json
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_magnitude.json
@@ -3,7 +3,20 @@
"type" : "scalar",
"name" : "v_magnitude",
"description" : "Calculates the magnitude of a dense_vector.",
- "signatures" : [ ],
+ "signatures" : [
+ {
+ "params" : [
+ {
+ "name" : "input",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "dense_vector for which to compute the magnitude"
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "double"
+ }
+ ],
"examples" : [
" from colors\n | eval magnitude = v_magnitude(rgb_vector)\n | sort magnitude desc, color asc"
],
diff --git a/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json b/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json
index c3cc8fae2a14e..2243d4979ba69 100644
--- a/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json
+++ b/docs/reference/query-languages/esql/kibana/definition/operators/is_not_null.json
@@ -102,6 +102,18 @@
"variadic" : false,
"returnType" : "boolean"
},
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Value to check. It can be a single- or multi-valued column or an expression."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "boolean"
+ },
{
"params" : [
{
diff --git a/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json b/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json
index 08c98810ddede..11b7291b34afb 100644
--- a/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json
+++ b/docs/reference/query-languages/esql/kibana/definition/operators/is_null.json
@@ -102,6 +102,18 @@
"variadic" : false,
"returnType" : "boolean"
},
+ {
+ "params" : [
+ {
+ "name" : "field",
+ "type" : "dense_vector",
+ "optional" : false,
+ "description" : "Value to check. It can be a single- or multi-valued column or an expression."
+ }
+ ],
+ "variadic" : false,
+ "returnType" : "boolean"
+ },
{
"params" : [
{
diff --git a/server/src/main/resources/transport/definitions/referable/esql_dense_vector_created_version.csv b/server/src/main/resources/transport/definitions/referable/esql_dense_vector_created_version.csv
new file mode 100644
index 0000000000000..2752f57900f3e
--- /dev/null
+++ b/server/src/main/resources/transport/definitions/referable/esql_dense_vector_created_version.csv
@@ -0,0 +1 @@
+9183000
diff --git a/server/src/main/resources/transport/upper_bounds/9.2.csv b/server/src/main/resources/transport/upper_bounds/9.2.csv
index 0dde9b0f74618..f575dcaf4efa8 100644
--- a/server/src/main/resources/transport/upper_bounds/9.2.csv
+++ b/server/src/main/resources/transport/upper_bounds/9.2.csv
@@ -1 +1 @@
-inference_telemetry_added_semantic_text_stats,9182000
+esql_dense_vector_created_version,9183000
diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java
index c0ca5d18dc63d..75a6c36a1f052 100644
--- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java
+++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java
@@ -20,8 +20,10 @@
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT;
import static org.elasticsearch.xpack.esql.core.type.DataType.BOOLEAN;
import static org.elasticsearch.xpack.esql.core.type.DataType.DATETIME;
+import static org.elasticsearch.xpack.esql.core.type.DataType.DENSE_VECTOR;
import static org.elasticsearch.xpack.esql.core.type.DataType.IP;
import static org.elasticsearch.xpack.esql.core.type.DataType.NULL;
+import static org.elasticsearch.xpack.esql.core.type.DataType.isRepresentable;
import static org.elasticsearch.xpack.esql.core.type.DataType.isSpatialOrGrid;
public final class TypeResolutions {
@@ -75,17 +77,27 @@ public static TypeResolution isDate(Expression e, String operationName, ParamOrd
/**
* @see DataType#isRepresentable(DataType)
*/
- public static TypeResolution isRepresentableExceptCounters(Expression e, String operationName, ParamOrdinal paramOrd) {
- return isType(e, DataType::isRepresentable, operationName, paramOrd, "any type except counter types");
+ public static TypeResolution isRepresentableExceptCountersAndDenseVector(Expression e, String operationName, ParamOrdinal paramOrd) {
+ return isType(
+ e,
+ dt -> isRepresentable(dt) && dt != DENSE_VECTOR,
+ operationName,
+ paramOrd,
+ "any type except counter types or dense_vector"
+ );
}
- public static TypeResolution isRepresentableExceptCountersAndSpatial(Expression e, String operationName, ParamOrdinal paramOrd) {
+ public static TypeResolution isRepresentableExceptCountersSpatialAndDenseVector(
+ Expression e,
+ String operationName,
+ ParamOrdinal paramOrd
+ ) {
return isType(
e,
- (t) -> isSpatialOrGrid(t) == false && DataType.isRepresentable(t),
+ (t) -> isSpatialOrGrid(t) == false && DataType.isRepresentable(t) && t != DENSE_VECTOR,
operationName,
paramOrd,
- "any type except counter and spatial types"
+ "any type except counter, spatial types or dense_vector"
);
}
diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java
index b9f55f7985e84..4bd722992f524 100644
--- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java
+++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/plugin/EsqlCorePlugin.java
@@ -14,5 +14,4 @@
public class EsqlCorePlugin extends Plugin implements ExtensiblePlugin {
public static final FeatureFlag AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG = new FeatureFlag("esql_aggregate_metric_double");
- public static final FeatureFlag DENSE_VECTOR_FEATURE_FLAG = new FeatureFlag("esql_dense_vector");
}
diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java
index 7a7d5e15e5a9e..618f941a0214a 100644
--- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java
+++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/type/DataType.java
@@ -35,7 +35,6 @@
import static java.util.stream.Collectors.toMap;
import static org.elasticsearch.TransportVersions.INFERENCE_REQUEST_ADAPTIVE_RATE_LIMITING;
-import static org.elasticsearch.TransportVersions.ML_INFERENCE_SAGEMAKER_CHAT_COMPLETION;
/**
* This enum represents data types the ES|QL query processing layer is able to
@@ -323,12 +322,7 @@ public enum DataType implements Writeable {
* Fields with this type are dense vectors, represented as an array of double values.
*/
DENSE_VECTOR(
- builder().esType("dense_vector")
- .estimatedSize(4096)
- .createdVersion(
- // Version created just *after* we committed support for dense_vector
- ML_INFERENCE_SAGEMAKER_CHAT_COMPLETION
- )
+ builder().esType("dense_vector").estimatedSize(4096).createdVersion(DataTypesTransportVersions.ESQL_DENSE_VECTOR_CREATED_VERSION)
);
/**
@@ -349,8 +343,7 @@ public enum DataType implements Writeable {
*
*/
public static final Map UNDER_CONSTRUCTION = Map.ofEntries(
- Map.entry(AGGREGATE_METRIC_DOUBLE, EsqlCorePlugin.AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG),
- Map.entry(DENSE_VECTOR, EsqlCorePlugin.DENSE_VECTOR_FEATURE_FLAG)
+ Map.entry(AGGREGATE_METRIC_DOUBLE, EsqlCorePlugin.AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG)
);
private final String typeName;
@@ -955,4 +948,10 @@ Builder createdVersion(TransportVersion createdVersion) {
return this;
}
}
+
+ private static class DataTypesTransportVersions {
+ public static final TransportVersion ESQL_DENSE_VECTOR_CREATED_VERSION = TransportVersion.fromName(
+ "esql_dense_vector_created_version"
+ );
+ }
}
diff --git a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/BlockUtils.java b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/BlockUtils.java
index abc35d68a3d36..fa5f139c5c6a1 100644
--- a/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/BlockUtils.java
+++ b/x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/data/BlockUtils.java
@@ -9,6 +9,7 @@
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.common.Randomness;
+import org.elasticsearch.common.breaker.CircuitBreakingException;
import org.elasticsearch.compute.data.AggregateMetricDoubleBlockBuilder.AggregateMetricDoubleLiteral;
import org.elasticsearch.core.Releasable;
import org.elasticsearch.core.Releasables;
@@ -35,19 +36,24 @@ public record BuilderWrapper(Block.Builder builder, Consumer