Visão geral
Neste tutorial, você aprenderá como integrar o MongoDB Search, um recurso avançado de pesquisa de texto completo, em um aplicativo Ruby on Rails.
Depois de concluir este tutorial, você terá um recurso de pesquisa totalmente funcional incorporado ao seu aplicativo Rails. Esse recurso permitirá que você encontre informações com eficiência.
Pré-requisitos
O tutorial baseia-se em um aplicativo modelo que você pode baixar no repositório GitHub mongodb-atlas-with-ruby-on-rails-example executando o seguinte comando:
git clone https://github.com/mongodb-developer/mongodb-atlas-with-ruby-on-rails-example.git
Em seguida, execute as seguintes ações de configuração:
Crie um cluster do MongoDB Atlas. Para aprender como criar um cluster, consulte a etapa Criar uma implantação do MongoDB – Ruby on Rails do guia de início rápido do Rails.
Atualize o arquivo
config/mongoid.ymldo aplicativo com sua própria string de conexão e defina o banco de dados padrão comoinspiration, conforme mostrado no exemplo de configuração a seguir:development: clients: default: uri: mongodb+srv://<username>:<password>@<host>/inspiration Inicie o aplicativo Rails executando o comando
rails server. Em seguida, preencha o formulário de entrada New Idea para inserir alguns dados de amostra na coleçãoinspiration.ideas.Dica
Dados de amostra
Para obter a funcionalidade de pesquisa demonstrada posteriormente no tutorial, insira exemplos de documentos que contenham alguns termos sobrepostos nos campos
nameoudescription.Crie um índice do MongoDB Search no Compass ou na interface do usuário do Atlas chamado
inspirationcom mapeamentos dinâmicos (padrão). Para saber mais sobre como criar índices de pesquisa do MongoDB , consulte a seção Índices de pesquisa do MongoDB do guia Índices.
Passos
Configure a funcionalidade MongoDB Search no seu modelo Mongoid.
Primeiro, atualize o modelo Idea para lidar com as query de pesquisa do MongoDB Search na coleção ideas definindo o método search no modelo. O método self.search(query) define um método de classe denominado search que utiliza um único argumento query e retorna os resultados da pesquisa.
Abra o arquivo app/models/idea.rb e substitua o conteúdo pelo seguinte código:
class Idea include Mongoid::Document include Mongoid::Timestamps field :name, type: String field :description, type: String field :picture, type: String def self.search(query) aggregation_pipeline = [ { "$search": { "index": "inspiration", "text": { "query": query, "path": ['name', 'description'] }, "sort": { "score": { "$meta": "searchScore" } } } }, { "$limit": 20 } ] results = collection.aggregate(aggregation_pipeline) search_results = results.to_a search_results.map do |result| Idea.new( id: result["_id"], name: result["name"], description: result["description"], picture: result["picture"] ) end end end
Quando você chamar idea.search("<example query>"), o Mongoid executará as seguintes ações:
Executa uma pesquisa de texto completo usando o índice
inspiration.Executa a consulta nos campos
nameedescription.Classifica os resultados conforme as pontuações de relevância.
Limita o número de resultados a
20para melhorar o desempenho das queries em grandes coleções.
A variável search_results converte os resultados brutos do MongoDB em uma array de hashes que podem ser mapeados para instâncias de modelo Idea e renderizados em seus arquivos de visualização.
Adicione uma ação de pesquisa ao seu controlador.
Agora que você definiu a funcionalidade de query de pesquisa no modelo Idea, é preciso adicionar uma ação para iniciar as queries.
Abra o arquivo app/controllers/ideas_controller.rb e adicione a seguinte ação ao seu IdeasController antes da declaração private:
def search @query = params[:query] @ideas = @query.present? ? Idea.search(@query) : Idea.all render :display_results end
Agora, ao enviar uma query de pesquisa, o Mongoid executa o método search no modelo Idea. Em seguida, os resultados são renderizados nos seus arquivos de exibição.
Gere o controller de pesquisa.
Execute o seguinte comando para gerar os arquivos de visualização SearchesController e display_results, que lidam com as solicitações search e exibem os resultados, respectivamente:
rails generate controller Searches display_results
Abra o arquivo searches_controller.rb recém-criado e substitua o conteúdo pelo seguinte código:
class SearchesController < ApplicationController def display_results query = params[:query] @results = Idea.search(query) end end
Abra o arquivo app/views/searches/display_results.html.erb e substitua o conteúdo pelo seguinte código, que renderiza os resultados da pesquisa:
<div class="search-results"> <h1>Search Results for "<%= params[:query] %>"</h1> <% if @results.empty? %> <p>No ideas found.</p> <% else %> <div class="idea-container"> <% @results.each do |result| %> <div class="idea"> <h2><%= result.name %></h2> <p><%= truncate(result.description, length: 150) %></p> <img src="<%= result.picture %>" alt="<%= result.name %>" /> <p><%= link_to "View", idea_path(result.id) %></p> </div> <% end %> </div> <% end %> </div> <%= link_to "Back", ideas_path %>
Em seguida, adicione o seguinte código ao seu arquivo app/assets/stylesheets/application.css para incluir o estilo básico para os resultados da pesquisa:
.search-results { width: 80%; margin: 0 auto; } .idea-container { display: flex; flex-direction: column; } .idea { padding: 20px; border-bottom: 2px solid #ccc; border-radius: 10px 10px 0 0; margin-bottom: 10px; } .idea h2 { margin: 0; } .idea p { margin: 0; } .idea img { width: 100px; height: auto; display: block; } ul { list-style-type: none; padding: 0; }
Crie o formulário de pesquisa.
Para habilitar queries de pesquisa diretamente no seu aplicativo, abra o arquivo app/views/ideas/index.html.erb e adicione o seguinte código:
<%= form_tag(search_results_path, method: :get, class: "form-inline") do %> <div class="input-group mb-3"> <%= text_field_tag :query, params[:query], placeholder: "Search Ideas...", class: "form-control" %> <div class="input-group-append"> <%= submit_tag "Search", class: "btn btn-primary text-white" %> </div> </div> <% end %>
Adicione o seguinte estilo da barra de pesquisa ao seu arquivo application.css:
.input-group { width: 100%; } .btn-primary { background-color: #007bff; border-color: #007bff; color: white; } .btn-primary:hover { background-color: #0056b3; border-color: #004085; }
Atualize rotas do aplicativo para queries de pesquisa.
Substitua a rota existente no arquivo config/routes.rb pela seguinte rota para exibir os resultados da pesquisa:
Rails.application.routes.draw do root to: "ideas#index" resources :ideas get '/search_results', to: 'searches#display_results', as: "search_results" end
Inicie seu aplicativo e execute queries de pesquisa.
No diretório do projeto, execute o seguinte comando para iniciar o aplicativo:
rails server
Navegue para http://127.0.0.1:3000/ para visualizar a página de chegada.
Para enviar uma query, digite um termo ou frase na barra de pesquisa e clique no botão Search. A imagem a seguir mostra os resultados da pesquisa para o termo "outdoor":

Os resultados da pesquisa dependem dos documentos em seu banco de dados. À medida que a complexidade dos dados aumenta, talvez seja necessário realizar consultas mais avançadas para restringir os resultados. Para saber mais sobre diferentes queries do MongoDB Search e ver exemplos, consulte a Referência de query na documentação do Atlas .
Conclusão
Neste tutorial, você aprendera como integrar a funcionalidade MongoDB Search em um aplicação Rails. Essa integração melhora a usabilidade e a funcionalidade, ao mesmo tempo em que melhora o envolvimento do usuário.
Para aprender mais sobre como realizar queries no Mongoid, consulte os guias Interação com dados.