Overview
En este tutorial podrás aprender a integrar MongoDB Search, una función avanzada de búsqueda de texto completo, en una aplicación Ruby on Rails.
Después de completar este tutorial, tendrá una función de búsqueda completamente funcional incorporada en su aplicación Rails, lo que le permitirá encontrar información de manera eficiente.
Requisitos previos
El tutorial se basa en una aplicación de plantilla que puedes descargar desde el repositorio de GitHub mongodb-atlas-with-ruby-on-rails-example ejecutando el siguiente comando:
git clone https://github.com/mongodb-developer/mongodb-atlas-with-ruby-on-rails-example.git
Luego, realice las siguientes acciones de configuración:
Cree un clúster de MongoDB Atlas. Para saber cómo crear un clúster, consulte PasoConfigurar su proyecto de la guía de inicio rápido de Rails.
Actualizar la aplicación
config/mongoid.ymlarchivo con su propia cadena de conexión y configure la base de datos predeterminada eninspiration, como se muestra en el siguiente ejemplo de configuración:development: clients: default: uri: mongodb+srv://<username>:<password>@<host>/inspiration Inicie la aplicación Rails ejecutando el comando
rails servery luego complete la New Idea formulario de entrada para insertar algunos datos de muestra en la coleccióninspiration.ideas.Tip
Datos de muestra
Para lograr la funcionalidad de búsqueda demostrada más adelante en el tutorial, inserte documentos de muestra que contengan algunos términos superpuestos en los campos
nameodescription.Cree un índice de búsqueda de MongoDB en Compass o la interfaz de usuario de Atlas llamado
inspirationcon asignaciones dinámicas (predeterminadas). Para obtener más información sobre la creación de índices de búsqueda de MongoDB, consulte la sección "Índices de búsqueda de MongoDB" de la guía de índices.
Pasos
Configure la función de búsqueda de MongoDB en su modelo Mongoid.
Primero, actualice el modelo Idea para gestionar las consultas de búsqueda de MongoDB en la colección ideas definiendo el método search en el modelo. El método self.search(query) define un método de clase llamado search que toma un solo argumento query y devuelve los resultados de la búsqueda.
Abra el archivo app/models/idea.rb y reemplace su contenido con el siguiente 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
Cuando llamas a idea.search("<example query>"), Mongoid realiza las siguientes acciones:
Realiza una búsqueda de texto completo utilizando el índice
inspiration.Ejecuta la query en los campos
nameydescription.Ordena los resultados por sus puntuaciones de relevancia.
Limita el número de resultados a
20para mejorar el rendimiento de las consultas en colecciones grandes.
Luego, la variable search_results convierte los resultados sin procesar de MongoDB en una matriz de hashes que pueden asignarse a instancias del modelo Idea y representarse en los archivos de vista.
Agregue una acción de búsqueda en su controlador.
Ahora que ha definido la funcionalidad de consulta de búsqueda en el modelo Idea, debe agregar una acción para iniciar consultas.
Abra el archivo app/controllers/ideas_controller.rb y agregue la siguiente acción a su IdeasController antes de la declaración private:
def search @query = params[:query] @ideas = @query.present? ? Idea.search(@query) : Idea.all render :display_results end
Ahora, al enviar una consulta de búsqueda, Mongoid ejecuta el método search en el modelo Idea. Los resultados se muestran en los archivos de vista.
Generar el controlador de búsqueda.
Ejecute el siguiente comando para generar los archivos de vista SearchesController y display_results, que manejan search solicitudes y muestran los resultados, respectivamente:
rails generate controller Searches display_results
Abra el archivo searches_controller.rb recién creado y reemplace el contenido con el siguiente código:
class SearchesController < ApplicationController def display_results query = params[:query] @results = Idea.search(query) end end
Abra el archivo app/views/searches/display_results.html.erb y reemplace el contenido con el siguiente código, que muestra los resultados de la búsqueda:
<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 %>
Luego, agregue el siguiente código a su archivo app/assets/stylesheets/application.css para incluir un estilo básico para los resultados de búsqueda:
.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; }
Crear el formulario de búsqueda.
Para habilitar consultas de búsqueda directamente en su aplicación, abra el archivo app/views/ideas/index.html.erb y agregue el siguiente 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 %>
Añade el siguiente estilo a tu archivo application.css para la barra de búsqueda:
.input-group { width: 100%; } .btn-primary { background-color: #007bff; border-color: #007bff; color: white; } .btn-primary:hover { background-color: #0056b3; border-color: #004085; }
Actualizar las rutas de la aplicación para las consultas de búsqueda.
Reemplace la ruta existente en el archivo config/routes.rb con la siguiente ruta para mostrar los resultados de la búsqueda:
Rails.application.routes.draw do root to: "ideas#index" resources :ideas get '/search_results', to: 'searches#display_results', as: "search_results" end
Inicie su aplicación y ejecute consultas de búsqueda.
En el directorio de su proyecto, ejecute el siguiente comando para iniciar su aplicación:
rails server
Vaya a http://:127.0.0.1 3000/ para ver la página de destino.
Para realizar una consulta, escriba un término o frase en la barra de búsqueda y haga clic en el botón Search. La siguiente imagen muestra los resultados de la búsqueda del término "outdoor":

Los resultados de la búsqueda dependen de los documentos de su base de datos. A medida que aumenta la complejidad de sus datos, podría necesitar realizar consultas más avanzadas para restringir los resultados. Para obtener más información sobre las diferentes consultas de búsqueda de MongoDB y ver ejemplos, consulte la Referencia de consultas en la documentación de Atlas.
Conclusión
En este tutorial, aprendiste a integrar la función de búsqueda de MongoDB en una aplicación Rails. Esta integración mejora la usabilidad y la funcionalidad, a la vez que mejora la interacción del usuario.
Para conocer más sobre cómo realizar queries en Mongoid, consulta las guías de Interactuar con Datos.