$rankFusion y $scoreFusion etapas están disponibles como funciones de vista previa. Para obtener más información, consulte Características de vista previa.Importante
$scoreFusion solo está disponible para implementaciones que utilizan MongoDB 8.2+.
Definición
$scoreFusion$scoreFusionPrimero 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.$scoreFusionGenera 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
$scoreFusionpara 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.
Sintaxis
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> } } }
Campos
$scoreFusion toma los siguientes campos:
Campo | Tipo | Descripción |
|---|---|---|
| Objeto | Define la entrada que combina |
input.pipelines | Objeto | Contiene un mapa de nombres de canalización para las etapas de agregación que definen esa canalización. 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
|
| Objeto | Opcional. Define cómo combinar los resultados del pipeline |
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 |
combination.method | String | Opcional. Especifica el método para combinar puntuaciones. El valor puede ser:
Si se omite, es por defecto |
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 Mutuamente excluyente con |
| 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 |
Comportamiento
Colecciones
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.
De-Duplication
$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.
Tuberías de entrada
Cada canalización input debe ser a la vez una canalización de selección y una canalización de puntuación.
Canal de selecció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 |
Etapas de ordenamiento | |
Etapas de paginación |
Canal de puntuació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:
Nombres de canalizaciones de entrada
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
\0en ninguna parte de la cadenaNo debe contener una
.
Detalles de la puntuación
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 |
|---|---|
| El valor numérico de la puntuación de este documento. |
| Una descripción de cómo |
| El método de normalización utilizado para normalizar la puntuación. |
| El método de combinación y la expresión utilizados para combinar los resultados de la canalización. |
| 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 |
|---|---|
| El nombre de la canalización de entrada que genera este documento. |
| La puntuación del documento proveniente del pipeline antes de la normalización. |
| El peso de la tubería de entrada. |
| Opcional. Si la canalización de entrada genera un |
| El campo |
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: [] } ] }
Explique los resultados
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.
Ejemplos
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.
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.
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 |
|---|---|---|
| 20 | Ejecuta una búsqueda vectorial en el campo indexado como tipo |
| 20 | Ejecuta una búsqueda de texto completo para el mismo término y limita los resultados a 20 documentos. |
1 db.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
inputCombina los resultados devueltos
Genera los primeros 20 documentos que son los resultados mejor clasificados 20 del pipeline
$scoreFusion