Skip to content

Commit edc3a64

Browse files
authored
ES|QL brute force l2_norm vector function (#132025)
1 parent 4107918 commit edc3a64

File tree

16 files changed

+329
-1
lines changed

16 files changed

+329
-1
lines changed

docs/reference/query-languages/esql/_snippets/functions/description/v_l2_norm.md

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/examples/v_l2_norm.md

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/layout/v_l2_norm.md

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/_snippets/functions/parameters/v_l2_norm.md

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/images/functions/v_l2_norm.svg

Lines changed: 1 addition & 0 deletions
Loading

docs/reference/query-languages/esql/kibana/definition/functions/v_l2_norm.json

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/reference/query-languages/esql/kibana/docs/functions/v_l2_norm.md

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Tests for l2_norm similarity function
2+
3+
similarityWithVectorField
4+
required_capability: l2_norm_vector_similarity_function
5+
6+
// tag::vector-l2-norm[]
7+
from colors
8+
| eval similarity = v_l2_norm(rgb_vector, [0, 255, 255])
9+
| sort similarity desc, color asc
10+
// end::vector-l2-norm[]
11+
| limit 10
12+
| keep color, similarity
13+
;
14+
15+
// tag::vector-l2-norm-result[]
16+
color:text | similarity:double
17+
red | 441.6729431152344
18+
maroon | 382.6669616699219
19+
crimson | 376.36419677734375
20+
orange | 371.68536376953125
21+
gold | 362.8360595703125
22+
black | 360.62445068359375
23+
magenta | 360.62445068359375
24+
yellow | 360.62445068359375
25+
firebrick | 359.67486572265625
26+
tomato | 351.0227966308594
27+
// end::vector-l2-norm-result[]
28+
;
29+
30+
similarityAsPartOfExpression
31+
required_capability: l2_norm_vector_similarity_function
32+
33+
from colors
34+
| eval score = round((1 + v_l2_norm(rgb_vector, [0, 255, 255]) / 2), 3)
35+
| sort score desc, color asc
36+
| limit 10
37+
| keep color, score
38+
;
39+
40+
color:text | score:double
41+
red | 221.836
42+
maroon | 192.333
43+
crimson | 189.182
44+
orange | 186.843
45+
gold | 182.418
46+
black | 181.312
47+
magenta | 181.312
48+
yellow | 181.312
49+
firebrick | 180.837
50+
tomato | 176.511
51+
;
52+
53+
similarityWithLiteralVectors
54+
required_capability: l2_norm_vector_similarity_function
55+
56+
row a = 1
57+
| eval similarity = round(v_l2_norm([1, 2, 3], [0, 1, 2]), 3)
58+
| keep similarity
59+
;
60+
61+
similarity:double
62+
1.732
63+
;
64+
65+
similarityWithStats
66+
required_capability: l2_norm_vector_similarity_function
67+
68+
from colors
69+
| eval similarity = round(v_l2_norm(rgb_vector, [0, 255, 255]), 3)
70+
| stats avg = round(avg(similarity), 3), min = min(similarity), max = max(similarity)
71+
;
72+
73+
avg:double | min:double | max:double
74+
274.974 | 0.0 | 441.673
75+
;
76+
77+
# TODO Need to implement a conversion function to convert a non-foldable row to a dense_vector
78+
similarityWithRow-Ignore
79+
required_capability: l2_norm_vector_similarity_function
80+
81+
row vector = [1, 2, 3]
82+
| eval similarity = round(v_l2_norm(vector, [0, 1, 2]), 3)
83+
| sort similarity desc, color asc
84+
| limit 10
85+
| keep color, similarity
86+
;
87+
88+
similarity:double
89+
0.978
90+
;

x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/vector/VectorSimilarityFunctionsIT.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.elasticsearch.xpack.esql.action.AbstractEsqlIntegTestCase;
2222
import org.elasticsearch.xpack.esql.action.EsqlCapabilities;
2323
import org.elasticsearch.xpack.esql.expression.function.vector.L1Norm;
24+
import org.elasticsearch.xpack.esql.expression.function.vector.L2Norm;
2425
import org.elasticsearch.xpack.esql.expression.function.vector.VectorSimilarityFunction.SimilarityEvaluatorFunction;
2526
import org.junit.Before;
2627

@@ -47,6 +48,9 @@ public static Iterable<Object[]> parameters() throws Exception {
4748
if (EsqlCapabilities.Cap.L1_NORM_VECTOR_SIMILARITY_FUNCTION.isEnabled()) {
4849
params.add(new Object[] { "v_l1_norm", (SimilarityEvaluatorFunction) L1Norm::calculateSimilarity });
4950
}
51+
if (EsqlCapabilities.Cap.L2_NORM_VECTOR_SIMILARITY_FUNCTION.isEnabled()) {
52+
params.add(new Object[] { "v_l2_norm", (SimilarityEvaluatorFunction) L2Norm::calculateSimilarity });
53+
}
5054

5155
return params;
5256
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,11 @@ public enum Cap {
13221322
*/
13231323
L1_NORM_VECTOR_SIMILARITY_FUNCTION(Build.current().isSnapshot()),
13241324

1325+
/**
1326+
* l2 norm vector similarity function
1327+
*/
1328+
L2_NORM_VECTOR_SIMILARITY_FUNCTION(Build.current().isSnapshot()),
1329+
13251330
/**
13261331
* Support for the options field of CATEGORIZE.
13271332
*/

0 commit comments

Comments
 (0)