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.
Vantagens dos recursos de pesquisa do MongoDB
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:
Pesquisa sem distinção entre maiúsculas e minúsculas e diacríticos
Realcedo texto do resultado
Queries com reconhecimento geoespacial com geoWithin e geoShape.
Preenchimento automático de caracteres e palavras com diferentes estratégias de tokenização
Filtragem de 10 ou mais strings com o operador composto
Pontuação e classificação de relevância personalizáveis
Índice composto único em arrays
pesquisar de sinônimos
Bucketing para navegação facetada
Query de frase
Exemplos
Criar os índices
Os exemplos nas seções a seguir usam queries na sample_mflix.movies collection nos dados de amostra para ilustrar as melhorias na flexibilidade e no desempenho que o MongoDB Search oferece ao longo $text de. Você pode executar as queries de ambos os exemplos utilizando os seguintes índices:
Text Index | Índice de pesquisa do MongoDB | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
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 obter instruções sobre como criar índices de pesquisa do MongoDB, consulte Criar um índice de pesquisa do MongoDB.
Melhore a flexibilidade das queries de texto completo com o MongoDB 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 $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 somente um único índice de texto por db.collection.dropIndex() collection.
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 | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
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:
1 db.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' } ] } ] }
Melhorar o desempenho das queries usando o MongoDB Search
Além de maior flexibilidade e conveniência, o MongoDB 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 MongoDB | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |
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 MongoDB Search por meio do estágio do pipeline de agregação $search.
Saiba mais
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.