Definição
Novidades na versão 8.3.
$similarityDotProductRetorna o produto pontual de dois vetores numéricos representados como arrays ou valores
binData. O produto pontual é igual à soma dos produtos dos elementos correspondentes.$similarityDotProducttem dois formatos de sintaxe .A sintaxe concisa retorna uma pontuação bruta de produto pontual:
{ $similarityDotProduct: [ <vector1>, <vector2> ] } A sintaxe completa aceita um parâmetro de normalização opcional:
{ $similarityDotProduct: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Ao utilizar a sintaxe completa, o aceita os seguintes
$similarityDotProductcampos:CampoTiponecessidadeDescriçãovectorsArray
Obrigatório
Array de exatamente duas expressões. Cada expressão deve ser resolvida para uma array de valores numéricos ou um valor
binData. Ambos os vetores devem ter comprimento igual.scoreBoolean
Opcional
Quando
true, retorna uma pontuação normalizada usando a fórmula(1 + dotProduct) / 2. O padrão éfalse.Para mais informações sobre expressões, consulte Expressões do .
Comportamento
null e valores ausentes
Se qualquer um dos argumentos resultar em null ou se referir a um campo ausente, $similarityDotProduct nullretornará.
Valor de retorno
$similarityDotProduct retorna double um. Quando score é false (o padrão), o resultado é o produto pontual bruto. O valor depende da magnitude dos vetores de entrada. Vetores com magnitudes maiores produzem valores de produto de ponto maiores.
Quando score é true, o resultado é normalizado utilizando a fórmula (1 + dotProduct) / 2. Essa normalização pressupõe vetores de entrada de comprimento unitário (normalizado). Para vetores de comprimento unitário, o produto pontual bruto está na faixa [-1, 1] e a pontuação normalizada está na faixa [0, 1].
Errors
$similarityDotProduct retorna um erro nos seguintes casos:
Qualquer argumento não resulta em uma array ou no valor
binData.Arrays de entrada ou valores
binDatatêm comprimentos diferentes.Qualquer array contém elementos não numéricos.
Exemplo
O exemplo a seguir utiliza uma coleção 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] } ] )
O pipeline de agregação a seguir calcula o produto pontual entre os campos a e b de cada documento e retorna a pontuação bruta e a pontuação normalizada:
db.vectors.aggregate( [ { $project: { raw: { $similarityDotProduct: [ "$a", "$b" ] }, normalized: { $similarityDotProduct: { vectors: [ "$a", "$b" ], score: true } } } } ] )
A operação retorna os seguintes resultados:
{ _id: 1, raw: 14, normalized: 7.5 } { _id: 2, raw: 10, normalized: 5.5 } { _id: 3, raw: 32, normalized: 16.5 }