es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flujo de búsqueda en MERN Stack

En primer lugar, intenté buscar mucho pero no puedo encontrar ningún recurso que satisfaga mis necesidades. Sé que puede haber algunas respuestas ya, si conoces alguna, por favor ayúdame con el enlace.

Sé cómo mostrar sugerencias de búsqueda, pero no sé cómo mostrar resultados de búsqueda completos cuando alguien hace clic en una sugerencia de búsqueda. ¿Cómo se hace eso en el stack MERN con un ejemplo si es posible?

Necesito una solución que se ajuste mejor a mi escenario:

Tengo tres modelos:

  • tags: contiene etiquetas
  • categories: contiene categorías
  • items: contiene datos de los elementos, tiene tanto categorías como etiquetas. Actualmente, no estoy almacenando referencias a las tablas de categorías y etiquetas, sino que las estoy almacenando directamente dentro de los elementos.

Ahora, básicamente quiero buscar los elementos que tienen categorías y etiquetas específicas cuando alguien busca una palabra clave.

Lo que estoy haciendo actualmente es buscar las etiquetas que coinciden con la palabra clave, luego las categorías, luego sacar sus _id(s) y encontrarlos en la colección de elementos.

const tags = await Tags.find(
    { tag: { $regex: category.toString(), $options: "i" } },
    { projection: { createdBy: 0 } }
);
const categories = await Categories.find(
    { category: { $regex: category.toString(), $options: "i" } },
    { projection: { createdBy: 0 } }
);

const tagsIdArray = tags.map((item) => new ObjectId(item._id));
const catIdArray = categories.map((item) => new Object(item._id));

$match: {
    $and: [
        {
            $or: [
                { "tags._id": { $in: [...tagsIdArray] } },
                { "category._id": { $in: [...catIdArray] } },
            ],
        },
    ],
},

Y sé que esta no es la mejor manera, y lleva mucho tiempo buscar una palabra clave específica.

Por favor, sugiéreme una estructura de esquema y una forma de implementar la búsqueda con sugerencias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para implementar búsqueda con sugerencias en MERN Stack

    Para implementar la búsqueda con sugerencias en MERN stack, puedes seguir el siguiente enfoque:

    1. Estructura del esquema

    • Crea una colección separada para categorías y etiquetas.
    • En la colección de elementos, almacena referencias a las categorías y etiquetas utilizando sus ObjectIDs en lugar de almacenar una copia directamente dentro de los elementos.

    Esto simplificará tu consulta de búsqueda y la hará más eficiente. Tu esquema de elementos debería lucir así:

    const itemSchema = new mongoose.Schema({
      name: String,
      categories: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Category' }],
      tags: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tag' }],
    });
    

    2. Búsqueda de texto completo usando Mongoose y MongoDB Atlas

    • Utiliza MongoDB Atlas para proporcionar funcionalidad eficiente de búsqueda de texto completo.
    • Crea un nuevo índice en la colección de elementos para admitir la búsqueda de texto completo:
    db.items.createIndex({name:'text'})
    
    • En tu aplicación de servidor, utiliza Mongoose con el operador $text para realizar una búsqueda de texto completo.
    const results = await Item.find({$text:{$search:query}})
    
    • Utiliza la canalización de agregación para unir las colecciones de categorías y etiquetas con la colección de elementos para obtener los detalles completos de los elementos:
    const results = await Item.aggregate([
      // Coincidencia de elementos basada en la búsqueda de texto completo
      {$match: {$text: {$search: query}}},
      // Búsqueda de categorías
      {$lookup: {
        from: "categories",
        localField: "categories",
        foreignField: "_id",
        as: "category"
      }},
      // Búsqueda de etiquetas
      {$lookup: {
        from: "tags",
        localField: "tags",
        foreignField: "_id",
        as: "tag"
      }},
      // Desenrollar categorías y etiquetas
      {$unwind: "$category"},
      {$unwind: "$tag"},
      // Agrupar por ID de elemento para combinar múltiples categorías y etiquetas
      {$group: {
        _id: "$_id",
        name: {$first: "$name"},
        categories: {$push: "$category"},
        tags: {$push: "$tag"}
      }}
    ])
    

    3. Sugerencias de búsqueda

    • Para proporcionar sugerencias de búsqueda, puedes utilizar el mismo índice de búsqueda de texto completo para realizar una búsqueda de prefijo en el campo name.
    const suggestions = await Item.find({
      name: {$regex: `^${query}`, $options: 'i'}
    }).limit(10).sort({name:1})
    
    • Puedes enviar estas sugerencias a la aplicación cliente como una lista de enlaces clicables. Cuando un usuario hace clic en una sugerencia, tu aplicación cliente puede ejecutar la consulta de búsqueda completa con la sugerencia seleccionada como término de búsqueda.

Comments are closed.