Definición
Nuevo en la versión 8.3.
$similarityEuclideanDevuelve la distancia euclidiana entre dos vectores numéricos representados como arreglos o valores
binData. La distancia euclidiana mide la distancia en línea recta entre dos puntos en el espacio vectorial.$similarityEuclideantiene dos formas de sintaxis.Sintaxis concisa devuelve una distancia euclidiana en crudo:
{ $similarityEuclidean: [ <vector1>, <vector2> ] } Sintaxis completa acepta un parámetro opcional de normalización:
{ $similarityEuclidean: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Al usar la sintaxis completa,
$similarityEuclideanacepta los siguientes campos:CampoTipoNecesidadDescripciónvectorsArreglo
Requerido
Arreglo de exactamente dos expresiones. Cada expresión debe resolverse en un arreglo de valores numéricos o un valor de
binData. Ambos vectores deben tener la misma longitud.scoreBooleano
Opcional
Cuando
true, devuelve una puntuación normalizada en el rango(0, 1]utilizando la fórmula1 / (1 + distance). Vectores idénticos producen una puntuación de1. El valor por defecto esfalse.Para obtener más información sobre expresiones, vea expresión.
Comportamiento
null y valores faltantes
Si alguno de los argumentos se resuelve en null o se refiere a un campo inexistente, $similarityEuclidean devuelve null.
Valor de retorno
$similarityEuclidean devuelve un double. Cuando score es false (el valor por defecto), el resultado es la distancia euclidiana cruda, que siempre es mayor o igual que 0. Una distancia de 0 significa que los vectores son idénticos. Valores mayores indican mayor disimilitud.
Cuando score es true, el resultado se normaliza al rango (0, 1] usando la fórmula 1 / (1 + distance):
1indica que los vectores son idénticos (la distancia es0).Valores cercanos a
0indican mayor disimilitud.
Errors
$similarityEuclidean devuelve un error en los siguientes casos:
Ningún argumento se resuelve en un arreglo o en un valor
binData.Los arreglos de entrada o los valores
binDatatienen diferentes longitudes.Cualquiera de los arreglos contiene elementos no numéricos.
Ejemplo
El siguiente ejemplo utiliza una colección 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] } ] )
La siguiente pipeline de agregación calcula la distancia euclidiana entre los campos a y b para cada documento y devuelve tanto la distancia bruta como la puntuación normalizada:
db.vectors.aggregate( [ { $project: { raw: { $similarityEuclidean: [ "$a", "$b" ] }, normalized: { $similarityEuclidean: { vectors: [ "$a", "$b" ], score: true } } } } ] )
La operación devuelve los siguientes resultados:
{ _id: 1, raw: 0, normalized: 1 } { _id: 2, raw: 2.8284271247461903, normalized: 0.2612038749637415 } { _id: 3, raw: 5.196152422706632, normalized: 0.16139702886038895 }