Definição
Novidades na versão 8.3.
$similarityEuclideanRetorna a distância euclideana entre dois vetores numéricos representados como arrays ou valores
binData. A distância euclideana mede a distância em linha reta entre dois pontos no espaço vetorial.$similarityEuclideantem dois formatos de sintaxe .A sintaxe concisa retorna uma distância euclideana bruta:
{ $similarityEuclidean: [ <vector1>, <vector2> ] } A sintaxe completa aceita um parâmetro de normalização opcional:
{ $similarityEuclidean: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Ao utilizar a sintaxe completa, o aceita os seguintes
$similarityEuclideancampos: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 no intervalo(0, 1]usando a fórmula1 / (1 + distance). Vetores idênticos produzem uma pontuação de1. 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, $similarityEuclidean nullretornará.
Valor de retorno
$similarityEuclidean retorna double um. Quando score é false (o padrão), o resultado é a distância euclideana bruta, que é sempre maior ou igual 0 a. Uma distância de 0 significa que os vetores são idênticos. Valores maiores indicam maior disparidade.
Quando score é true, o resultado é normalizado para o intervalo (0, 1] utilizando a fórmula 1 / (1 + distance):
1indica que os vetores são idênticos (a distância é0).Valores próximos a
0indicam maior disparidade.
Errors
$similarityEuclidean 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 seguinte pipeline de agregação calcula a distância euclideana entre os campos a e b para cada documento e retorna a distância bruta e a pontuação normalizada:
db.vectors.aggregate( [ { $project: { raw: { $similarityEuclidean: [ "$a", "$b" ] }, normalized: { $similarityEuclidean: { vectors: [ "$a", "$b" ], score: true } } } } ] )
A operação retorna os seguintes resultados:
{ _id: 1, raw: 0, normalized: 1 } { _id: 2, raw: 2.8284271247461903, normalized: 0.2612038749637415 } { _id: 3, raw: 5.196152422706632, normalized: 0.16139702886038895 }