Docs Menu
Docs Home
/ /

$scoreFusion (agregación)

Importante

$scoreFusion solo está disponible para implementaciones que utilizan MongoDB 8.2+.

$scoreFusion

$scoreFusion Primero ejecuta todas las canalizaciones de entrada de forma independiente y luego desduplica y combina los resultados de las canalizaciones de entrada en un conjunto de resultados finales puntuados.

$scoreFusion Genera un conjunto de documentos clasificados según sus puntuaciones y ponderaciones de sus canales de entrada. Puede especificar una expresión aritmética para calcular la puntuación basándose en las puntuaciones de entrada de la etapa del canal. De forma predeterminada, utiliza el promedio de las puntuaciones de los documentos de las diferentes etapas del canal de entrada.

Utilice $scoreFusion para buscar documentos en una sola colección basándose en múltiples criterios y recuperar un conjunto de resultados final que tenga en cuenta todos los criterios especificados.

La etapa tiene la siguiente sintaxis:

{ $scoreFusion: {
input: {
pipelines: {
<input-pipeline-name>: <expression>,
<input-pipeline-name>: <expression>,
...
},
normalization: "none|sigmoid|minMaxScaler"
},
combination: {
weights: {
<input-pipeline-name>: <numeric expression>,
<input-pipeline-name>: <numeric expression>,
...
},
method: "avg|expression",
expression: <expression>
}
} }

$scoreFusion toma los siguientes campos:

Campo
Tipo
Descripción

input

Objeto

Define la entrada que combina $scoreFusion.

input.
pipelines

Objeto

Contiene un mapa de nombres de canalización para las etapas de agregación que definen esa canalización. input.pipelines debe contener al menos una canalización. Debe especificar $score A la canalización de entrada si esta no devuelve una puntuación. Todas las canalizaciones deben operar en la misma colección y tener un nombre único.

Para obtener más información sobre las restricciones de las canalizaciones de entrada, consulte Canalizaciones de entrada y Nombres de canalizaciones de entrada.

input.
normalization

String

Normaliza la puntuación en el rango de 0 a 1 antes de combinar los resultados. El valor puede ser:

  • none - no normalizar.

  • sigmoid - para aplicar la $sigmoid expresión.

  • minMaxScaler - para aplicar el $minMaxScaler operador de ventana.

combination

Objeto

Opcional. Define cómo combinar los resultados del pipeline input.

combination.
weights

Objeto

Opcional. Ponderaciones que se aplicarán a las puntuaciones normalizadas de la canalización de entrada al combinar los resultados. Corresponden a las canalizaciones de entrada, una por canalización. La ponderación predeterminada es 1 si no se especifica la ponderación de alguna canalización. Cada valor de ponderación debe ser un número positivo (entero o decimal). La ponderación puede ser 0.

combination.
method

String

Opcional. Especifica el método para combinar puntuaciones. El valor puede ser:

  • avg - para calcular el promedio de las puntuaciones de entrada

  • expression - para aplicar una expresión de agregación personalizada que especifique en el campo combination.expression.

Si se omite, es por defecto avg.

combination.
expression

Expresión aritmética

Opcional. Especifica la lógica para combinar las puntuaciones de entrada. Esta es la expresión personalizada que se utiliza cuando combination.method se establece en expression. Dentro de la expresión, utilice el nombre de la canalización de entrada para representar la puntuación de entrada correspondiente a un documento.

Mutuamente excluyente con combination.weights.

scoreDetails

Booleano

Opcional. Especifica si se debe incluir información detallada de puntuación de cada canal de entrada en los metadatos del documento de salida. Si se omite, el valor predeterminado es false.

Solo se puede usar $scoreFusion con una sola colección. No se puede usar esta etapa de agregación en el ámbito de una base de datos.

$scoreFusion Desduplica los resultados de múltiples canales de entrada en la salida final. Cada documento de entrada único aparece como máximo una vez en la salida $scoreFusion, independientemente del número de veces que aparezca en las salidas del canal de entrada.

Cada canalización input debe ser a la vez una canalización de selección y una canalización de puntuación.

Una canalización de selección recupera un conjunto de documentos de una colección sin realizar ninguna modificación después de la recuperación. $scoreFusion compara documentos en diferentes canalizaciones de entrada, lo que requiere que todas las canalizaciones de entrada generen los mismos documentos sin modificar.

Una secuencia de selección solo debe contener las siguientes etapas:

Tipo
Etapas

Etapas de búsqueda

Si utiliza $geoNear en una secuencia de selección, no podrá especificar includeLogs o distanceField porque esos campos modifican los documentos.

Etapas de ordenamiento

Etapas de paginación

Una canalización de puntuación ordena los documentos según su puntuación. $scoreFusion utiliza el orden de los resultados de la canalización para influir en las puntuaciones de salida. Las canalizaciones de puntuación deben cumplir uno de los siguientes criterios:

  • Comience con una de las siguientes etapas ordenadas:

  • Contiene una $score etapa explícita si la canalización anterior no devuelve inherentemente una puntuación.

Los nombres de canalización en input deben cumplir las siguientes restricciones:

  • No debe ser una cadena vacía

  • No debe comenzar con una $

  • No debe contener el delimitador de carácter nulo ASCII \0 en ninguna parte de la cadena

  • No debe contener una .

Si establece scoreDetails en true, $scoreFusion crea un campo de metadatos scoreDetails para cada documento. El campo scoreDetails contiene información sobre la clasificación final.

Nota

Al establecer scoreDetails en true, $scoreFusion establece el campo de metadatos scoreDetails para cada documento. De forma predeterminada, no genera automáticamente el metacampo scoreDetails.

Para ver el scoreDetails campo de metadatos, debe configurarlo explícitamente a través de la $meta expresión en una etapa $project $addFieldscomo,$set o.

El campo scoreDetails contiene los siguientes subcampos:

Campo
Descripción

value

El valor numérico de la puntuación de este documento.

description

Una descripción de cómo $scoreFusion calculó la puntuación final.

normalization

El método de normalización utilizado para normalizar la puntuación.

combination

El método de combinación y la expresión utilizados para combinar los resultados de la canalización.

details

Una matriz donde cada entrada de la matriz contiene información sobre las tuberías de entrada que generan este documento.

Cada entrada de la matriz en el campo details contiene los siguientes subcampos:

Campo
Descripción

inputPipelineName

El nombre de la canalización de entrada que genera este documento.

inputPipelineRawScore

La puntuación del documento proveniente del pipeline antes de la normalización.

weight

El peso de la tubería de entrada.

value

Opcional. Si la canalización de entrada genera un { $meta: 'score' } para este documento, value contiene { $meta: 'score' }.

details

El campo scoreDetails de la canalización de entrada. Si la canalización de entrada no genera un campo scoreDetails, este campo es una matriz vacía.

Advertencia

MongoDB no garantiza ningún formato de salida específico para scoreDetails.

Ejemplo

Los siguientes bloques de código muestran el campo scoreDetails para una operación $scoreFusion con canales de entrada $search, $vectorSearch y $match:

scoreDetails: {
value: 7.847857250621068,
description: 'the value calculated by combining the scores (either normalized or raw) across input pipelines from which this document is output from:',
normalization: 'sigmoid',
combination: {
method: 'custom expression',
expression: "{ string: { $sum: [ { $multiply: [ '$$searchOne', 10 ] }, '$$searchTwo' ] } }"
},
details: [
{
inputPipelineName: 'searchOne',
inputPipelineRawScore: 0.7987099885940552,
weight: 1,
value: 0.6896984675751023,
details: []
},
{
inputPipelineName: 'searchTwo',
inputPipelineRawScore: 2.9629626274108887,
weight: 1,
value: 0.950872574870045,
details: []
}
]
}

MongoDB convierte las operaciones $scoreFusion en un conjunto de etapas de agregación existentes que, en combinación, computan el resultado de salida antes de la ejecución de la query. La Explicación de resultados para una operación $scoreFusion muestran la ejecución completa de las etapas de agregación subyacentes que $scoreFusion utiliza para componer el resultado final.

Este ejemplo utiliza una colección con incrustaciones y campos de texto. Cree índices de tipo search y vectorSearch en la colección.

La siguiente definición de índice indexa automáticamente todos los campos indexables dinámicamente en la colección para ejecutar consultas contra los campos $search indexados.

Índice de búsqueda
db.embedded_movies.createSearchIndex(
"<INDEX_NAME>",
{
mappings: { dynamic: true }
}
)

La siguiente definición de índice indexa el campo con las incrustaciones en la colección para ejecutar $vectorSearch consultas en ese campo.

Índice de búsqueda vectorial
db.embedded_movies.createSearchIndex(
"<INDEX_NAME>",
"vectorSearch",
{
"fields": [
{
"type": "vector",
"path": "<FIELD_NAME>",
"numDimensions": <NUMBER_OF_DIMENSIONS>,
"similarity": "dotProduct"
}
]
}
);

La siguiente canalización de agregación utiliza $scoreFusion con las siguientes canalizaciones de entrada:

Tubería
Número de documentos devueltos
Descripción

searchOne

20

Ejecuta una búsqueda vectorial en el campo indexado como tipo vector para el término especificado como incrustaciones. La consulta considera hasta 500 vecinos más cercanos, pero limita los resultados a 20 documentos.

searchTwo

20

Ejecuta una búsqueda de texto completo para el mismo término y limita los resultados a 20 documentos.

1db.embedded_movies.aggregate( [
2 {
3 $scoreFusion: {
4 input: {
5 pipelines: {
6 searchOne: [
7 {
8 "$vectorSearch": {
9 "index": "<INDEX_NAME>",
10 "path": "<FIELD_NAME>",
11 "queryVector": <QUERY_EMBEDDINGS>,
12 "numCandidates": <NUMBER_OF_NEAREST_NEIGHBORS_TO_CONSIDER>,
13 "limit": <NUBMER_OF_DOCUMENTS_TO_RETURN>
14 }
15 }
16 ],
17 searchTwo: [
18 {
19 "$search": {
20 "index": "<INDEX_NAME>",
21 "text": {
22 "query": "<QUERY_TERM>",
23 "path": "<FIELD_NAME>"
24 }
25 }
26 },
27 ]
28 },
29 normalization: "sigmoid"
30 },
31 combination: {
32 method: "expression",
33 expression: {
34 $sum: [
35 {$multiply: [ "$$searchOne", 10]}, "$$searchTwo"
36 ]
37 }
38 },
39 "scoreDetails": true
40 }
41 },
42 {
43 "$project": {
44 _id: 1,
45 title: 1,
46 plot: 1,
47 scoreDetails: {"$meta": "scoreDetails"}
48 }
49 },
50 { $limit: 20 }
51] )

Este pipeline realiza las siguientes acciones:

  • Ejecuta las canalizaciones input

  • Combina los resultados devueltos

  • Genera los primeros 20 documentos que son los resultados mejor clasificados 20 del pipeline $scoreFusion

Volver

$score

En esta página