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

Atualize queries $text com o Atlas Search para melhorar o desempenho da pesquisa

Nesta página

  • Vantagens dos recursos do Atlas Search
  • Exemplos
  • Saiba mais

Se suas queries dependerem muito do estágio do pipeline de agregação $text , você poderá modificá-las para usar $search para melhorar a flexibilidade e o desempenho dessas queries.

O estágio de aggregation $search fornece os seguintes recursos que não estão disponíveis por meio do operador $text , estão disponíveis, mas têm menos desempenho, ou estão disponíveis somente com um trabalho significativo de implementação do usuário:

Os exemplos nas seções seguintes utilizam queries na collection sample_mflix.movies nos dados de amostra para ilustrar as melhorias na flexibilidade e no desempenho que o Atlas Search oferece ao longo do $text. Você pode executar as queries de ambos os exemplos utilizando os seguintes índices:

Text Index
Índice de Pesquisa do Atlas
db.movies.createIndex(
{
genres: "text",
plot: "text",
year: -1
}
)
{
"mappings": {
"dynamic": false,
"fields": {
"genres": {
"type": "string"
},
"plot": {
"type": "string"
},
"year": {
"type": "number"
}
}
}
}

Qualquer definição de índice indexará os campos genres e plot como texto, e o campo year como numérico. Para obter instruções sobre como criar índices $text , consulte Criar índice de texto. Para instruções sobre como criar índices de Atlas Search, consulte Criar um Índice de Atlas Search.

Você pode atualizar suas queries baseadas em $textpara usar $search para maior flexibilidade e conveniência. Neste exemplo, você consultará a coleção sample_mflix.movies nos dados de amostra para recuperar entradas com a palavra "poeta" no campo plot , classificada em ordem crescente por ano.

As definições de índice dispostas na seção anterior ilustram uma das melhorias de flexibilidade do $search: para criar o índice $text no sample_mflix.movies, você deve primeiro excluir qualquer índice de texto existente nos dados de amostra, como o MongoDB suporta apenas um único índice de texto por collection.

Por outro lado, você pode criar múltiplos índice de pesquisa do Atlas Search para uma única collection, permitindo que sua aplicação aproveite query de texto completo distintas em paralelo.

As query a seguir retornam os cinco filmes mais recentes com "poeta" no campo plot , mostrando seus títulos, gêneros, tramas e anos de lançamento.

Regex Index
Índice de Pesquisa do Atlas
db.movies.find(
{
$text: { $search: "poet" }
},
{
_id: 0,
title: 1,
genres: 1,
plot: 1,
year: 1
}
).limit(5)
db.movies.aggregate([
{
"$search": {
"text": {
"path": "plot",
"query": "poet"
}
}
},
{
"$limit": 5
},
{
"$project": {
"_id": 0,
"title": 1,
"genres": 1,
"plot": 1,
"year": 1,
}
}
])

Ambas as query retornam os seguintes resultados:

{
plot: `It's the story of the murder of a poet, a man, a great film director: Pier Paolo Pasolini. The story begin with the arrest of "Pelosi", a young man then accused of the murder of the poet. ...`,
genres: [ 'Crime', 'Drama' ],
title: 'Who Killed Pasolini?',
year: 1995
},
{
plot: 'Friendship and betrayal between two poets during the French Revolution.',
genres: [ 'Biography', 'Drama' ],
title: 'Pandaemonium',
year: 2000
},
{
year: 2003,
plot: 'Story of the relationship between the poets Ted Hughes and Sylvia Plath.',
genres: [ 'Biography', 'Drama', 'Romance' ],
title: 'Sylvia'
},
{
year: 2003,
plot: 'Story of the relationship between the poets Ted Hughes and Sylvia Plath.',
genres: [ 'Biography', 'Drama', 'Romance' ],
title: 'Sylvia'
},
{
plot: 'A love-struck Italian poet is stuck in Iraq at the onset of an American invasion.',
genres: [ 'Comedy', 'Drama', 'Romance' ],
title: 'The Tiger and the Snow',
year: 2005
}

Exclusivo do Atlas Search, você pode adicionar destaques aos resultados, exibindo as correspondências nos contextos em que foram encontrados. Para fazer isso, substitua a query de pesquisa do Atlas Search acima pelo seguinte:

1db.movies.aggregate([
2 {
3 "$search": {
4 "text": {
5 "path": "plot",
6 "query": "poet"
7 },
8 "highlight": {
9 "path": "plot"
10 }
11 }
12 },
13 {
14 "$limit": 1
15 },
16 {
17 "$project": {
18 "_id": 0,
19 "title": 1,
20 "genres": 1,
21 "plot": 1,
22 "year": 1,
23 "highlights": { "$meta": "searchHighlights" }
24 }
25 }
26])

Os resultados da query acima incluem o campo highlights , que contém o contexto em que todas as correspondências ocorreram e as pontuações de relevância para cada uma. Por exemplo, o seguinte mostra o campo highlights para o primeiro documento nos resultados do $search .

{
plot: `It's the story of the murder of a poet, a man, a great film director: Pier Paolo Pasolini. The story begin with the arrest of "Pelosi", a young man then accused of the murder of the poet. ...`,
genres: [ 'Crime', 'Drama' ],
title: 'Who Killed Pasolini?',
year: 1995,
highlights: [
{
score: 1.0902210474014282,
path: 'plot',
texts: [
{ value: "It's the story of the murder of a ", type: 'text' },
{ value: 'poet', type: 'hit' },
{
value: ', a man, a great film director: Pier Paolo Pasolini. ',
type: 'text'
}
]
},
{
score: 1.0202842950820923,
path: 'plot',
texts: [
{
value: 'The story begin with the arrest of "Pelosi", a young man then accused of the murder of the ',
type: 'text'
},
{ value: 'poet', type: 'hit' },
{ value: '. ...', type: 'text' }
]
}
]
}

Além de maior flexibilidade e conveniência, o Atlas Search oferece vantagens significativas de desempenho em relação às queries $text análogas. Considere uma query na collection sample_mflix.movies para recuperar filmes lançados entre 2000 e 2010, no gênero de comedia, com "poeta" no campo plot .

Execute a seguinte query:

Text Index
Índice de Pesquisa do Atlas
db.movies.aggregate([
{
$match: {
year: {$gte: 2000, $lte: 2010},
$text: { $search: "poet" },
genres : { $eq: "Comedy" }
}
},
{ "$sort": { "year": 1 } },
{
"$limit": 3
},
{
"$project": {
"_id": 0,
"title": 1,
"genres": 1,
"plot": 1,
"year": 1
},
}
])
db.movies.aggregate([
{
"$search": {
"compound": {
"filter": [{
"range": {
"gte": 2000,
"lte": 2010,
"path": "year"
}
},
{
"text": {
"path": "plot",
"query": "poet"
}
},
{
"text": {
"path": "genres",
"query": "comedy"
}
}]
}
}
},
{ "$sort": { "year": 1 } },
{
"$limit": 3
},
{
"$project": {
"_id": 0,
"title": 1,
"genres": 1,
"plot": 1,
"year": 1
}
}
])

Ambas as queries retornarão os três documentos a seguir.

{
year: 2000,
plot: 'A film poem inspired by the Peruvian poet Cèsar Vallejo. A story about our need for love, our confusion, greatness and smallness and, most of all, our vulnerability. It is a story with many...',
genres: [ 'Comedy', 'Drama' ],
title: 'Songs from the Second Floor'
},
{
plot: 'When his mother, who has sheltered him his entire 40 years, dies, Elling, a sensitive, would-be poet, is sent to live in a state institution. There he meets Kjell Bjarne, a gentle giant and...',
genres: [ 'Comedy', 'Drama' ],
title: 'Elling',
year: 2001
},
{
plot: 'Heart-broken after several affairs, a woman finds herself torn between a Poet and a TV Host.',
genres: [ 'Comedy', 'Romance', 'Drama' ],
title: 'Easy',
year: 2003
}

Embora o $text seja adequado para pesquisas simples e restritas como essa, à medida que o tamanho dos conjuntos de dados e a largura das consultas aumentam, as vantagens de desempenho do $search melhorarão significativamente a capacidade de resposta dos seus aplicativos. Recomendamos que você use uma query do Atlas Search por meio do estágio do pipeline de agregação $search .

Voltar

Sinônimos