Integração do Atlas Search em uma Aplicação Ruby on Rails
Avalie esse Tutorial
No artigo "Introdução ao MongoDB Atlas e Ruby on Rails", Luce Carter nos mostra como integrar o MongoDB Atlas em um aplicativo Ruby on Rails chamado Inpiration. Os usuários podem capturar e organizar suas ideias criadoras, graças à integração do MongoDB Atlas. Neste artigo, vamos construir sobre a base apresentada no artigo de Luce e fazer uma análise mais detalhada à medida que integramos a pesquisa de texto diretamente em nosso aplicativo Rails. Ao final deste artigo, você terá um recurso de pesquisa totalmente funcional embutido em seu aplicativo Rails, permitindo que os usuários encontrem com eficiência as ideias de que precisam.
Antes de começar, você precisará concluir o seguinte:
- Crie um cluster do MongoDB Atlas.
- Atualize a seção de configuração de desenvolvimento dentro
config/mongoid.yml
e adicione sua própria connection string. - Certifique-se de ter dados armazenados em seu MongoDB Atlas cluster que você possa consultar no Atlas Search. Isso deve incluir as ideias que você adicionou ao seu aplicativo Inspiração.
- Usando a interface do usuário do Atlas, crie um índice do Atlas Search chamado inspiração. Um guia passo a passo sobre como criar um índice do Atlas Search pode ser encontrado na documentação do Atlas.
Agora que temos nosso ambiente configurado corretamente e nosso índice de expiração criado, podemos atualizar nosso modelo para lidar com as queries em nosso banco de dados de dados. Fazemos isso definindo um método de pesquisa em nosso modelo de ideias. O método
self.search(query):
define um método de classe chamado search que usa um único argumento e retorna os resultados.- Abra seu arquivo
idea.rb
- Substitua seu conteúdo pelo conteúdo abaixo:
1 class Idea 2 include Mongoid::Document 3 include Mongoid::Timestamps 4 field :name, type: String 5 field :description, type: String 6 field :picture, type: String 7 8 def self.search(query) 9 aggregation_pipeline = [ 10 { 11 "$search": { 12 "index": "inspiration", 13 "text": { 14 "query": query, 15 "path": ['name', 'description'] 16 }, 17 "sort": { 18 "score": {"$meta": "searchScore"} 19 } 20 } 21 }, 22 { 23 "$limit": 20 24 } 25 ] 26 results = collection.aggregate(aggregation_pipeline) 27 28 search_results = results.to_a 29 search_results.map do |result| 30 Idea.new( 31 id: result["_id"], 32 name: result["name"], 33 description: result["description"], 34 picture: result["picture"] 35 ) 36 end 37 end 38 end
Quando você chama
idea.search("example query")
, o Mongoid constrói e executa uma consulta MongoDB que:- Executa uma Full Text Search usando Atlas Search no índice de expiração.
- Executa uma query nos campos de nome e descrição.
- Classifica os resultados por sua pontuação de relevância.
- Limita os resultados a 20. Usar um limite é uma boa prática para evitar problemas de desempenho se sua coleção contiver milhões de documentos.
A variávelsearch_results então converte os resultados brutos do MongoDB em uma array de hashes que podem ser mapeados para novas instâncias do Ideal e renderizados em nossos arquivos de visualização.
1 search_results.map do |result| 2 Idea.new( 3 id: result["_id"], 4 name: result["name"], 5 description: result["description"], 6 picture: result["picture"] 7 ) 8 end
Agora que definimos nossa consulta de pesquisa em nosso modelo de ideias, precisamos de uma maneira de iniciar essa pesquisa. Fazemos isso adicionando uma ação de pesquisa em nosso IdealsController. Adicione o seguinte código ao seu IdeasController:
1 def search 2 @query = params[:query] 3 @ideas = @query.present? ? Idea.search(@query) : Idea.all 4 render :display_results 5 end
Com essa configuração, quando você enviar uma query de pesquisa , ela chamará o método de pesquisa no modelo deideia para realizar a pesquisa. Os resultados serão então renderizados em nossos arquivos de visualização.
Criaremos um SearchesController separado para lidar com as solicitações de pesquisa e exibir os resultados da pesquisa.
Execute o seguinte comando para gerar o SearchesController e o arquivo de visualização string_results.
1 rails generate controller Searches display_results
Abra seu arquivo
searches controller.rb
e adicione o seguinte código.1 class SearchesController < ApplicationController 2 def display_results 3 query = params[:query] 4 @results = Idea.search(query) 5 end 6 end
Abra o arquivo
display_results.html.erb
e adicione o seguinte, que retornará nossos resultados de pesquisa.1 <div class="search-results"> 2 <h1>Search Results for "<%= params[:query] %>"</h1> 3 4 <% if @results.empty? %> 5 <p>No ideas found.</p> 6 <% else %> 7 <div class="idea-container"> 8 <% @results.each do |result| %> 9 <div class="idea"> 10 <h2><%= result.name %></h2> 11 <p><%= truncate(result.description, length: 150) %></p> 12 <img src="<%= result.picture %>" alt="<%= result.name %>" /> 13 14 <p><%= link_to "View", idea_path(result.id) %></p> 15 </div> 16 <% end %> 17 </div> 18 <% end %> 19 </div> 20 21 <%= link_to "Back", ideas_path %>
Em seu arquivo
application.css
, adicione o seguinte para criar um estilo básico para seus resultados de pesquisa:1 .search-results { 2 /* Add styles for the search results container */ 3 width: 80%; 4 margin: 0 auto; 5 } 6 .idea-container { 7 display: flex; 8 flex-direction: column; 9 } 10 .idea { 11 padding: 20px; 12 border-bottom: 2px solid #ccc; 13 border-radius: 10px 10px 0 0; 14 margin-bottom: 10px; 15 } 16 .idea h2 { 17 margin: 0; 18 } 19 .idea p { 20 margin: 0; 21 } 22 .idea img { 23 width: 100px; /* Adjust the width of the image */ 24 height: auto; /* Maintain aspect ratio */ 25 display: block; /* Ensure the image takes up full width */ 26 } 27 /* Remove bullet points */ 28 ul { 29 list-style-type: none; 30 padding: 0; 31 }
Com essa configuração, quando você enviar uma consulta de pesquisa, ela será encaminhada para
SearchesController
, que chamará o método de pesquisa no modelo Idea
para realizar a pesquisa. Os resultados serão então exibidos na visualizaçãodisplay_results
.Agora, só precisamos criar uma interface de usuário simples para que os usuários possam enviar queries diretamente em nosso aplicativo Rails.
- Abra seu
index.html.erb
. - Copie e cole o código abaixo para adicionar um formulário de pesquisa e um espaço reservado para os resultados da pesquisa.
1 <%= form_tag(search_results_path, method: :get, class: "form-inline") do %> 2 <div class="input-group mb-3"> 3 <%= text_field_tag :query, params[:query], placeholder: "Search Ideas...", class: "form-control" %> 4 <div class="input-group-append"> 5 <%= submit_tag "Search", class: "btn btn-primary text-white" %> 6 </div> 7 </div> 8 <% end %>
- Adicione o seguinte estilo para a barra de pesquisa no seu
application.css
arquivo:
1 .input-group { 2 width: 100%; 3 } 4 5 .btn-primary { 6 background-color: #007bff; 7 border-color: #007bff; 8 color: white; 9 } 10 11 .btn-primary:hover { 12 background-color: #0056b3; 13 border-color: #004085; 14 }
Para redirecionar usuários para o arquivo de visualização exibe_resultados, precisamos atualizar nosso concerns.rb.
Adicione a seguinte solicitação get ao seu arquivo de rotas:
1 Rails.application.routes.draw do 2 root to: "ideas#index" 3 4 resources :ideas 5 get '/search_results', to: 'searches#display_results', as: "search_results" 6 end
É hora de testar nosso aplicativo. Comece executando o seguinte comando no diretório do seu projeto:
1 rails server
Para enviar uma pesquisa, adicione seu termo de query na barra de pesquisa e clique em "Search. "
Aqui estão os resultados de uma pesquisa no meu MongoDB database para a palavra "pet ":
Observe que os resultados da pesquisa dependem do conteúdo do seu próprio banco de dados. Portanto, verifique se o seu banco de dados tem os dados que você está solicitando. No entanto, à medida que a complexidade de seus dados aumenta, a necessidade de consultas de pesquisa mais avançadas pode ser necessária.Consulte adocumentaçãodo MongoDB para obter informações sobre essas queries.
E, com isso, agora temos um recurso de pesquisa totalmente funcional integrado em nosso aplicativo Rails. Essa integração não apenas melhora a usabilidade e a funcionalidade do nosso aplicativo, mas também pode ajudar a melhorar o engajamento do usuário. Nosso aplicativo Rails agora oferece uma ferramenta poderosa para os usuários encontrarem e gerenciarem suas ideias criadoras de forma eficaz. Certifique-se de explorar mais sobre o MongoDB Atlas e Rails nos fóruns da comunidade, compartilhar suas experiências ou fazer quaisquer perguntas que você possa ter!