目录
2.1.1 L2(欧几里得距离,Euclidean Distance)
2.1.2 COSINE(余弦相似度,Cosine Similarity)
一、问题分析
1.1展示报错:
fail to search on QueryNode 4: worker(4) query failed: metric type not match: invalid parameter[expected=COSINE][actual=L2]
1.2分析问问题:
- Collection 被创建时,使用的是
COSINE
作为metric_type
- 但
searchVector()
方法里,搜索时用了L2
- Milvus 要求搜索的
metric_type
必须和 Collection 的匹配,否则会报错。
createCollection()
方法里 vector
字段索引使用的是withMetricType(MetricType.COSINE)在 searchVector()
方法里用了withMetricType(MetricType.L2)
1.3正确做法:
- 统一 metric_type,保证创建和查询一致
- 要么在创建 Collection 时用
L2
- 要么在查询时改成
COSINE
二、概念解析
cosine和L2到底是什么?这两个参数有什么区别?
2.1 L2
和 COSINE
的区别
这两个参数 (MetricType.L2
和 MetricType.COSINE
) 是 Milvus 进行向量相似性搜索时用的距离度量方式,它们决定了 Milvus 如何计算两个向量之间的相似度。
2.1.1 L2
(欧几里得距离,Euclidean Distance)
适用于: 向量之间的“绝对”距离(比如图像特征、物理空间坐标)。
计算方式:
d(A,B)=(A1−B1)2+(A2−B2)2+...+(An−Bn)2d(A, B) = \sqrt{(A_1 - B_1)^2 + (A_2 - B_2)^2 + ... + (A_n - B_n)^2}d(A,B)=(A1−B1)2+(A2−B2)2+...+(An−Bn)2
L2
计算的是两点间的直线距离。- 适用于数值大小有意义的向量,比如 物理空间坐标、特征点匹配、3D 物体检测 等。
示例:
- 向量
A = (1, 2, 3)
,向量B = (4, 5, 6)
L2
计算:
(4−1)2+(5−2)2+(6−3)2=9+9+9=27=5.2\sqrt{(4-1)^2 + (5-2)^2 + (6-3)^2} = \sqrt{9 + 9 + 9} = \sqrt{27} = 5.2(4−1)2+(5−2)2+(6−3)2=9+9+9=27=5.2
L2
距离越小,相似度越高。
2.1.2 COSINE
(余弦相似度,Cosine Similarity)
适用于: 关注向量的方向而非大小(比如文本相似性、语义匹配)。
计算方式:
cosine similarity=A⋅B∣∣A∣∣×∣∣B∣∣\text{cosine similarity} = \frac{A \cdot B}{||A|| \times ||B||}cosine similarity=∣∣A∣∣×∣∣B∣∣A⋅B
COSINE
计算的是两个向量的夹角,不关注向量的大小,只看它们的方向是否相似。- 适用于文本嵌入(text embeddings)、推荐系统、NLP 任务 等。
示例:
- 向量
A = (1, 0)
,向量B = (0, 1)
- 余弦相似度计算:
(1×0+0×1)12+02×02+12=01=0\frac{(1\times0 + 0\times1)}{\sqrt{1^2 + 0^2} \times \sqrt{0^2 + 1^2}} = \frac{0}{1} = 012+02×02+12(1×0+0×1)=10=0
- 余弦相似度范围是
[-1, 1]
,值越接近1
,表示越相似。
COSINE
相似度越大(接近 1
),相似度越高。
二、L2
vs. COSINE
该用哪个?
适用场景 | L2 (欧几里得距离) | COSINE (余弦相似度) |
---|
关注 | 绝对距离 | 方向(相对关系) |
数值大小影响相似度? | 是 | 否 |
范围 | [0, ∞) ,数值越小越相似 | [-1, 1] ,值越接近 1 越相似 |
适合场景 | 图像搜索、物理坐标匹配、3D 建模 | 文本匹配、语义搜索、推荐系统 |
示例 | AI 视觉检测 、3D 物体匹配 | Chatbot 、搜索引擎 |
我的代码里是用文本向量搜索(文本匹配、知识库查询) 更适合用 COSINE
,因为:
- 文本向量的大小并不重要,关键是方向是否一致(即文本语义是否相似)。
L2
更适用于需要考虑向量数值大小的情况,而你的文本嵌入向量大小无关紧要。
三、补充
- 如果是文本搜索(知识库)
COSINE
- 如果是坐标匹配(图像搜索)
L2