Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

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

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

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

Os exemplos nas seções a seguir usam queries em relação à sample_mflix.movies collection nos dados de amostra para ilustrar as melhorias na flexibilidade e no desempenho que o MongoDB Search oferece em. Você pode executar as queries de ambos os exemplos utilizando os seguintes $text índices:

Text Index
Índice de pesquisa do MongoDB
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 genres plot campos e como texto, e o year campo como numérico. Para obter instruções sobre como criar índices,$text consulte Criar índice de texto. Para obter instruções sobre como criar índices de pesquisa do MongoDB , consulte Criar um índice de pesquisa do MongoDB .

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

As definições de índice dispostas na seção anterior ilustram uma das melhorias de flexibilidade $search do. Para criar o $text índice sample_mflix.movies no, você deve primeiro excluir qualquer índice de texto existente nos dados de amostra usando o método, pois o MongoDB suporta apenas um único índice de texto por db.collection.dropIndex() coleção.

Por outro lado, você pode criar vários índices do MongoDB Search para uma única collection, permitindo que seus aplicativos aproveitem distintas queries de texto completo 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 MongoDB
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 para o MongoDB Search, você pode adicionar destaques aos resultados, exibindo correspondências nos contextos em que foram encontradas. Para fazer isso, substitua a query do MongoDB 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 MongoDB Search oferece vantagens significativas de desempenho em relação às queries análogas. Considere uma query $text na sample_mflix.movies collection para recuperar filmes lançados entre 2000 2010e, no gênero de comedia, com "poeta" no plot campo.

Execute a seguinte query:

Text Index
Índice de pesquisa do MongoDB
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 seja adequado para pesquisas simples e limitadas como essa, à medida que o tamanho dos conjuntos de dados e a largura das consultas aumentam, as vantagens de desempenho $text do $search melhorarão significativamente a capacidade de resposta dos seus aplicativos. Recomendamos que você use uma query do MongoDB Search por meio do $search estágio do pipeline de agregação.

  • Para saber mais sobre queries de pesquisa MongoDB , consulte Queries e índices.

  • A Universidade de MongoDB oferece um curso gratuito sobre como otimizar o desempenho do MongoDB. Para saber mais, consulte Monitoramento e insights.