Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / / /

Modificar a Pontuação

Nesta página

  • boost
  • Campos
  • Exemplos
  • constant
  • Exemplos
  • embedded
  • Campos
  • Exemplos
  • function
  • Expressões
  • Exemplos

As seguintes opções de modificação de pontuação estão disponíveis para todos os operadores. Para obter detalhes e exemplos, clique em qualquer uma das seguintes opções:

A opção boost multiplica a pontuação-base de um resultado por um determinado número ou pelo valor de um campo numérico nos documentos. Por exemplo, você pode usar o boost para aumentar a importância de determinados documentos correspondentes no resultado.

Observação

  • Você não pode usar as opções boost e constant juntas.

  • A opção boost com path é a mesma que multiplicar utilizando a opção function com uma expressão de caminho.

A opção boost tem os seguintes campos:

Campo
Tipo
necessidade
Descrição
value
float
Condicional
Número pelo qual multiplicar a pontuação base padrão. O valor deve ser um número positivo. value ou path é exigido, mas você não pode especificar ambos.
path
string
Condicional
Nome do campo numérico pelo qual multiplicar a pontuação-base padrão. path ou value é exigido, mas você não pode especificar ambos.
undefined
float
Opcional
Valor numérico a ser substituído por path se o campo numérico especificado por meio do path não for encontrado nos documentos. Se omitido, o padrão é 0. Você pode especificar isso somente se especificar path.

Os exemplos seguintes utilizam a coleção movies no banco de dados sample_mflix. Se você tiver o conjunto de dados de amostra em seu cluster, poderá criar o índice do Atlas Search default e executar as queries de exemplo em seu cluster.

As queries compostas de amostra demonstram como aumentar a importância de um critério de pesquisa em detrimento de outro. As queries incluem um estágio $project para excluir todos os campos, exceto title e score.

No exemplo abaixo, o operador composto utiliza um operador de texto para pesquisar o termo Helsinki nos campos plot e title. A query para o campo title utiliza score com a opção boost para multiplicar os resultados de pontuação por 3, conforme especificado no campo value.

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "should": [{
6 "text": {
7 "query": "Helsinki",
8 "path": "plot"
9 }
10 },
11 {
12 "text": {
13 "query": "Helsinki",
14 "path": "title",
15 "score": { "boost": { "value": 3 } }
16 }
17 }]
18 }
19 }
20 },
21 {
22 "$limit": 5
23 },
24 {
25 "$project": {
26 "_id": 0,
27 "title": 1,
28 "plot": 1,
29 "score": { "$meta": "searchScore" }
30 }
31 }
32])

Essa query retorna os seguintes resultados, nos quais a pontuação para documentos em que o title corresponde ao termo de consulta é multiplicada por 3 de seu valor base:

[
{
plot: 'Epic tale about two generations of men in a wealthy Finnish family, spanning from the 1960s all the way through the early 1990s. The father has achieved his position as director of the ...',
title: 'Kites Over Helsinki',
score: 12.2470121383667
},
{
plot: 'Alex is Finlander married to an Italian who works as a taxi driver in Berlin. One night in his taxi come two men with a briefcase full of money. Unluckily for Alex, they are being chased by...',
title: 'Helsinki-Naples All Night Long',
score: 9.56808090209961
},
{
plot: 'The recession hits a couple in Helsinki.',
title: 'Drifting Clouds',
score: 4.5660295486450195
},
{
plot: 'Two teenagers from Helsinki are sent on a mission by their drug dealer.',
title: 'Sairaan kaunis maailma',
score: 4.041563034057617
},
{
plot: 'A murderer tries to leave his criminal past in East Helsinki and make a new life for his family',
title: 'Bad Luck Love',
score: 3.6251673698425293
}
]

No exemplo abaixo, o operador composto utiliza um operador de texto para pesquisar o termo Helsinki nos campos plot e title. A query para o campo title utiliza score com a opção boost para multiplicar os resultados de pontuação pelo campo numérico imdb.rating em path. Se o campo numérico não for encontrado no path especificado , o operador multiplicará a pontuação dos documentos por 3.

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "should": [{
6 "text": {
7 "query": "Helsinki",
8 "path": "plot"
9 }
10 },
11 {
12 "text": {
13 "query": "Helsinki",
14 "path": "title",
15 "score": {
16 "boost": {
17 "path": "imdb.rating",
18 "undefined": 3
19 }
20 }
21 }
22 }]
23 }
24 }
25 },
26 {
27 "$limit": 5
28 },
29 {
30 "$project": {
31 "_id": 0,
32 "title": 1,
33 "plot": 1,
34 "score": { "$meta": "searchScore" }
35 }
36 }
37])

Essa query retorna os seguintes resultados, nos quais a pontuação dos documentos em que o campo title corresponde ao termo da query é multiplicada de seu valor base pelo valor do campo numérico imdb.rating ou 3, se o campo não for encontrado nos documentos:

[
{
plot: 'Epic tale about two generations of men in a wealthy Finnish family, spanning from the 1960s all the way through the early 1990s. The father has achieved his position as director of the ...',
title: 'Kites Over Helsinki',
score: 24.902257919311523
},
{
plot: 'Alex is Finlander married to an Italian who works as a taxi driver in Berlin. One night in his taxi come two men with a briefcase full of money. Unluckily for Alex, they are being chased by...',
title: 'Helsinki-Naples All Night Long',
score: 20.411907196044922
},
{
plot: 'The recession hits a couple in Helsinki.',
title: 'Drifting Clouds',
score: 4.5660295486450195
},
{
plot: 'Two teenagers from Helsinki are sent on a mission by their drug dealer.',
title: 'Sairaan kaunis maailma',
score: 4.041563034057617
},
{
plot: 'A murderer tries to leave his criminal past in East Helsinki and make a new life for his family',
title: 'Bad Luck Love',
score: 3.6251673698425293
}
]

A opção constant substitui a pontuação base por um número especificado.

Observação

Você não deve usar as opções constant e boost juntas.

O exemplo seguinte utiliza o índice padrão na collection sample_mflix.movies para fazer a query dos campos plot e title utilizando o operador composto. Na query, o operador text usa score com a opção constant para substituir todos os resultados da pontuação por 5 nos resultados que corresponderem à query somente do campo title.

1db.movies.aggregate([
2 {
3 "$search": {
4 "compound": {
5 "should": [{
6 "text": {
7 "query": "tower",
8 "path": "plot"
9 }
10 },
11 {
12 "text": {
13 "query": "tower",
14 "path": "title",
15 "score": { "constant": { "value": 5 } }
16 }
17 }]
18 }
19 }
20 },
21 {
22 "$limit": 5
23 },
24 {
25 "$project": {
26 "_id": 0,
27 "title": 1,
28 "plot": 1,
29 "score": { "$meta": "searchScore" }
30 }
31 }
32])

A query acima retorna os seguintes resultados, nos quais a pontuação para documentos que correspondem à query no campo title é substituída somente pelo valor constant especificado:

1[
2 {
3 plot: 'Several months after witnessing a murder, residents of Tower Block 31 find themselves being picked off by a sniper, pitting those lucky enough to be alive into a battle for survival.',
4 title: 'Tower Block',
5 score: 8.15460205078125
6 },
7 {
8 plot: "When a group of hard-working guys find out they've fallen victim to their wealthy employer's Ponzi scheme, they conspire to rob his high-rise residence.",
9 title: 'Tower Heist',
10 score: 5
11 },
12 {
13 plot: 'Toru Kojima and his friend Koji are young student boys with one thing in common - they both love to date older women. Koji is a playboy with several women, young and older, whereas Toru is a romantic with his heart set on on certain lady.',
14 title: 'Tokyo Tower',
15 score: 5
16 },
17 {
18 plot: 'A middle-aged mental patient suffering from a split personality travels to Italy where his two personalities set off all kinds of confusing developments.',
19 title: 'The Leaning Tower',
20 score: 5
21 },
22 {
23 plot: 'A documentary that questions the cost -- and value -- of higher education in the United States.',
24 title: 'Ivory Tower',
25 score: 5
26 }
27]

Observação

Você pode usar essa opção somente com o operador embeddedDocument.

A opção embedded permite a você configurar como:

  • Agregar as pontuações de vários documentos incorporados correspondentes.

  • Modifique a pontuação de um operador embeddedDocument depois de agregar as pontuações de documentos incorporados correspondentes.

Observação

A opção de tipo embeddedDocuments do Atlas Search, o operador embeddedDocument e a opção de pontuação embedded estão em modo de visualização. Quando um índice do Atlas Search em um conjunto de réplicas ou um único fragmento do MongoDB atinge 2.100.000.000 objetos de índice, o Atlas Search faz a transição do índice para um estado com falha e não passível de query. Uma solução para lidar com essa limitação entrará em vigor quando esse recurso estiver disponível para o público em geral. Para solucionar qualquer problema relacionado ao uso desse recurso, entre em contato com o Suporte. Para solicitar suporte para mais de 2.100.000.000 objetos de índice, vote a favor desta solicitação no Mecanismo de Feedback do MongoDB.

A opção embedded tem os seguintes campos:

Campo
Tipo
necessidade
Descrição
aggregate
string
Opcional

Configura como combinar pontuações de documentos incorporados correspondentes. O valor deve ser uma das seguintes estratégias de agregação:

  • sum - (Padrão) Soma a pontuação de todos os documentos incorporados correspondentes.

  • maximum - Escolhe a maior pontuação de todos os documentos incorporados correspondentes.

  • minimum - Escolha a pontuação menos alta de todos os documentos incorporados correspondentes.

  • mean - Escolhe a pontuação média (média aritmética) de todos os documentos incorporados correspondentes. O Atlas Search inclui pontuações de documentos incorporados correspondentes apenas ao calcular a média. O Atlas Search não conta os documentos incorporados que não satisfazem os predicados da query como documentos com pontuação zero.

Se omitido, este campo é padronizado como sum.

outerScore
Opcional
Especifica a modificação de pontuação a ser aplicada após a aplicação da estratégia de aggregation.

A consulta de exemplo a seguir usa um índice chamado default na coleção sample_analytics.transactions. O índice configura um tipo embeddedDocuments em documentos na matriz transactions e tipo string para campos transactions.symbol e transactions.transaction_code.

Exemplo

Índice de amostra
{
"mappings": {
"dynamic": true,
"fields": {
"transactions": {
"dynamic": true,
"fields": {
"symbol": {
"type": "string"
},
"transaction_code": {
"type": "string"
}
},
"type": "embeddedDocuments"
}
}
}
}

A consulta de exemplo no campo transactions, que contém uma matriz de documentos, inclui um estágio $limit para limitar a saída a 10 resultados e um estágio $project para:

  • Excluir todos os campos, exceto account_id e transaction_count.

  • Adicione um campo denominado score que aplica uma estratégia de aggregation e uma modificação de pontuação adicional.

    Observação

    Você pode usar function dentro da opção score do operator do operador embeddedDocument. No entanto, para expressões de pontuação de função que exigem a opção path, o campo numérico que você especifica como path para a expressão deve estar dentro do path do operador embeddedDocument. Por exemplo, na consulta de exemplo a seguir, o campo transactions.amount especificado dentro da score opção do compound operador na linha 24 está dentro no embeddedDocument caminho do operador transactions na linha 4.

A query procura contas que compraram AMD e multiplica a maior compra única de AMD (por número de partes) pelo valor log1p do número de transações que a conta fez no período. Ela classifica as contas com base em:

  • Número de AMD comprados em uma única transação

  • Número de transações no último período

1db.transactions.aggregate({
2 "$search": {
3 "embeddedDocument": {
4 "path": "transactions",
5 "operator": {
6 "compound": {
7 "must": [
8 {
9 "text": {
10 "path": "transactions.symbol",
11 "query": "amd"
12 }
13 },
14 {
15 "text": {
16 "path": "transactions.transaction_code",
17 "query": "buy"
18 }
19 }
20 ],
21 "score": {
22 "function": {
23 "path": {
24 "value": "transactions.amount",
25 "undefined": 1.0
26 }
27 }
28 }
29 }
30 },
31 "score": {
32 "embedded": {
33 "aggregate": "maximum",
34 "outerScore": {
35 "function": {
36 "multiply": [
37 {
38 "log1p": {
39 "path": {
40 "value": "transaction_count"
41 }
42 }
43 },
44 {
45 "score": "relevance"
46 }
47 ]
48 }
49 }
50 }
51 }
52 }
53 }
54},
55{ "$limit": 10 },
56{
57 "$project": {
58 "_id": 0,
59 "account_id": 1,
60 "transaction_count": 1,
61 "score": { $meta: "searchScore" }
62 }
63})

O Atlas Search confere uma alta classificação às contas que fizeram muitas transações no último período e compraram muitas AMD em uma única transação.

1[
2 { account_id: 467651, transaction_count: 99, score: 19982 },
3 { account_id: 271554, transaction_count: 96, score: 19851.822265625 },
4 { account_id: 71148, transaction_count: 99, score: 19840 },
5 { account_id: 408143, transaction_count: 100, score: 19836.76953125 },
6 { account_id: 977774, transaction_count: 98, score: 19822.64453125 },
7 { account_id: 187107, transaction_count: 96, score: 19754.470703125 },
8 { account_id: 492843, transaction_count: 97, score: 19744.998046875 },
9 { account_id: 373169, transaction_count: 93, score: 19553.697265625 },
10 { account_id: 249078, transaction_count: 89, score: 19436.896484375 },
11 { account_id: 77690, transaction_count: 90, score: 19418.017578125 }
12]

A opção function permite alterar a pontuação final do documento usando um campo numérico. Você pode especificar o campo numérico para calcular a pontuação final por meio de uma expressão. Se o resultado final da pontuação de função for menor que 0, o Atlas Search substituirá a pontuação por 0.

Observação

Você pode usar function dentro da opção score do operator do operador embeddedDocument. Entretanto, para expressões de pontuação de função que exigem a opção path, o campo numérico que você especificar como path para a expressão deverá estar dentro do path do operador embeddedDocument.

Use as seguintes expressões com a opção function para alterar a pontuação final do documento:

  • Expressões aritméticas, que adicionam ou multiplicam uma série de números.

  • Expressões constantes, que permitem um número constante na pontuação de função.

  • Expressões de decaimento gaussiano, que diminuem ou reduzem as pontuações multiplicando-se a uma taxa especificada.

  • Expressões de caminho, que incorporam um valor de campo numérico indexado em uma pontuação de função.

  • Expressões de pontuação, que retornam a pontuação de relevância atribuída pelo Atlas Search.

  • Expressões unárias, que são expressões que tomam um único argumento. No Atlas Search, você pode calcular o log10(x) ou o log10(x+1) de um número especificado.

Uma expressão aritmética adiciona ou multiplica uma série de números. Por exemplo, você pode utilizar a expressão aritmética para modificar a classificação de relevância por um campo numérico de uma pipeline de enriquecimento de dados. Ela deve incluir uma das seguintes opções:

Opção
Tipo
Descrição
add
array de expressões

Adiciona uma série de números. Recebe uma array de expressões, que podem ter valores negativos. O comprimento da array deve ser maior ou igual a 2. Por exemplo:

Sintaxe da expressão aritmética
"function": {
"add": [
{"path": "rating"},
{"score": "relevance"}
]
}

No exemplo anterior, o Atlas Search usa as expressões path e score para adicionar o seguinte:

  • Valor numérico do campo rating ou 0, se o campo rating não estiver presente no documento

  • Pontuação de relevância é a pontuação que o Atlas Search atribui com base na relevância

multiply
array de expressões

Multiplica uma série de números. Recebe uma array de expressões, que podem ter valores negativos. O comprimento da array deve ser maior ou igual a 2. Por exemplo:

Sintaxe da expressão aritmética
"function": {
"multiply": [
{
"path": {
"value": "popularity",
"undefined": 2.5
}
},
{
"score": "relevance"
},
{
"constant": 0.75
}
]
}

No exemplo anterior, o Atlas Search usa as expressões path, score e constant para alterar a pontuação final do documento. Ele multiplica o seguinte:

  • Valor numérico da expressão de caminho, que é o valor numérico do campo popularity ou 2.5, se o campo popularity não estiver presente no documento

  • Pontuação de relevância é a pontuação que o Atlas Search atribui com base na relevância

  • Valor constante de 0.75

Observação

Você não pode substituir uma expressão aritmética que avalia para undefined com um valor constante.

Uma expressão constante permite um número constante na pontuação de função. Por exemplo, você pode usar constant para modificar a classificação de relevância por um valor numérico de uma pipeline de enriquecimento de dados. Ela deve incluir a seguinte opção:

Opção
Tipo
Descrição
constant
float
Número que indica um valor fixo. O Atlas Search suporta valores negativos.

Exemplo

Sintaxe da expressão constante
{
"function": {
"constant": -23.78
}
}

Uma expressão de decaimento gaussiano permite diminuir ou reduzir multiplicando as pontuações finais dos documentos com base na distância de um valor de campo numérico a partir de um ponto de origem especificado. decay é calculado como:

Captura de tela do cálculo de decaimento
clique para ampliar

onde sigma é calculado para garantir que a pontuação tenha o valor decay à distância scale de origin±offset:

Captura de tela da computação sigma
clique para ampliar

Por exemplo, você pode usar gauss para ajustar a pontuação relevante de documentos com base na atualização do documento ou na data que influencia a classificação mais alta. gauss escolhe as seguintes opções:

Campo
Tipo
necessidade
Descrição
decay
double
Opcional

Taxa na qual você deseja multiplicar as pontuações. O valor deve ser um número positivo entre 0 e 1 exclusivo. Se omitido, o padrão é 0.5.

Para documentos cujo valor de campo numérico (especificado usando path) está a uma distância (especificada usando scale) de origin mais ou menos (±) offset, o Atlas Search multiplica a pontuação atual usando decay.

offset
double
Opcional
Número a ser usado para determinar a distância da origem. A operação de decaimento é realizada somente para documentos cujas distâncias são maiores que origin mais ou menos (±) offset. Se omitido, o padrão é 0.
origin
double
Obrigatório
Ponto de origem a partir do qual calcular a distância.
path
Obrigatório
Nome do campo numérico cujo valor você deseja utilizar para multiplicar a pontuação base.
scale
double
Obrigatório
Distância de origin mais ou menos (±) offset na qual as pontuações devem ser multiplicadas.

Exemplo

Sintaxe da expressão gaussian
{
"function": {
"gauss": {
"path": {
"value": "rating",
"undefined": 50
},
"origin": 95,
"scale": 5,
"offset": 5,
"decay": 0.5
}
}
}

Suponha que a classificação máxima seja 100. O Atlas Search usa o campo rating nos documentos para diminuir a pontuação:

  • Mantém a pontuação atual para documentos com classificação entre 90 e 100.

  • Multiplica a pontuação atual por 0.5 para documentos com uma classificação inferior a 90.

  • Multiplica a pontuação atual por 0.25 para documentos com classificação inferior a 85, e assim por diante.

Uma expressão de caminho incorpora um valor de campo numérico indexado em uma pontuação de função. Pode ser string ou object.

Se string, o valor é o nome do campo numérico para pesquisar a expressão do caminho.

Exemplo

Sintaxe da expressão de caminho
{
"function": {
"path": "rating"
}
}

O Atlas Search incorpora o valor numérico do campo rating na pontuação final do documento.

Se object, a expressão de caminho considerará as seguintes opções:

Opção
Tipo
necessidade
Descrição
value
string
Obrigatório
Nome do campo numérico. O campo pode conter valores numéricos negativos.
undefined
float
Opcional
Valor a ser usado se o campo numérico especificado usando value estiver ausente no documento. Se omitido, o padrão é 0.

Exemplo

Sintaxe da expressão de caminho
{
"function": {
"path": {"value": "quantity", "undefined": 2}
}
}

O Atlas Search incorpora o valor numérico do campo quantity ou 2, se o campo quantity não estiver presente no documento, na pontuação final do documento.

Uma expressão de caminho não pode ser um array e não pode conter regex ou curinga no path.

Uma expressão de pontuação representa a pontuação de relevância, que é a pontuação que o Atlas Search atribui aos documentos com base na relevância da query. É o mesmo que a pontuação atual do documento. Ela deve incluir a seguinte opção:

Opção
Tipo
Descrição
score
string
Valor da pontuação de relevância da query. O valor deve ser relevance.

Exemplo

Sintaxe da expressão de pontuação
{
"function": {
"score": "relevance"
}
}

Uma expressão unária é uma expressão que toma um único argumento. No Atlas Search, você pode usar expressões unárias para calcular o log10(x) ou log10(x+1) de um número especificado. Por exemplo, você pode usar log1p para influenciar a pontuação de relevância pela pontuação de popularidade do documento. Ela deve incluir uma das seguintes opções:

Opção
Tipo
Descrição
log

Calcula o log10 de um número. Por exemplo:

Sintaxe de expressão unária
{
"function": {
"log": {
"multiply": [
{"path": "popularity"},
{"constant": 0.5},
{"score": "relevance"}
]
}
}
}

No exemplo anterior, o Atlas Search calcula o log10 da expressão aritmética que utiliza a opção multiply para calcular o produto do valor numérico do campo popularity, o valor constante de 0.5 e a pontuação de relevância atribuída pelo Atlas Search.

Se a expressão especificada para a opção log for avaliada como menor ou igual a 0, então o log será avaliado como indefinido. Por exemplo:

Sintaxe de expressão unária
{
"function": {
"log": {
"constant": -5.1
}
}
}

No exemplo anterior, o Atlas Search avalia o log10 da expressão constante -5.1 como indefinido. Portanto, a pontuação final do documento é 0.

log1p

Adiciona 1 ao número e, em seguida, calcula seu log10. Por exemplo:

Sintaxe de expressão unária
{
"function": {
"log1p": {
"path": {
"value": "rating",
"undefined": 4
}
}
}
}

No exemplo anterior, o Atlas Search adiciona 1 à expressão que usa a opção path para avaliar como o valor numérico do campo rating e, em seguida, calcula o log10 da soma resultante.

Os exemplos seguintes utilizam o índice padrão na collection sample_mflix.movies para executar a query do campo title. As queries de amostra incluem um estágio $limit para limitar o resultado para 5 resultados e um estágio $project para excluir todos os campos, exceto title e score.

Exemplo

Neste exemplo, o operador de texto utiliza score com a opção function para multiplicar o seguinte:

  • Valor numérico da expressão de caminho, que é o valor do campo imdb.rating nos documentos ou 2, se o campo imdb.rating não estiver no documento

  • Pontuação de relevância ou pontuação atual do documento

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"multiply":[
{
"path": {
"value": "imdb.rating",
"undefined": 2
}
},
{
"score": "relevance"
}
]
}
}
}
}
},
{
$limit: 5
},
{
$project: {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

Esta query gera os seguintes resultados, nos quais a pontuação é substituída pelo valor function especificado:

{ "title" : "Men...", "score" : 23.431293487548828 }
{ "title" : "12 Angry Men", "score" : 22.080968856811523 }
{ "title" : "X-Men", "score" : 21.34803581237793 }
{ "title" : "X-Men", "score" : 21.34803581237793 }
{ "title" : "Matchstick Men", "score" : 21.05954933166504 }

Exemplo

No exemplo a seguir, o operador de texto usa score com a opção function para substituir a pontuação atual do documento pelo valor numérico constante de 3.

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"constant": 3
}
}
}
}
},
{
$limit: 5
},
{
$project: {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}
])

Esta query gera os seguintes resultados, nos quais a pontuação é substituída pelo valor function especificado:

{ "title" : "Men Without Women", "score" : 3 }
{ "title" : "One Hundred Men and a Girl", "score" : 3 }
{ "title" : "Of Mice and Men", "score" : 3 }
{ "title" : "All the King's Men", "score" : 3 }
{ "title" : "The Men", "score" : 3 }

Exemplo

No exemplo a seguir, o operador de texto usa score com a opção function para diminuir a pontuação de relevância dos documentos no resultado.

A consulta especifica que, para documentos cujo valor de campo imdb.rating ou 4.6, se o campo imdb.rating não estiver presente nos documentos, está a scale distância, que é 5, de origin, que é 9.5, mais ou menos offset, que é 0, o Atlas Search deve multiplicar a pontuação usando decay, que começa em 0.5. Essa query inclui um estágio $limit para limitar a saída a até 10 resultados e um estágio $project para adicionar o campo imdb.rating nos resultados.

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "shop",
"score": {
"function":{
"gauss": {
"path": {
"value": "imdb.rating",
"undefined": 4.6
},
"origin": 9.5,
"scale": 5,
"offset": 0,
"decay": 0.5
}
}
}
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"imdb.rating": 1,
"score": { "$meta": "searchScore" }
}
}
])

Esta query retorna os seguintes resultados:

[
{ title: 'The Shop Around the Corner', imdb: { rating: 8.1 }, score: 0.9471074342727661 },
{ title: 'Exit Through the Gift Shop', imdb: { rating: 8.1 }, score: 0.9471074342727661 },
{ title: 'The Shop on Main Street', imdb: { rating: 8 }, score: 0.9395227432250977 },
{ imdb: { rating: 7.4 }, title: 'Chop Shop', score: 0.8849083781242371 },
{ title: 'Little Shop of Horrors', imdb: { rating: 6.9 }, score: 0.8290896415710449 },
{ title: 'The Suicide Shop', imdb: { rating: 6.1 }, score: 0.7257778644561768 },
{ imdb: { rating: 5.6 }, title: 'A Woman, a Gun and a Noodle Shop', score: 0.6559237241744995 },
{ title: 'Beauty Shop', imdb: { rating: 5.4 }, score: 0.6274620294570923 }
]

Para comparar os resultados das expressões Gaussian utilizadas na query anterior com a pontuação de relevância que é retornada nos resultados pelo Atlas Search, execute a seguinte query:

db.movies.aggregate([
{
"$search": {
"text": {
"path": "title",
"query": "shop"
}
}
},
{
"$limit": 10
},
{
"$project": {
"_id": 0,
"title": 1,
"imdb.rating": 1,
"score": { "$meta": "searchScore" }
}
}
])

Esta query retorna os seguintes resultados:

[
{ title: 'Beauty Shop', imdb: { rating: 5.4 }, score: 4.111973762512207 },
{ imdb: { rating: 7.4 }, title: 'Chop Shop', score: 4.111973762512207 },
{ title: 'The Suicide Shop', imdb: { rating: 6.1 }, score: 3.5363259315490723 },
{ title: 'Little Shop of Horrors', imdb: { rating: 6.9 }, score: 3.1020588874816895 },
{ title: 'The Shop Around the Corner', imdb: { rating: 8.1 }, score: 2.762784481048584 },
{ title: 'The Shop on Main Street', imdb: { rating: 8 }, score: 2.762784481048584 },
{ title: 'Exit Through the Gift Shop', imdb: { rating: 8.1 }, score: 2.762784481048584 },
{ imdb: { rating: 5.6 }, title: 'A Woman, a Gun and a Noodle Shop', score: 2.0802340507507324 }
]

Exemplo

No exemplo a seguir, o operador de texto usa score com a opção function para substituir a pontuação de relevância da consulta pelo valor do campo numérico imdb.rating ou 4.6, se o campo imdb.rating não for presentes nos documentos.

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"path": {
"value": "imdb.rating",
"undefined": 4.6
}
}
}
}
}
},
{
$limit: 5
},
{
$project: {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

Esta query gera os seguintes resultados, nos quais a pontuação é substituída pelo valor function especificado:

{ "title" : "12 Angry Men", "score" : 8.899999618530273 }
{ "title" : "The Men Who Built America", "score" : 8.600000381469727 }
{ "title" : "No Country for Old Men", "score" : 8.100000381469727 }
{ "title" : "X-Men: Days of Future Past", "score" : 8.100000381469727 }
{ "title" : "The Best of Men", "score" : 8.100000381469727 }

Exemplo

No exemplo a seguir, o operador de texto usa score com a opção function para retornar a pontuação de relevância, que é igual à pontuação atual, dos documentos.

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function":{
"score": "relevance"
}
}
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

Esta query gera os seguintes resultados, nos quais a pontuação é substituída pelo valor function especificado:

{ "title" : "Men...", "score" : 3.4457783699035645 }
{ "title" : "The Men", "score" : 2.8848698139190674 }
{ "title" : "Simple Men", "score" : 2.8848698139190674 }
{ "title" : "X-Men", "score" : 2.8848698139190674 }
{ "title" : "Mystery Men", "score" : 2.8848698139190674 }

Exemplo

No exemplo a seguir, o operador de texto usa score com a opção function para calcular o log10 do campo imdb.rating ou 10, se o campo imdb.rating não estiver presente no documento.

db.movies.aggregate([{
"$search": {
"text": {
"path": "title",
"query": "men",
"score": {
"function": {
"log": {
"path": {
"value": "imdb.rating",
"undefined": 10
}
}
}
}
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"score": { "$meta": "searchScore" }
}
}])

Esta query gera os seguintes resultados, nos quais a pontuação é substituída pelo valor function especificado:

{ "title" : "12 Angry Men", "score" : 0.9493899941444397 }
{ "title" : "The Men Who Built America", "score" : 0.9344984292984009 }
{ "title" : "No Country for Old Men", "score" : 0.9084849953651428 }
{ "title" : "X-Men: Days of Future Past", "score" : 0.9084849953651428 }
{ "title" : "The Best of Men", "score" : 0.9084849953651428
}

Voltar

4. Documentos de pontuação