diff --git a/docs/reference/query-languages/esql/_snippets/functions/description/v_l2_norm.md b/docs/reference/query-languages/esql/_snippets/functions/description/v_l2_norm.md
new file mode 100644
index 0000000000000..5f02d973970ad
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/description/v_l2_norm.md
@@ -0,0 +1,6 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Description**
+
+Calculates the l2 norm between two dense_vectors.
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/examples/v_l2_norm.md b/docs/reference/query-languages/esql/_snippets/functions/examples/v_l2_norm.md
new file mode 100644
index 0000000000000..9d111420067a0
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/examples/v_l2_norm.md
@@ -0,0 +1,24 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Example**
+
+```esql
+ from colors
+ | eval similarity = v_l2_norm(rgb_vector, [0, 255, 255])
+ | sort similarity desc, color asc
+```
+
+| color:text | similarity:double |
+| --- | --- |
+| red | 441.6729431152344 |
+| maroon | 382.6669616699219 |
+| crimson | 376.36419677734375 |
+| orange | 371.68536376953125 |
+| gold | 362.8360595703125 |
+| black | 360.62445068359375 |
+| magenta | 360.62445068359375 |
+| yellow | 360.62445068359375 |
+| firebrick | 359.67486572265625 |
+| tomato | 351.0227966308594 |
+
+
diff --git a/docs/reference/query-languages/esql/_snippets/functions/layout/v_l2_norm.md b/docs/reference/query-languages/esql/_snippets/functions/layout/v_l2_norm.md
new file mode 100644
index 0000000000000..8cca7903f1a14
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/layout/v_l2_norm.md
@@ -0,0 +1,27 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+## `V_L2_NORM` [esql-v_l2_norm]
+```{applies_to}
+stack: development
+serverless: preview
+```
+
+**Syntax**
+
+:::{image} ../../../images/functions/v_l2_norm.svg
+:alt: Embedded
+:class: text-center
+:::
+
+
+:::{include} ../parameters/v_l2_norm.md
+:::
+
+:::{include} ../description/v_l2_norm.md
+:::
+
+:::{include} ../types/v_l2_norm.md
+:::
+
+:::{include} ../examples/v_l2_norm.md
+:::
diff --git a/docs/reference/query-languages/esql/_snippets/functions/parameters/v_l2_norm.md b/docs/reference/query-languages/esql/_snippets/functions/parameters/v_l2_norm.md
new file mode 100644
index 0000000000000..dc40de91316a3
--- /dev/null
+++ b/docs/reference/query-languages/esql/_snippets/functions/parameters/v_l2_norm.md
@@ -0,0 +1,10 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+**Parameters**
+
+`left`
+: first dense_vector to calculate l2 norm similarity
+
+`right`
+: second dense_vector to calculate l2 norm similarity
+
diff --git a/docs/reference/query-languages/esql/images/functions/v_l2_norm.svg b/docs/reference/query-languages/esql/images/functions/v_l2_norm.svg
new file mode 100644
index 0000000000000..ccae0c9ff1872
--- /dev/null
+++ b/docs/reference/query-languages/esql/images/functions/v_l2_norm.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
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
new file mode 100644
index 0000000000000..573de7891d893
--- /dev/null
+++ b/docs/reference/query-languages/esql/kibana/definition/functions/v_l2_norm.json
@@ -0,0 +1,12 @@
+{
+ "comment" : "This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.",
+ "type" : "scalar",
+ "name" : "v_l2_norm",
+ "description" : "Calculates the l2 norm between two dense_vectors.",
+ "signatures" : [ ],
+ "examples" : [
+ " from colors\n | eval similarity = v_l2_norm(rgb_vector, [0, 255, 255])\n | sort similarity desc, color asc"
+ ],
+ "preview" : true,
+ "snapshot_only" : true
+}
diff --git a/docs/reference/query-languages/esql/kibana/docs/functions/v_l2_norm.md b/docs/reference/query-languages/esql/kibana/docs/functions/v_l2_norm.md
new file mode 100644
index 0000000000000..519113f7351fb
--- /dev/null
+++ b/docs/reference/query-languages/esql/kibana/docs/functions/v_l2_norm.md
@@ -0,0 +1,10 @@
+% This is generated by ESQL's AbstractFunctionTestCase. Do not edit it. See ../README.md for how to regenerate it.
+
+### V L2 NORM
+Calculates the l2 norm between two dense_vectors.
+
+```esql
+ from colors
+ | eval similarity = v_l2_norm(rgb_vector, [0, 255, 255])
+ | sort similarity desc, color asc
+```
diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-l2-norm.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-l2-norm.csv-spec
new file mode 100644
index 0000000000000..c623a21ca6885
--- /dev/null
+++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-l2-norm.csv-spec
@@ -0,0 +1,90 @@
+ # Tests for l2_norm similarity function
+
+ similarityWithVectorField
+ required_capability: l2_norm_vector_similarity_function
+
+// tag::vector-l2-norm[]
+ from colors
+ | eval similarity = v_l2_norm(rgb_vector, [0, 255, 255])
+ | sort similarity desc, color asc
+// end::vector-l2-norm[]
+ | limit 10
+ | keep color, similarity
+ ;
+
+// tag::vector-l2-norm-result[]
+color:text | similarity:double
+red | 441.6729431152344
+maroon | 382.6669616699219
+crimson | 376.36419677734375
+orange | 371.68536376953125
+gold | 362.8360595703125
+black | 360.62445068359375
+magenta | 360.62445068359375
+yellow | 360.62445068359375
+firebrick | 359.67486572265625
+tomato | 351.0227966308594
+// end::vector-l2-norm-result[]
+;
+
+ similarityAsPartOfExpression
+ required_capability: l2_norm_vector_similarity_function
+
+ from colors
+ | eval score = round((1 + v_l2_norm(rgb_vector, [0, 255, 255]) / 2), 3)
+ | sort score desc, color asc
+ | limit 10
+ | keep color, score
+ ;
+
+color:text | score:double
+red | 221.836
+maroon | 192.333
+crimson | 189.182
+orange | 186.843
+gold | 182.418
+black | 181.312
+magenta | 181.312
+yellow | 181.312
+firebrick | 180.837
+tomato | 176.511
+;
+
+similarityWithLiteralVectors
+required_capability: l2_norm_vector_similarity_function
+
+row a = 1
+| eval similarity = round(v_l2_norm([1, 2, 3], [0, 1, 2]), 3)
+| keep similarity
+;
+
+similarity:double
+1.732
+;
+
+ similarityWithStats
+ required_capability: l2_norm_vector_similarity_function
+
+ from colors
+ | eval similarity = round(v_l2_norm(rgb_vector, [0, 255, 255]), 3)
+ | stats avg = round(avg(similarity), 3), min = min(similarity), max = max(similarity)
+ ;
+
+avg:double | min:double | max:double
+274.974 | 0.0 | 441.673
+;
+
+# TODO Need to implement a conversion function to convert a non-foldable row to a dense_vector
+similarityWithRow-Ignore
+required_capability: l2_norm_vector_similarity_function
+
+row vector = [1, 2, 3]
+| eval similarity = round(v_l2_norm(vector, [0, 1, 2]), 3)
+| sort similarity desc, color asc
+| limit 10
+| keep color, similarity
+;
+
+similarity:double
+0.978
+;
diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java
index debe448834f8d..024763ba690db 100644
--- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java
+++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java
@@ -21,6 +21,7 @@
import org.elasticsearch.xpack.esql.action.AbstractEsqlIntegTestCase;
import org.elasticsearch.xpack.esql.action.EsqlCapabilities;
import org.elasticsearch.xpack.esql.expression.function.vector.L1Norm;
+import org.elasticsearch.xpack.esql.expression.function.vector.L2Norm;
import org.elasticsearch.xpack.esql.expression.function.vector.VectorSimilarityFunction.SimilarityEvaluatorFunction;
import org.junit.Before;
@@ -47,6 +48,9 @@ public static Iterable