Tutorial: crie um mecanismo de pesquisa de filmes usando a pesquisa de texto completo do Atlas em 10 Minutos
Avalie esse Tutorial
Oferecer aos usuários a capacidade de encontrar exatamente o que procuram em seu aplicativo é fundamental para uma experiência de usuário excepcional. Com o novo serviçoMongoDB Atlas Full-Text Search, ficou mais fácil do que nunca integrar recursos de pesquisa simples, mas sofisticados em seus aplicativos MongoDB. Para demonstrar como é fácil, vamos criar um mecanismo de pesquisa de filmes - em apenas 10 minutos.
Construído no Apache Lucene, o Full-Text Search adiciona dados de documentos a um índice de pesquisa de texto completo para tornar esses dados pesquisáveis de uma maneira escalável e de alto desempenho. Este tutorial mostrará como criar um aplicativo da web para pesquisar filmes com base em um tópico usando a coleção de dados de filmes de amostra do Atlas em um cluster de camada grátis. Criaremos um índice de pesquisa de texto completo nesses dados de amostra. Em seguida, consultaremos esse índice para filtrar, classificar e classificar esses filmes para exibir rapidamente os filmes por tópico.
Armados com um conhecimento básico de HTML e Javascript, aqui estão as tarefas que realizaremos:
- ⬜ Crie um Atlas cluster e carregue dados de filme de amostra
- ⬜ Crie um índice de pesquisa de texto completo na coleta de dados de filmes
- Escreva um pipeline de agregação com o operador $searchBeta
- ⬜ Crie uma API RESTful para acessar dados
- ⬜ Chamada do front-end
Agora pegue a pipoca e prepare-se para encontrar aquele filme que está na ponta da língua há semanas.
Para começar, precisaremos de:
- Um cluster de camada grátis (M0) no MongoDB Atlas. Clique aqui para se inscrever em uma conta e implantar seu cluster gratuito no provedor de nuvem e na região de sua preferência.
- O conjunto de dados de amostra do Atlas carregado em seu cluster. Você pode carregar o conjunto de dados de amostra clicando no botão de elipse e em Load Sample Dataset (Carregar conjunto de dados de amostra).Para obter informações mais detalhadas sobre como criar um cluster, configurar seu endereço IP, criar um usuário e carregar dados de exemplo, consulte Introdução ao MongoDB Atlas em nossa documentação.
- (Opcional) MongoDB Compass. Esta é a interface gráfica gratuita para MongoDB que permite que você tome decisões mais inteligentes sobre estrutura de documentos, query, indexação, validação de documentos e muito mais. A versão mais recente pode ser encontrada aqui https://www.mongodb.com/download-center/compass.
Após seu conjunto de dados de amostra ser carregado em seu banco de dados, vamos dar uma olhada mais de perto para ver no que estamos trabalhando dentro do Atlas Data Explorer. Em sua interface de usuário do Atlas, clique em collection para examinar a collection do
movies
no novo banco de dados dosample_mflix
. Esta collection possui mais 23k documentos de filmes com informações como título, trama e elenco.- ✅ Gire um Atlas cluster e carregue dados de filme de amostra
- ⬜ Crie um índice de pesquisa de texto completo na coleta de dados de filmes
- Escreva um pipeline de agregação com o operador $searchBeta
- ⬜ Crie uma API RESTful para acessar dados
- ⬜ Chamada do front-end
Nosso mecanismo de pesquisa de filmes procurará filmes com base em um tópico. Usaremos a pesquisa de texto completo para consultar palavras e frases específicas no campo "fullplot".
A primeira coisa que precisamos é de um índice de pesquisa de texto completo. Clique na guia intitulada SearchBETA em Coleções. Clicar no botão verde Criar um índice de pesquisa abrirá uma caixa de diálogo semelhante a esta:
Por padrão, mapeamos dinamicamente todos os campos de texto da sua collection. Isso se encaixa perfeitamente no modelo de dados flexível do MongoDB. À medida que você adiciona novos dados à collection e o esquema envolve, o mapeamento dinâmico acomodará essas alterações no esquema e adicionará esses novos dados ao índice Full-Text Search automaticamente.
Vamos aceitar as configurações padrão e clicar em Criar índice. E isso é tudo que você precisa fazer para começar a aproveitar o Lucene em seus dados do MongoDB Atlas!
- ✅ Gire um Atlas cluster e carregue dados de filme de amostra
- ✅ Criar um índice de pesquisa de texto completo na coleção de dados de filmes
- Escreva um pipeline de agregação com o operador $searchBeta
- ⬜ Crie uma API RESTful para acessar dados
- ⬜ Chamada do front-end
As queries de pesquisa de texto completo assumem a forma de um estágio de pipeline de agregação. O estágio$searchBeta executa uma query de pesquisa no(s) campo(s) especificado(s) coberto(s) pelo índice Full-Text Search e deve ser usado como o primeiro estágio no aggregation pipeline.
Vamos usar o MongoDB Compass para ver um pipeline de agregação que faz uso desse índice do Full-Text Search. Para obter instruções sobre como conectar seu Atlas cluster ao MongoDB Compass, clique aqui.
Você não precisa usar o Compass para este estágio, mas eu realmenteadoro a interface do usuário fácil de usar que o Compass tem a oferecer. Além disso, a capacidade de visualizar os resultados por estágio facilita a solução de problemas! Para saber mais sobre o Construtor de pipeline de agregação da Compass, confira este blog.
Navegue até a guia Agregações na
sample_mflix.movies
coleção:Para o primeiro estágio, selecione o operador de agregação$searchBeta para pesquisar os termos "lobigoves e Vampries" no campo
fullplot
.Usar a opçãode destaque retornará os destaques adicionando campos ao resultado que exibem os termos de pesquisa em seu contexto original, junto com o conteúdo do texto adjacente. (Mais sobre isso mais tarde.)
Observe os documentos de filme retornados no painel de visualização à direita. Se nenhum documento estiver no painel, verifique novamente a formatação no código de agregação.
Usamos
$project
para obter de volta apenas os campos que usaremos em nosso aplicativo de pesquisa de filmes. Também usamos o $meta
operador para exibir osearchScore e searchHighlights de cada documento no conjunto de resultados.Vamos detalhar ainda mais as peças individuais neste estágio:
PONTUAÇÃO: O
"$meta": "searchScore"
contém a pontuação atribuída ao documento com base na relevância.Isso significa quão bem o campofullplot
deste filme corresponde aos termos de consulta 'lobisomens e vampiros' acima.Observe que, ao rolar a tela no painel de visualização à direita, os documentos do filme são retornados com a pontuação em ordem decrescente para que as melhores correspondências sejam fornecidas primeiro.
DETALHE: O "$meta": "searchHighlights" contém os resultados destacados.
Porque searchHighlights e searchScore não fazem parte do documento original, é necessário usar um estágio de pipeline $project para adicioná-los à saída da query.
Agora abra a matriz de destaque de um documento para mostrar os objetos de dadoscom valores e tipos de texto .
1 title:"The Mortal Instruments: City of Bones" 2 fullplot:"Set in contemporary New York City, a seemingly ordinary teenager, Clar..." 3 year:2013 4 score:6.849891185760498 5 highlight:Array 6 0:Object 7 path:"fullplot" 8 texts:Array 9 0:Object 10 value:"After the disappearance of her mother, Clary must join forces with a g..." 11 type:"text" 12 1:Object 13 value:"vampires" 14 type:"hit" 15 2:Object 16 3:Object 17 4:Object 18 5:Object 19 6:Object 20 score:3.556248188018799
highlight.texts.value - texto do campo
fullplot
, que retornou uma correspondência. highlight.texts.type - uma correspondência ou um texto. Um hit é uma correspondência para a consulta, enquanto um texto é o conteúdo de texto adjacente à string correspondente. Usaremos isso mais tarde em nosso código de aplicativo.Lembre-se de que os resultados são retornados com as pontuações em ordem decrescente, portanto, $limit: 10 trará os documentos de filme 10 mais relevantes para sua consulta de pesquisa.
Por fim, se você ver resultados no painel de visualização correto, seu pipeline de agregação está funcionando corretamente! Vamos pegar esse código de agregação com o recurso Export Pipeline to Language do Compass clicando no botão na barra de ferramentas superior.
Seu código de agregação final será este:
1 [ 2 { $searchBeta: { 3 search: { 4 query: 'werewolves and vampires', 5 path: 'fullplot' }, 6 highlight: { path: 'fullplot' } 7 }}, 8 { $project: { 9 title: 1, 10 _id: 0, 11 year: 1, 12 fullplot: 1, 13 score: { $meta: 'searchScore' }, 14 highlight: { $meta: 'searchHighlights' } 15 }}, 16 { $limit: 10 } 17 ]
- ✅ Gire um Atlas cluster e carregue dados de filme de amostra
- ✅ Criar um índice de pesquisa de texto completo na coleção de dados de filmes
- Escreva um pipeline de agregação com o operador $searchBeta
- ⬜ Crie uma API RESTful para acessar dados
- ⬜ Chamada do front-end
Agora que temos o coração do nosso mecanismo de busca de filmes na forma de um pipeline de agregação, como vamos usá-lo em um aplicativo? Há muitas maneiras de fazer isso, mas o mais fácil foi simplesmente criar uma API RESTful para expor esses dados - e, para isso, usei o HTTP Service do MongoDB Stitch.
Stitch é a plataforma sem servidor do MongoDB em que as funções escritas em Javascript são dimensionadas automaticamente para atender à demanda atual. Para criar um aplicativo Stitch, retorne à interface do usuário do Atlas e clique em Stitch em SERVIÇOS no menu esquerdo e, em seguida, clique no botão verde Criar novo aplicativo.
Nomeie seu aplicativo Stitch de FTSDemo e certifique-se de vinculá-lo ao seu cluster M0. Todas as outras configurações padrão estão bem:
Agora clique no menu 3Serviços de terceiros à esquerda e, em seguida, em Adicionar um serviço. Selecione o HTTP Service e nomeie-o de filmes:
Clique no verde Adicionar um serviço botão, e você será direcionado para adicionar um webhook de entrada.
Na guiaConfigurações, ative Responder com resultado, defina o Método HTTP como GETe, para simplificar, vamos apenas executar o webhook como o Sistema e pular a validação.
Nesse editor de funções de serviço, substitua o código de exemplo pelo seguinte:
1 exports = function(payload) { 2 const collection = context.services.get("mongodb-atlas").db("sample_mflix").collection("movies"); 3 let arg = payload.query.arg; 4 return collection.aggregate([ 5 { $searchBeta: { 6 search: { 7 query: arg, 8 path:'fullplot', 9 }, 10 highlight: { path: 'fullplot' } 11 }}, 12 { $project: { 13 title: 1, 14 _id:0, 15 year:1, 16 fullplot:1, 17 score: { $meta: 'searchScore'}, 18 highlight: {$meta: 'searchHighlights'} 19 }}, 20 { $limit: 10} 21 ]).toArray(); 22 };
Vamos detalhar alguns desses componentes. O MongoDB Stitch interage com sua coleção de filmes do Atlas por meio da variávelde contextoglobal. Na função de serviço, usamos essa variável de contexto para acessar a coleção sample_mflix.movies em seu cluster do Atlas:
1 const collection = 2 context.services.get("mongodb-atlas").db("sample_mflix").collection("movies");
Capturamos o argumento de query da carga útil:
1 let arg = payload.query.arg;
Retorne o código de aggregation executado na collection colando sua aggregation no código abaixo:
1 return collection.aggregate(<<PASTE AGGREGATION PIPELINE HERE>>).toArray();
Finalmente, depois de colar o código de agregação, alteramos os termos “lobisomens e vampiros” para o argumento genérico para corresponder ao argumento de consulta de carga útil da função. Caso contrário, nossos recursos de busca de filmes serão extremamente limitados.
Agora você pode testar no Console abaixo do editor alterando o argumento de arg1: "hello" para arg: "werewolves and vampires".
Nota: Certifique-se de alterar AMBOS o nome do campo arg1 para arg, bem como o valor da string "hello" para "lobisomens e vampiros" - ou não funcionará.
Clique em Run para verificar o resultado:
Se isso estiver funcionando, parabéns! Estamos quase terminando! Certifique-se de SALVAR e implantar o serviço clicando em REVISAR E IMPLEMENTAR ALTERAÇÕES na parte superior da tela.
O melhor de uma REST API é que ela pode ser chamada de qualquer lugar. Vamos executá-lo em nosso navegador. No entanto, se você tiver ferramentas como o Postman instaladas, sinta-se à vontade para tentar também.
Alterne para a abaConfigurações do serviço de filmes no Stitch e você notará que um URL de webhook foi gerado.
Clique no botãoCopiar e cole a URL no seu navegador. Em seguida, anexe o seguinte ao final da sua URL: ?arg='werelophyllums and vampiros'
Se você receber uma saída como a que temos acima, felicitações! Você criou com sucesso uma API de busca de filmes!
- ✅ Gire um Atlas cluster e carregue dados de filme de amostra
- ✅ Criar um índice de pesquisa de texto completo na coleção de dados de filmes
- Escreva um pipeline de agregação com o operador $searchBeta
- ✅ Criar uma API RESTful para acessar dados
- ⬜ Chamada do front-end
No aplicativo front-end, é necessária uma única chamada da Fetch API para recuperar esses dados. Baixe o seguinte arquivo index.html e abra-o em seu navegador. Você verá uma barra de pesquisa simples:
A inserção de dados no Atlas Search gerará resultados da pesquisa de filmes porque o aplicativo está apontando para uma API existente no momento.
Agora abra o arquivo HTML com seu editor de texto favorito e familiarize-se com o conteúdo. Você notará que isso contém um container muito simples e duas funções javascript:
- Linha 82 - userAction() será executado quando o usuário inserir uma pesquisa. Se houver uma entrada válida na caixa de pesquisa e não houver erros, chamaremos a funçãobuildMovieList().
- Linha 125 - buildMovieList() é uma função auxiliar para userAction() que criará a lista de filmes, juntamente com suas pontuações e destaques do campo "fullplog". Observe na linha 146 que, se o highlight.texts.type === "acertar", destacamos o highlight.texts.value com a marcação.
Na função userAction(), pegamos a entrada do campo do formulário de pesquisa na linha 79 e a definimos como igual a searchString. Observe na linha 82 que webhook_url já está definido como uma API RESTful que criei em meu próprio aplicativo FTSDemo. Neste aplicativo, anexamos essa entradasearchString ao webhook_url antes de chamá-lo na API de busca na linha 111. Para tornar esse aplicativo totalmente seu, basta substituir o valorwebhook_urlexistente na linha 82 por sua própria API do filmes HTTP Service que você acabou de criar. . . . . .
Agora salve essas alterações e abra o arquivoindex.html mais uma vez em seu navegador, et pronto! Você acabou de criar seu mecanismo de pesquisa de filmes usando índices de pesquisa de texto completo. . . . Que tipo de filme você quer assistir?!
Agora que você acabou de ver como é fácil criar uma pesquisa simples e avançada em um aplicativo com o MongoDB Atlas Full-Text Search, vá em frente e experimente outros recursos mais avançados, como digitação antecipada ou correspondência difusa, para seus resultados finos -pesquisas granulares. Confira nossa documentação$searchBeta para outras possibilidades.
Aproveite o poder do Apache Lucene para algoritmos de pesquisa eficientes, mapeamento de campo estático e dinâmico para indexação flexível e escalável, tudo isso usando a mesma linguagem de query do MongoDB (MQL) que você já conhece e ama, falada em nossa melhor impressão de Liam Neeson O MongoDB agora tem um conjunto muito específico de habilidades. Competências que adquiriram ao longo de uma carreia muito longa. Competências que fazem do MongoDB um SONHO para programadores como você.