Definición
Nuevo en la versión 8.3.
$similarityDotProductDevuelve el producto escalar de dos vectores numéricos representados como arreglos o valores
binData. El producto escalar es igual a la suma de los productos de los elementos correspondientes.$similarityDotProducttiene dos formas de sintaxis.Sintaxis concisa devuelve una puntuación cruda del producto punto:
{ $similarityDotProduct: [ <vector1>, <vector2> ] } Sintaxis completa acepta un parámetro opcional de normalización:
{ $similarityDotProduct: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Al usar la sintaxis completa,
$similarityDotProductacepta 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 utilizando la fórmula(1 + dotProduct) / 2. Por defecto está enfalse.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, $similarityDotProduct devuelve null.
Valor de retorno
$similarityDotProduct devuelve un double. Cuando score es false (el valor por defecto), el resultado es el producto punto sin procesar. El valor depende de la magnitud de los vectores de entrada. Los vectores con magnitudes mayores producen valores de producto escalar mayores.
Cuando score es true, el resultado se normaliza utilizando la fórmula (1 + dotProduct) / 2. Esta normalización asume vectores de entrada de longitud unitaria (normalizados). Para los vectores de longitud unitaria, el producto escalar sin procesar está en el rango [-1, 1] y la puntuación normalizada está en el rango [0, 1].
Errors
$similarityDotProduct 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 el producto escalar entre los campos a y b para cada documento y devuelve tanto la puntuación bruta como la puntuación normalizada:
db.vectors.aggregate( [ { $project: { raw: { $similarityDotProduct: [ "$a", "$b" ] }, normalized: { $similarityDotProduct: { vectors: [ "$a", "$b" ], score: true } } } } ] )
La operación devuelve los siguientes resultados:
{ _id: 1, raw: 14, normalized: 7.5 } { _id: 2, raw: 10, normalized: 5.5 } { _id: 3, raw: 32, normalized: 16.5 }