Skip to content

Commit 5a0636a

Browse files
authored
ESQL - TO_DENSE_VECTOR function and additional casting (elastic#134003)
1 parent 1b92516 commit 5a0636a

File tree

29 files changed

+1274
-119
lines changed

29 files changed

+1274
-119
lines changed

docs/reference/query-languages/esql/_snippets/functions/description/to_dense_vector.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/to_dense_vector.md

Lines changed: 15 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/to_dense_vector.md

Lines changed: 23 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/to_dense_vector.md

Lines changed: 7 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/to_dense_vector.svg

Lines changed: 1 addition & 0 deletions
Loading

docs/reference/query-languages/esql/kibana/definition/functions/to_dense_vector.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/to_dense_vector.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.

x-pack/plugin/esql/qa/testFixtures/src/main/resources/dense_vector.csv-spec

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,59 @@ id:l | new_vector:dense_vector
4545
2 | [9.0, 8.0, 7.0]
4646
3 | [0.054, 0.032, 0.012]
4747
;
48+
49+
convertIntsToDenseVector
50+
required_capability: dense_vector_field_type
51+
required_capability: to_dense_vector_function
52+
53+
// tag::to_dense_vector-ints[]
54+
row ints = [1, 2, 3]
55+
| eval vector = to_dense_vector(ints)
56+
| keep vector
57+
// end::to_dense_vector-ints[]
58+
;
59+
60+
// tag::to_dense_vector-ints-result[]
61+
vector:dense_vector
62+
[1.0, 2.0, 3.0]
63+
// end::to_dense_vector-ints-result[]
64+
;
65+
66+
convertLongsToDenseVector
67+
required_capability: dense_vector_field_type
68+
required_capability: to_dense_vector_function
69+
70+
row longs = [5013792, 2147483647, 501379200000]
71+
| eval vector = to_dense_vector(longs)
72+
| keep vector
73+
;
74+
75+
vector:dense_vector
76+
[5013792.0, 2147483647.0, 501379200000.0]
77+
;
78+
79+
convertDoublesToDenseVector
80+
required_capability: dense_vector_field_type
81+
required_capability: to_dense_vector_function
82+
83+
row doubles = [123.4, 567.8, 901.2]
84+
| eval vector = to_dense_vector(doubles)
85+
| keep vector
86+
;
87+
88+
vector:dense_vector
89+
[123.4, 567.8, 901.2]
90+
;
91+
92+
convertHexStringToDenseVector
93+
required_capability: dense_vector_field_type
94+
required_capability: to_dense_vector_function
95+
96+
row hex_str = "0102030405060708090a0b0c0d0e0f"
97+
| eval vector = to_dense_vector(hex_str)
98+
| keep vector
99+
;
100+
101+
vector:dense_vector
102+
[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0]
103+
;

x-pack/plugin/esql/qa/testFixtures/src/main/resources/knn-function.csv-spec

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
# TODO Most tests explicitly set k. Until knn function uses LIMIT as k, we need to explicitly set it to all values
2-
# in the dataset to avoid test failures due to docs allocation in different shards, which can impact results for a
3-
# top-n query at the shard level
4-
51
knnSearch
62
required_capability: knn_function_v5
73

@@ -410,3 +406,52 @@ host:keyword | semantic_text_dense_field:text
410406
"host1" | live long and prosper
411407
;
412408

409+
410+
knnWithCasting
411+
required_capability: knn_function_v5
412+
required_capability: to_dense_vector_function
413+
414+
from colors metadata _score
415+
| eval query = to_dense_vector([0, 120, 0])
416+
| where knn(rgb_vector, query)
417+
| sort _score desc, color asc
418+
| keep color, rgb_vector
419+
| limit 10
420+
;
421+
422+
color:text | rgb_vector:dense_vector
423+
green | [0.0, 128.0, 0.0]
424+
black | [0.0, 0.0, 0.0]
425+
olive | [128.0, 128.0, 0.0]
426+
teal | [0.0, 128.0, 128.0]
427+
lime | [0.0, 255.0, 0.0]
428+
sienna | [160.0, 82.0, 45.0]
429+
maroon | [128.0, 0.0, 0.0]
430+
navy | [0.0, 0.0, 128.0]
431+
gray | [128.0, 128.0, 128.0]
432+
chartreuse | [127.0, 255.0, 0.0]
433+
;
434+
435+
knnWithHexStringCasting
436+
required_capability: knn_function_v5
437+
required_capability: to_dense_vector_function
438+
439+
from colors metadata _score
440+
| where knn(rgb_vector, "007800")
441+
| sort _score desc, color asc
442+
| keep color, rgb_vector
443+
| limit 10
444+
;
445+
446+
color:text | rgb_vector:dense_vector
447+
green | [0.0, 128.0, 0.0]
448+
black | [0.0, 0.0, 0.0]
449+
olive | [128.0, 128.0, 0.0]
450+
teal | [0.0, 128.0, 128.0]
451+
lime | [0.0, 255.0, 0.0]
452+
sienna | [160.0, 82.0, 45.0]
453+
maroon | [128.0, 0.0, 0.0]
454+
navy | [0.0, 0.0, 128.0]
455+
gray | [128.0, 128.0, 128.0]
456+
chartreuse | [127.0, 255.0, 0.0]
457+
;

x-pack/plugin/esql/qa/testFixtures/src/main/resources/vector-cosine-similarity.csv-spec

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,40 @@ total_null:long
9090
59
9191
;
9292

93-
# TODO Need to implement a conversion function to convert a non-foldable row to a dense_vector
94-
similarityWithRow-Ignore
93+
similarityWithRow
9594
required_capability: cosine_vector_similarity_function
95+
required_capability: to_dense_vector_function
9696

97-
row vector = [1, 2, 3]
97+
row vector = to_dense_vector([1, 2, 3])
9898
| eval similarity = round(v_cosine(vector, [0, 1, 2]), 3)
99+
;
100+
101+
vector: dense_vector | similarity:double
102+
[1.0, 2.0, 3.0] | 0.978
103+
;
104+
105+
similarityWithVectorField
106+
required_capability: cosine_vector_similarity_function
107+
required_capability: to_dense_vector_function
108+
109+
from colors
110+
| where color != "black"
111+
| eval query = to_dense_vector([0, 255, 255])
112+
| eval similarity = v_cosine(rgb_vector, query)
99113
| sort similarity desc, color asc
100114
| limit 10
101115
| keep color, similarity
102116
;
103117

104-
similarity:double
105-
0.978
118+
color:text | similarity:double
119+
cyan | 1.0
120+
teal | 1.0
121+
turquoise | 0.9890533685684204
122+
aqua marine | 0.964962363243103
123+
azure | 0.916246771812439
124+
lavender | 0.9136701822280884
125+
mint cream | 0.9122757911682129
126+
honeydew | 0.9122424125671387
127+
gainsboro | 0.9082483053207397
128+
gray | 0.9082483053207397
106129
;

0 commit comments

Comments
 (0)