Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Ejecuta una MongoDB Search query

En este tutorial, puedes aprender a integrar MongoDB Search, una funcionalidad avanzada de búsqueda de texto completo, en una aplicación Ruby on Rails.

Luego de completar este tutorial, tendrás una funcionalidad de búsqueda completamente funcional integrada en tu aplicación Rails, permitiéndote encontrar información de manera eficiente.

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, realiza las siguientes acciones de configuración:

  1. Cree un clúster de MongoDB Atlas. Para saber cómo crear un clúster, consulte Configura tu proyecto paso de la guía de inicio rápido de Rails.

  2. Actualizar la aplicación config/mongoid.yml archivo con su propia cadena de conexión y establecer la base de datos por defecto en inspiration, como se muestra en la siguiente configuración de ejemplo:

    development:
    clients:
    default:
    uri: mongodb+srv://<username>:<password>@<host>/inspiration
  3. Inicie la aplicación Rails ejecutando el comando rails server y luego complete la New Idea formulario de entrada para insertar algunos datos de muestra en la colección inspiration.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 name o description.

  4. Crea un índice MongoDB Search en Compass o la Interfaz de Usuario de Atlas llamado inspiration con asignaciones dinámicas (por defecto). Para obtener más información sobre cómo crear índices de MongoDB Search, consulte la sección Índices de MongoDB Search de la guía Índices.

1

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:

  1. Realiza una búsqueda de texto completo utilizando el índice inspiration.

  2. Ejecuta la query en los campos name y description.

  3. Ordena los resultados por sus puntuaciones de relevancia.

  4. Limita el número de resultados a 20 para mejorar el rendimiento de las consultas en colecciones grandes.

La variable search_results convierte luego los resultados en bruto de MongoDB en un arreglo de hashes que puede asignarse a instancias de modelo de Idea y renderizarse en tus archivos de vista.

2

Ahora que has definido la funcionalidad de la Consulta de Búsqueda en el modelo Idea, debes añadir una acción para iniciar las consultas.

Abre el archivo app/controllers/ideas_controller.rb y añade la siguiente acción a tu 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, cuando envía una consulta de búsqueda, Mongoid ejecuta el método search en el modelo Idea. Los resultados se muestran entonces en sus archivos de vistas.

3

Ejecuta el siguiente comando para generar el SearchesController y el archivo de vista display_results, que gestiona las solicitudes search y muestra los resultados, respectivamente:

rails generate controller Searches display_results

Abre el archivo searches_controller.rb recién creado y reemplaza el contenido con el siguiente código:

class SearchesController < ApplicationController
def display_results
query = params[:query]
@results = Idea.search(query)
end
end

Abre el archivo app/views/searches/display_results.html.erb y reemplaza el contenido con el siguiente código, que renderiza los resultados de 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;
}
4

Para habilitar las consultas de búsqueda directamente en tu aplicación, abre el archivo app/views/ideas/index.html.erb y agrega 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;
}
5

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
6

En el directorio de su proyecto, ejecute el siguiente comando para iniciar su aplicación:

rails server

Navega a http://127.0.0.1:3000/ para ver la página de destino.

Para enviar una query, escribe un término o frase en la barra de búsqueda y luego haz clic en el botón Search. La siguiente imagen muestra los resultados de búsqueda para el término "outdoor":

Los resultados de búsqueda renderizados

Los resultados de la búsqueda dependen de los documentos en tu base de datos. A medida que la complejidad de tus datos aumenta, es posible que debas realizar consultas más avanzadas para acotar los resultados. Para obtener más información sobre las diferentes MongoDB Search queries y ver ejemplos, consulte la Query Reference en la documentación de Atlas.

En este tutorial aprendiste a integrar la funcionalidad de MongoDB Search en una aplicación Rails. Esta integración mejora la usabilidad y la funcionalidad a la vez que incrementa la interacción de los usuarios.

Para conocer más sobre cómo realizar queries en Mongoid, consulta las guías de Interactuar con Datos.

Volver

Transacciones y Sesiones

En esta página