Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
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 ejemplo que puedes descargar del 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. Crea un clúster de MongoDB Atlas. Para aprender a crear un clúster, consulta el 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. Inicia la aplicación Rails ejecutando el comando rails server y luego completa 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

En primer lugar, actualizar el modelo Idea para gestionar las queries de MongoDB Search sobre 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 único argumento query y devuelve los resultados de búsqueda.

Abrir el archivo app/models/idea.rb y sustituir su contenido por 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 se llama 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, añadir el siguiente código al archivo de app/assets/stylesheets/application.css para incluir un estilo básico en 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, ejecutar el siguiente comando para iniciar la 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