定义
8.3版本新增。
$similarityEuclidean返回以数组或
binData值表示的两个数值向量之间的欧几里得距离。欧几里得距离测量向量空间中两点之间的直线距离。$similarityEuclidean有两种语法形式。简洁语法返回原始欧几里得距离:
{ $similarityEuclidean: [ <vector1>, <vector2> ] } 完整语法接受可选的规范化参数:
{ $similarityEuclidean: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } 使用完整语法时,
$similarityEuclidean接受以下字段:字段类型必要性说明vectors阵列
必需
恰好包含两个表达式的数组。每个表达式必须解析为一个数值大量或一个
binData值。两个向量必须具有相同的长度。score布尔
Optional
为
true时,使用公式1 / (1 + distance)返回(0, 1]范围内的规范化分数。相同的向量产生的分数为1。默认为false。有关表达式的更多信息,请参阅表达式。
行为
null 和缺失值
如果任一参数解析为null 或引用缺失字段,则$similarityEuclidean null会返回 。
返回值
$similarityEuclidean会返回double 。当score 为false (默认)时,结果为原始欧几里得距离,且始终大于或等于0 。距离为0 表示向量相同。值越大表示差异越大。
当 score 为 true 时,使用公式 1 / (1 + distance) 将结果标准化为范围(0, 1]:
1表示向量相同(距离为0)。值接近
0表示差异更大。
Errors
$similarityEuclidean 在以下情况下返回错误:
任一参数均未解析为大量或
binData值。输入数组或
binData值具有不同的长度。这两个大量都包含非数字元素。
例子
以下示例使用 vectors集合:
db.vectors.insertMany( [ { _id: 1, a: [1, 2, 3], b: [1, 2, 3] }, { _id: 2, a: [1, 2, 3], b: [3, 2, 1] }, { _id: 3, a: [1, 2, 3], b: [4, 5, 6] } ] )
以下聚合管道计算每个文档的 a 和 b 字段之间的欧几里得距离,并返回原始距离和归一化分数:
db.vectors.aggregate( [ { $project: { raw: { $similarityEuclidean: [ "$a", "$b" ] }, normalized: { $similarityEuclidean: { vectors: [ "$a", "$b" ], score: true } } } } ] )
操作返回以下结果:
{ _id: 1, raw: 0, normalized: 1 } { _id: 2, raw: 2.8284271247461903, normalized: 0.2612038749637415 } { _id: 3, raw: 5.196152422706632, normalized: 0.16139702886038895 }