Docs Menu
Docs Home
/ /

$similarityDotProduct (operador de expresión)

Nuevo en la versión 8.3.

$similarityDotProduct

Devuelve 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.

$similarityDotProduct tiene 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, $similarityDotProduct acepta los siguientes campos:

Campo
Tipo
Necesidad
Descripción

vectors

Arreglo

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.

score

Booleano

Opcional

Cuando true, devuelve una puntuación normalizada utilizando la fórmula (1 + dotProduct) / 2. Por defecto está en false.

Para obtener más información sobre expresiones, vea expresión.

Si alguno de los argumentos se resuelve en null o se refiere a un campo inexistente, $similarityDotProduct devuelve null.

$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].

$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 binData tienen diferentes longitudes.

  • Cualquiera de los arreglos contiene elementos no numéricos.

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 }

Volver

$similarityCosine

En esta página