Docs Menu
Docs Home
/ /

$rankFusion (agregación)

Importante

$rankFusion is only available for deployments that use MongoDB 8.0 or higher.

$rankFusion

$rankFusion first executes all input pipelines independently and then de-duplicates and combines the input pipeline results into a final ranked results set.

$rankFusion outputs a ranked set of documents based on the ranks the input documents appear in their input pipelines and the pipeline weights. This stage uses the Reciprocal Rank Fusion algorithm to rank the combined results of the input pipelines.

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

La etapa tiene la siguiente sintaxis:

{ $rankFusion: {
input: {
pipelines: {
<myPipeline1>: <expression>,
<myPipeline2>: <expression>,
...
}
},
combination: {
weights: {
<myPipeline1>: <numeric expression>,
<myPipeline2>: <numeric expression>,
...
}
},
scoreDetails: <bool>
} }

$rankFusion toma los siguientes campos:

Campo
Tipo
Descripción

input

Objeto

Define la entrada que clasifica $rankFusion.

input.
pipelines

Objeto

Contiene un mapa de nombres de canalización con las etapas de agregación que la definen. input.pipelines debe contener al menos una canalización. Todas las canalizaciones deben operar en la misma colección y tener un nombre único.

For more information on input pipeline restrictions, see Input Pipelines and Input Pipeline Names.

combination

Objeto

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

combination.
weights

Objeto

Opcional. Contiene un mapa de los nombres de canalización input con sus ponderaciones en relación con otras canalizaciones. Cada ponderación debe ser un número positivo (entero o decimal).

Si no especifica un peso, el valor predeterminado es 1.

scoreDetails

Booleano

El valor predeterminado es falso. Especifica si $rankFusion calcula y rellena el $scoreDetails campo de metadatos para cada documento de salida. Consulte la sección "scoreDetails" para obtener más información sobre este campo.

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

$rankFusion 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 $rankFusion, independientemente del número de veces que aparezca en las salidas del canal de entrada.

Cada canalización input debe ser tanto una canalización de selección como una canalización clasificada.

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. $rankFusion compara documentos en diferentes canalizaciones de entrada, lo que requiere que todas las canalizaciones de entrada generen los mismos documentos sin modificar.

Nota

Si desea modificar los documentos que busca con $rankFusion, realice esas modificaciones después de la etapa $rankFusion.

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 clasificada ordena los documentos. $rankFusion utiliza el orden de los resultados de la canalización clasificada para influir en la clasificación de los resultados. Las canalizaciones clasificadas deben cumplir uno de los siguientes criterios:

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 .

$rankFusion orders results according to the Reciprocal Rank Fusion (RRF) Formula. This stage places the RRF score for each document in the score metadata field of the output results. The RRF formula ranks documents with a combination of the following factors:

  • La colocación de documentos en los resultados de la tubería de entrada

  • La cantidad de veces que un documento aparece en diferentes canales de entrada

  • El weights de las canalizaciones de entrada.

Por ejemplo, si un documento tiene una clasificación alta en varios conjuntos de resultados de canalización, el puntaje RRF para ese documento sería más alto que si ese mismo documento tiene la misma clasificación en algunas canalizaciones de entrada, pero no está presente (o tiene una clasificación más baja) en las otras canalizaciones.

The Reciprocal Rank Fusion (RRF) Formula is equivalent to the following algebraic operation:

The reciprocal rank fusion formula
haga clic para ampliar

Nota

En esta fórmula, 60 es un parámetro de sensibilidad que determinó MongoDB.

La siguiente tabla contiene las variables que utiliza la fórmula RRF:

Variable
Descripción

D

El conjunto de documentos de resultados de toda la operación.

d

El documento para el cual se calcula la puntuación RRF.

R

El conjunto de rangos para las canalizaciones de entrada en las que aparece d.

r(d)

El rango del documento d en esta canalización de entrada.

w

El peso de la tubería de entrada en la que aparece d.

Cada término en la suma representa la aparición de un documento d en uno de los input pipelines. La puntuación total RRF para d es la suma de cada uno de estos términos en todos los pipelines de entrada en los que aparece d.

Considere una etapa de canalización $rankFusion con una canalización de entrada $search y una $vectorSearch.

Todas las canalizaciones de entrada generan los mismos documentos 3: Document1, Document2 y Document3.

La canalización $search clasifica los documentos en el siguiente orden:

  1. Document3

  2. Document2

  3. Document1

La canalización $vectorSearch clasifica los documentos en el siguiente orden:

  1. Document1

  2. Document2

  3. Document3.

rankFusion computes the RRF score for Document1 through the following operation:

RRFscore(Document1) = 1/(60 + search_rank_of_Document1) + (1/(60 + vectorSearch_rank_of_Document1))
RRFscore(Document1) = 1/63 + 1/61
RRFscore(Document1) = 0.0322664585

El campo de metadatos score para Document1 es 0.0322664585.

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

Nota

Cuando se establece scoreDetails en true, $rankFusion establece el campo de metadatos scoreDetails para cada documento, pero no genera automáticamente el metacampo scoreDetails.

Para ver el campo de metadatos scoreDetails, debe:

  • Utilice una etapa $project después $rankFusion de para proyectar el scoreDetails campo

  • Utilice una etapa $addFields después $rankFusion de para agregar el scoreDetails campo a la salida de su canalización

El campo scoreDetails contiene los siguientes subcampos:

Campo
Descripción

value

The numerical value of the RRF score for this document.

description

A description of how $rankFusion computed the RRF score.

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.

rank

El rango de este documento en la canalización de entrada. El rango es N/A en la salida de una etapa de la canalización si un documento devuelto en la salida de otra etapa de la canalización no está presente en la salida de esta etapa.

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' }.

description

Opcional. Si la canalización de entrada genera un campo description como parte del scoreDetails para este documento, details.description contendrá ese valor de campo.

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.

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

{
value: 0.030621785881252923,
description: "value output by reciprocal rank fusion algorithm, computed as sum of weight * (1 / (60 + rank)) across input pipelines from which this document is output, from:"
details: [
{
inputPipelineName: 'search',
rank: 2,
weight: 1,
value: 0.3876491287,
description: "sum of:",
details: [... omitted for brevity in this example ...]
},
{
inputPipelineName: 'vector',
rank: 9,
weight: 3,
value: 0.7793490886688232,
details: [ ]
},
{
inputPipelineName: 'match',
rank: 10,
weight: 1,
details: []
}
]
}

MongoDB convierte las operaciones $rankFusion 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 $rankFusion muestran la ejecución completa de las etapas de agregación subyacentes que $rankFusion 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(
"search_index",
{
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(
"vector_index",
"vectorSearch",
{
"fields": [
{
"type": "vector",
"path": "<FIELD_NAME>",
"numDimensions": <NUMBER_OF_DIMENSIONS>,
"similarity": "dotProduct"
}
]
}
);

La siguiente canalización de agregación utiliza $rankFusion 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 $rankFusion: {
4 input: {
5 pipelines: {
6 searchOne: [
7 {
8 "$vectorSearch": {
9 "index": "<INDEX_NAME>",
10 "path": "<FIELD_NAME>",
11 "queryVector": <QUERY_EMBEDDINGS>,
12 "numCandidates": 500,
13 "limit": 20
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 { "$limit": 20 }
28 ],
29 }
30 }
31 }
32 },
33 { $limit: 20 }
34] )

Esta operación 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 $rankFusion

Los ejemplos de Node.js en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Primeros pasos en la documentación del controlador de MongoDB Node.js.

Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $rankFusion a una canalización de agregación, utilice el Operador $rankFusion en un objeto de canalización.

Antes de ejecutar el siguiente ejemplo, debe crear un índice de búsqueda de Atlas llamado default. Incluya el siguiente código en su aplicación para crear un índice de búsqueda en la colección movies:

const index = {
name: "default",
definition: {
mappings: { dynamic: true }
}
}
const result = collection.createSearchIndex(index);

El siguiente ejemplo crea una etapa en la canalización que ejecuta dos pipelines, searchPlot y searchGenre, que realizan operaciones de $search usando el índice de búsqueda default. La etapa $rankFusion clasifica luego los resultados de búsqueda en base al peso asignado a cada pipeline $search y devuelve los resultados ordenados. La etapa $addFields incluye el campo scoreDetails en los documentos devueltos. El ejemplo luego ejecuta la canalización de agregación:

const pipeline = [
{
$rankFusion: {
input: {
pipelines: {
searchPlot: [
{
$search: {
index: "default",
text: { query: "space", path: "plot"}
}
}
],
searchGenre: [
{
$search: {
index: "default",
text: { query: "adventure", path: "genres" }
}
}
]
}
},
combination: { weights: {searchPlot: 0.6, searchGenre: 0.4} },
scoreDetails: true
}
},
{ $addFields: { scoreDetails: { $meta: "searchScoreDetails" } } }
];
const cursor = collection.aggregate(pipeline);
return cursor;

Volver

Activar o desactivar la salida del registro

En esta página