Modificar a Pontuação
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:
boost
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
econstant
juntas.A opção
boost
compath
é a mesma que multiplicar utilizando a opçãofunction
com uma expressão de caminho.
Campos
A opção boost
tem os seguintes campos:
Campo | Tipo | necessidade | Descrição |
---|---|---|---|
| float | Condicional | Número pelo qual multiplicar a pontuação base padrão. O valor deve ser um número positivo. |
| string | Condicional | Nome do campo numérico pelo qual multiplicar a pontuação-base padrão. |
| float | Opcional | Valor numérico a ser substituído por |
Exemplos
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
.
1 db.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
.
1 db.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 } ]
constant
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.
Exemplos
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
.
1 db.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 ]
embedded
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
O tipo embeddedDocuments do Atlas Search , o operadorembeddedDocument embedded
e a opção de pontuação estão em pré-visualização. Quando um índice do Atlas Search em um conjunto de réplicas ou shard do MongoDB atinge 2,100,000,000 objetos de índice, o Atlas Search transita o índice para um estado obsoleto e consultável. Se você quiser que o Atlas Search suporte a mais de 2,100,000,000 objetos de índice no futuro, vote nessa solicitação no MongoDB Feedback Engine.
Campos
A opção embedded
tem os seguintes campos:
Campo | Tipo | necessidade | Descrição |
---|---|---|---|
| string | Opcional | Configura como combinar pontuações de documentos incorporados correspondentes. O valor deve ser uma das seguintes estratégias de agregação:
Se omitido, este campo é padronizado como |
| Opcional | Especifica a modificação de pontuação a ser aplicada após a aplicação da estratégia de aggregation. |
Exemplos
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
{ "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
etransaction_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çãoscore
dooperator
do operador embeddedDocument. No entanto, para expressões de pontuação de função que exigem a opçãopath
, o campo numérico que você especifica comopath
para a expressão deve estar dentro dopath
do operador embeddedDocument. Por exemplo, na consulta de exemplo a seguir, o campotransactions.amount
especificado dentro dascore
opção docompound
operador na linha 24 está dentro noembeddedDocument
caminho do operadortransactions
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çãoNúmero de transações no último período
1 db.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 ]
function
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.
Expressões
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.
Observação
As pontuações da função Atlas Search são sempre valores float
e a precisão pode ser perdida para números muito grandes ou muito pequenos.
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 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 Sintaxe da expressão aritmética
No exemplo anterior, o Atlas Search usa as expressões
| ||||||||||||||||
| 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 Sintaxe da expressão aritmética
No exemplo anterior, o Atlas Search usa as expressões
|
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 |
---|---|---|
| float | Número que indica um valor fixo. O Atlas Search suporta valores negativos. |
Exemplo
{ "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:
onde sigma é calculado para garantir que a pontuação tenha o valor decay
à distância scale
de origin±offset
:
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 |
---|---|---|---|
| double | Opcional | Taxa na qual você deseja multiplicar as pontuações. O valor deve ser um número positivo entre Para documentos cujo valor de campo numérico (especificado usando |
| 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 |
| double | Obrigatório | Ponto de origem a partir do qual calcular a distância. |
| Obrigatório | Nome do campo numérico cujo valor você deseja utilizar para multiplicar a pontuação base. | |
| double | Obrigatório | Distância de |
Exemplo
{ "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
e100
.Multiplica a pontuação atual por
0.5
para documentos com uma classificação inferior a90
.Multiplica a pontuação atual por
0.25
para documentos com classificação inferior a85
, 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
{ "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 |
---|---|---|---|
| string | Obrigatório | Nome do campo numérico. O campo pode conter valores numéricos negativos. |
| float | Opcional | Valor a ser usado se o campo numérico especificado usando |
Exemplo
{ "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 |
---|---|---|
| string | Valor da pontuação de relevância da query. O valor deve ser |
Exemplo
{ "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 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Calcula o log10 de um número. Por exemplo: Sintaxe de expressão unária
No exemplo anterior, o Atlas Search calcula o log10 da expressão aritmética que utiliza a opção Se a expressão especificada para a opção Sintaxe de expressão unária
No exemplo anterior, o Atlas Search avalia o log10 da expressão constante | |||||||||||||||||||
| Adiciona Sintaxe de expressão unária
No exemplo anterior, o Atlas Search adiciona |
Exemplos
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 ou2
, se o campoimdb.rating
não estiver no documentoPontuaçã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 }