Definición
Nuevo en la versión 8.3.
$similarityDotProductDevuelve el producto escalar de dos vectores numéricos representados como matrices o valores
binData. El producto escalar es igual a la suma de los productos de los elementos correspondientes.$similarityDotProducttiene dos formas sintácticas.La sintaxis concisa devuelve una puntuación de producto escalar sin procesar:
{ $similarityDotProduct: [ <vector1>, <vector2> ] } La sintaxis completa acepta un parámetro de normalización opcional:
{ $similarityDotProduct: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Al utilizar la sintaxis completa, acepta los siguientes
$similarityDotProductcampos:CampoTipoNecesidadDescripciónvectorsArreglo
Requerido
Matriz de exactamente dos expresiones. Cada expresión debe resolverse en una matriz de valores numéricos o en un valor
binData. Ambos vectores deben tener la misma longitud.scoreBooleano
Opcional
Cuando
true, devuelve una puntuación normalizada usando la fórmula(1 + dotProduct) / 2. 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 hace referencia a un campo faltante, $similarityDotProduct nulldevuelve.
Valor de retorno
$similarityDotProduct devuelve double un. Cuando score es false (el valor predeterminado), el resultado es el producto escalar sin procesar. El valor depende de la magnitud de los vectores de entrada. Los vectores con mayor magnitud producen valores de producto escalar mayores.
Cuando score es true, el resultado se normaliza mediante la fórmula (1 + dotProduct) / 2. Esta normalización presupone vectores de entrada unitarios (normalizados). Para vectores unitarios, el producto escalar sin procesar se encuentra en el rango [-1, 1] y la puntuación normalizada en el rango [0, 1].
Errors
$similarityDotProduct Devuelve un error en los siguientes casos:
Ninguno de los argumentos se resuelve en una matriz o en un valor
binData.Los arrays de entrada o los valores
binDatatienen longitudes diferentes.Ambos arrays contienen 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 canalización 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 }