Installation
MySQL > INSTALL COMPONENT "file://component_community_vector";
Community
MySQL Vector Distance functions for the Community Edition
MySQL > INSTALL COMPONENT "file://component_community_vector";
Straight-line (L2) distance: sqrt(Σ (v1[i] - v2[i])²).
SELECT VECTOR_EUCLIDIAN_DISTANCE(@a, @b);
-- 5.196152210235596
Dot product of the two vectors: Σ v1[i] * v2[i].
SELECT VECTOR_DOTPRODUCT_DISTANCE(@a, @b);
-- 32
1 - cosine_similarity. Returns an error if one of the vectors is the zero
vector.
SELECT VECTOR_COSINE_DISTANCE(@a, @b);
-- 0.025368154048919678
L1 distance: Σ |v1[i] - v2[i]|.
SELECT VECTOR_MANHATTAN_DISTANCE(@a, @b);
-- 9
Largest difference in any dimension: max |v1[i] - v2[i]|.
SELECT VECTOR_CHEBYSHEV_DISTANCE(@a, @b);
-- 3
Treats each dimension as set membership (non-zero = present):1 - |intersection| / |union|.
SELECT VECTOR_JACCARD_DISTANCE(STRING_TO_VECTOR('[1,0,1,1]'),
STRING_TO_VECTOR('[1,1,0,1]'));
-- 0.5
Number of dimensions where the values differ. Returns an integer.
SELECT VECTOR_HAMMING_DISTANCE(STRING_TO_VECTOR('[1,0,1,1]'),
STRING_TO_VECTOR('[1,1,0,1]'));
-- 2
Σ |v1[i] - v2[i]| / (|v1[i]| + |v2[i]|). Dimensions where both values are 0 are skipped.
SELECT VECTOR_CANBERRA_DISTANCE(@a, @b);
-- 1.3619048595428467
Generalized distance (Σ |v1[i] - v2[i]|^p)^(1/p). p must be a decimal or
float literal (for example 3.0 or 3.0e0). With p = 1 this is the Manhattan
distance, and with p = 2 it is the Euclidean distance.
SELECT VECTOR_MINKOWSKI_DISTANCE(@a, @b, 3.0);
-- 4.326748847961426
These functions expect vectors that represent probability distributions:
non-negative values that sum to 1.
SET @p = STRING_TO_VECTOR('[0.1,0.4,0.5]');
SET @q = STRING_TO_VECTOR('[0.2,0.3,0.5]');
-ln(Σ sqrt(p[i] * q[i])).
SELECT VECTOR_BHATTACHARYYA_DISTANCE(@p, @q);
-- 0.012243108823895454
sqrt(Σ (sqrt(p[i]) - sqrt(q[i]))²) / sqrt(2). The result is between 0 and 1.
SELECT VECTOR_HELLINGER_DISTANCE(@p, @q);
-- 0.11031083762645721
Σ p[i] * ln(p[i] / q[i]). Dimensions where either value is 0 are skipped.
The result is not symmetric: KL(p, q) ≠ KL(q, p).
SELECT VECTOR_KULLBACK_LEIBLER_DIVERGENCE(@p, @q);
-- 0.04575808718800545
Symmetric, smoothed version of Kullback-Leibler:½ KL(p, m) + ½ KL(q, m) where m = ½ (p + q).
SELECT VECTOR_JENSEN_SHANNON_DIVERGENCE(@p, @q);
-- 0.012078598141670227
Element-wise sum.
SELECT VECTOR_TO_STRING(VECTOR_ADDITION(@a, @b));
-- [5.00000e+00,7.00000e+00,9.00000e+00]
Element-wise difference v1 - v2.
SELECT VECTOR_TO_STRING(VECTOR_SUBTRACTION(@a, @b));
-- [-3.00000e+00,-3.00000e+00,-3.00000e+00]
Multiplies each element by scalar. scalar must be a decimal or float
literal (for example 2.5 or 2.5e0).
SELECT VECTOR_TO_STRING(VECTOR_SCALAR_MULTIPLICATION(@a, 2.5));
-- [2.50000e+00,5.00000e+00,7.50000e+00]
Element-wise (Hadamard) product. To get the scalar dot product, useVECTOR_DOTPRODUCT_DISTANCE().
SELECT VECTOR_TO_STRING(VECTOR_DOT_PRODUCT(@a, @b));
-- [4.00000e+00,1.00000e+01,1.80000e+01]
Cross product. Only defined for 3-dimensional vectors.
SELECT VECTOR_TO_STRING(VECTOR_CROSS_PRODUCT(STRING_TO_VECTOR('[1,0,0]'),
STRING_TO_VECTOR('[0,1,0]')));
-- [0.00000e+00,0.00000e+00,1.00000e+00]
Length (L2 norm) of the vector.
SELECT VECTOR_NORM(@a);
-- 3.7416574954986572
Scales the vector to unit length. Returns an error for the zero vector.
SELECT VECTOR_TO_STRING(VECTOR_NORMALIZE(@a));
-- [2.67261e-01,5.34522e-01,8.01784e-01]
Angle between two vectors. The default unit is radians.
SELECT VECTOR_ANGLE(@a, @b);
-- 0.22572623193264008
SELECT VECTOR_ANGLE(@a, @b, 'DEGREES');
-- 12.933160415131429
Projection of v1 onto v2: (v1·v2 / |v2|²) * v2.
SELECT VECTOR_TO_STRING(VECTOR_PROJECTION(@a, @b));
-- [1.66234e+00,2.07792e+00,2.49351e+00]
CREATE TABLE docs (
id INT PRIMARY KEY,
embedding VECTOR(3)
);
INSERT INTO docs VALUES
(1, STRING_TO_VECTOR('[1,2,3]')),
(2, STRING_TO_VECTOR('[4,5,6]')),
(3, STRING_TO_VECTOR('[1,2,2.5]'));
SELECT id, VECTOR_COSINE_DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]')) AS dist
FROM docs
ORDER BY dist
LIMIT 2;
Notes updated 1 day by lefred.
No comments yet.
Sign in with GitHub to star, skull or comment on this plugin.