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 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.
Depois que seu conjunto de dados de amostra for carregado em seu banco de dados de dados, vamos dar uma olhada mais de perto para ver no que estamos trabalhando no Atlas Data Explorer. Na interface do usuário do Atlas , clique em Coleções para examinar a
movies
coleção no novo sample_mflix
banco de banco de dados . Esta coleção tem mais de 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 de que precisamos é de um índice para o Full-Text Search. Clique na aba intitulada SearchBTA em Collections. Clicar no botão verde Criar um índice de pesquisa abrirá uma caixa de diálogo parecida com a seguinte:
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 agregação 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 obter mais informações sobre o Construtor de pipeline de agregação do Compass, consulte 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
fullplot
campo.O uso da opção de destaque retornará os destaques adicionando campos ao resultado que exibem os termos de pesquisa em seu contexto original, junto com o conteúdo de 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 apenas os campos que usaremos em nosso aplicação 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 para o documento com base na relevância. Isso significa quão bem o campo deste filme fullplot
corresponde aos termos de query "lobigomes e Vampries" 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.
Como o searchHighlights e o searchScore não fazem parte do documento original, é necessário usar um estágio de pipeline do projeto $ para adicioná-los à saída da consulta.
Agora abra a array 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
fullplot
campo , que retornou uma correspondência. highlight.texts.type - um sucesso ou um texto. Um acerto é uma correspondência para a query, enquanto um texto é conteúdo de texto adjacente à string correspondente. Nós os usaremos mais tarde no código do nosso aplicação .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 aplicação Stitch, retorne à interface do usuário do Atlas e clique emStitch, em SERVIÇOS, no menu esquerdo e, em seguida, clique no botãoverde 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 3menu 3}Serviços de terceiros à esquerda e, em seguida, em Adicionar um serviço. Selecione o Serviço HTTP e nomeie-o de filmes:
Clique no botão verde Adicionar um serviço e você será direcionado a adicionar um webhook de entrada.
Na guia Configurações,ative Responder com resultado, defina o Método HTTP como GET e, 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 decompor alguns desses componentes. O MongoDB Stitch interage com sua coleção de filmes do Atlas por meio da variável de contexto global. Na função de serviço, usamos essa variável de contexto para acessar a coleção sample_mflix.movies em seu Atlas cluster:
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 arg:1 "hello" para arg: "werewords and operators".
Observação: certifique-se de alterar AMBOS o nome do campo arg1 para arg, bem como o valor da string "hello" para "werelophyllums andVampries" - ou ela não funcionará.
Clique em Executar para verificar o resultado:
Se isso está funcionando, Parabéns! Estamos quase terminando! Certifique-se de SALVAR e implementar 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 do seu URL: ?arg='werelobos e Vampries'
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 assistente 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 79 userAction() , pegamos a entrada do campo do formulário de pesquisa na linha e a definimos como igual a searchString. Observe na linha 82 que o webhook_url já está definido para uma API RESTful que criei em meu próprio aplicação FTSDemo . Neste aplicação, anexamos essa entradasearchString ao webhook_url antes de chamá-lo na API de busca na 111 linha. Para tornar esse aplicação totalmente seu, basta substituir o valor webhook_url existente na linha 82 por sua própria API a partir do filmes Stitch 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ê.