$rankFusion
e $scoreFusion
estão disponíveis como recursos de pré-visualização. Para saber mais, consulte Recursos de visualização.Importante
$scoreFusion
está disponível apenas para implementações que utilizam MongoDB 8.2+.
Definição
$scoreFusion
$scoreFusion
primeiro executa todos os pipelines de entrada de forma independente e, em seguida, deduplica e combina os resultados do pipeline de entrada em um conjunto de resultados de pontuação final.$scoreFusion
gera um conjunto classificado de documentos com base nas pontuações e pesos dos documentos de suas pipelines de entrada. Você pode especificar uma expressão aritmética para calcular a pontuação com base nas pontuações de entrada do estágio do pipeline. Por padrão, ele usa a média das pontuações dos documentos dos diferentes estágios do pipeline de entrada.Use
$scoreFusion
para pesquisar documentos em uma única collection com base em vários critérios e recuperar um conjunto de resultados de pontuação final que leva em conta todos os critérios especificados.
Sintaxe
O estágio tem a seguinte sintaxe:
{ $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
usa os seguintes campos:
Campo | Tipo | Descrição |
---|---|---|
| Objeto | Define a entrada que |
| Objeto | Contém um mapa de nomes de pipeline para os estágios de agregação que definem esse pipeline. Para obter mais informações sobre restrições de pipeline de entrada, consulte Pipelines de Entrada e Nomes de Pipeline de Entrada. |
| String | Normaliza a pontuação para o intervalo de
|
| Objeto | Opcional. Define como combinar os resultados do pipeline |
| Objeto | Opcional. Os pesos a serem aplicados às pontuações normalizadas do pipeline de entrada ao combinar os resultados. Corresponde aos pipelines de entrada, um por pipeline. O peso padrão é |
| String | Opcional. Especifica o método para combinar pontuações. O valor pode ser:
Se omitido, o padrão é |
| Expressão aritmética | Opcional. Especifica a lógica para combinar as pontuações de entrada. Esta é a expressão personalizada que é utilizada quando Mutualmente exclusivo com |
| Boolean | Opcional. Especifica se incluir informações de pontuação detalhadas de cada pipeline de entrada nos metadados do documento de saída. Se omitido, o padrão é |
Comportamento
Collections
Você só pode usar $scoreFusion
com uma única collection. Você não pode usar este estágio de agregação em um escopo de banco de dados .
De-Duplication
$scoreFusion
elimina a duplicação dos resultados em vários pipelines de entrada na saída final. Cada documento de entrada exclusivo aparece no máximo uma vez na saída $scoreFusion
, independentemente do número de vezes que o documento aparece nas saídas do pipeline de entrada.
Pipelines de Entrada
Cada pipeline input
deve ser um Pipeline de Seleção e um Pipeline de Pontuação.
Pipeline de seleção
Um pipeline de seleção recupera um conjunto de documentos de uma coleção sem realizar nenhuma modificação após a recuperação. $scoreFusion
compara documentos em diferentes pipelines de entrada, o que exige que todos os pipelines de entrada gerem os mesmos documentos não modificados.
Um pipeline de seleção deve conter apenas os seguintes estágios:
Tipo | Estágios |
---|---|
Estágios de pesquisa |
|
Estágios de pedidos | |
Estágios de paginação |
Pipeline de Pontuação
Um pipeline de pontuação classifica ou ordena documentos com base na pontuação dos documentos. $scoreFusion
usa a ordem dos resultados do pipeline com pontuação para influenciar as pontuações de saída. A pontuação dos pipelines deve atender a um dos seguintes critérios:
Nomes de Pipeline de Entrada
Os nomes de pipeline em input
devem atender às seguintes restrições:
Não deve ser uma string vazia
Não deve começar com um
$
Não deve conter o delimitador de caracteres ASCII nulo
\0
em qualquer lugar na stringNão deve conter um
.
detalhe da pontuação
Se você definir scoreDetails
como true
, $scoreFusion
criará um campo de metadados scoreDetails
para cada documento. O campo scoreDetails
contém informações sobre a classificação final.
Observação
Ao definir scoreDetails
como true
, $scoreFusion
define o campo de metadados scoreDetails
para cada documento. Por padrão, ele não gera automaticamente o metacampo scoreDetails
.
Para visualizar o campo de metadados scoreDetails
, você deve defini-lo explicitamente por meio da expressão$meta
em um estágio como$project
, $addFields
ou$set
.
O campo scoreDetails
contém os seguintes subcampos:
Campo | Descrição |
---|---|
| O valor numérico da pontuação para este documento. |
| Uma descrição de como |
| O método de normalização utilizado para normalizar a pontuação. |
| O método de combinação e a expressão usados para combinar os resultados do pipeline. |
| Uma array em que cada entrada da array contém informações sobre os pipelines de entrada que resultam neste documento. |
Cada entrada de array no campo details
contém os seguintes subcampos:
Campo | Descrição |
---|---|
| O nome do pipeline de entrada que gera este documento. |
| A pontuação do documento do pipeline antes da normalização. |
| O peso do pipeline de entrada. |
| Opcional. Se o pipeline de entrada gerar um |
| O campo |
Aviso
O MongoDB não garante nenhum formato de saída específico para scoreDetails
.
Exemplo
Os seguintes blocos de código mostram o campo scoreDetails
para uma operação $scoreFusion
com os pipelines de entrada $search
, $vectorSearch
e $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: [] } ] }
Explicação de resultados
O MongoDB converte $scoreFusion
operações de em um conjunto de estágios de agregação existentes que, em combinação, calculam o resultado de saída antes da execução da query. Os Resultados Explicados de uma $scoreFusion
operação mostram a execução completa dos estágios de agregação subjacentes que o $scoreFusion
usa para compor o resultado final.
Exemplos
Este exemplo utiliza uma coleção com incorporações e campos de texto. Crie search
e vectorSearch
índices de tipo na coleção.
A seguinte definição de índice indexa automaticamente todos os campos dinamicamente indexáveis na coleção para executar $search
queries do em relação aos campos indexados.
db.embedded_movies.createSearchIndex( "<INDEX_NAME>", { mappings: { dynamic: true } } )
A seguinte definição de índice indexa o campo com as incorporações na coleção para executar queries do neste $vectorSearch
campo.
db.embedded_movies.createSearchIndex( "<INDEX_NAME>", "vectorSearch", { "fields": [ { "type": "vector", "path": "<FIELD_NAME>", "numDimensions": <NUMBER_OF_DIMENSIONS>, "similarity": "dotProduct" } ] } );
O seguinte pipeline de agregação utiliza $scoreFusion
com os seguintes pipelines de entrada:
Pipeline | Número de documentos devolvidos | Descrição |
---|---|---|
| 20 | Executa uma pesquisa vetorial no campo indexado como tipo |
| 20 | Executa uma pesquisa de texto completo para o mesmo termo e limita os 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 executa as seguintes ações:
Executa os pipelines
input
Combina os resultados retornados
Gera os primeiros 20 documentos que são os 20 principais resultados classificados do
$scoreFusion
pipeline