Práctica: Construir un sistema de búsqueda para un e-commerce

Lectura
30 min~5 min lectura

Concepto clave

En un e-commerce moderno, la búsqueda full-text avanzada no es solo encontrar productos por nombre, sino un sistema que entiende intención del usuario, maneja sinónimos, corrige errores tipográficos, y prioriza resultados por relevancia comercial. Piensa en Amazon: cuando buscas "laptop gaming", el sistema no solo busca coincidencias exactas, sino que entiende que "gaming" implica alta RAM, tarjeta gráfica dedicada, y procesadores específicos, mostrando primero los productos con mejor relación calidad-precio y disponibilidad.

Elasticsearch logra esto mediante Query DSL (Domain Specific Language), que permite combinar múltiples tipos de consultas en una sola búsqueda. Por ejemplo, puedes mezclar match queries para texto libre con term queries para filtros exactos como categorías, y aplicar boosting para dar más peso a productos en oferta o con mejor valoración. La analogía es un chef experto: no sigue una receta simple, sino que ajusta ingredientes (consultas) en tiempo real para crear el plato perfecto (resultado relevante).

Cómo funciona en la práctica

Imagina que tienes un índice de productos con campos como title, description, category, price, rating, y stock. Para construir una búsqueda avanzada, sigues estos pasos:

  1. Analiza el texto de entrada: Usa un analizador personalizado que aplique lowercase, elimine stopwords (como "el", "la"), y expanda sinónimos (ej., "pc" → "computadora", "ordenador").
  2. Combina consultas con bool query: Crea una consulta booleana con secciones must (requerido), should (opcional pero aumenta relevancia), y filter (exacto, sin afectar scoring).
  3. Aplica scoring personalizado: Usa funciones como field_value_factor para dar más peso a productos con alto rating o bajo precio.

Ejemplo de código básico:

{
  "query": {
    "bool": {
      "must": [
        {"match": {"title": "laptop gaming"}}
      ],
      "should": [
        {"match": {"description": "rápida"}},
        {"term": {"category": "electrónica"}}
      ],
      "filter": [
        {"range": {"price": {"lte": 1000}}},
        {"term": {"stock": true}}
      ]
    }
  }
}

Caso de estudio

Una tienda online de ropa implementó Elasticsearch para mejorar su búsqueda. Antes, los usuarios que buscaban "vestido verano" solo veían productos con esas palabras exactas, perdiendo ventas en artículos etiquetados como "vestido playa" o "vestido ligero". La solución fue:

  • Crear un mapeo con campos title (texto analizado) y title.keyword (exacto para filtros).
  • Configurar un analizador con sinónimos en un archivo synonyms.txt: "verano, playa, calor, ligero".
  • Usar una multi-match query para buscar en title y description simultáneamente.
  • Añadir un script_score para priorizar productos con descuentos mayores al 20%.

Resultado: Aumento del 30% en conversiones desde búsqueda, y reducción del 40% en búsquedas sin resultados.

Dato clave: En e-commerce, el 43% de los usuarios abandona el sitio si la búsqueda no devuelve resultados relevantes en los primeros 3 segundos (estudio de Baymard Institute).

Errores comunes

  1. Usar solo match queries sin filtros: Esto devuelve demasiados resultados irrelevantes. Solución: Siempre combinar con filter para restringir por categoría, precio, o disponibilidad.
  2. Ignorar el análisis de texto: No configurar analizadores personalizados lleva a que "camiseta" y "camisetas" sean tratados como términos diferentes. Solución: Usar stemmers o lematizadores en español.
  3. Sobrecargar el scoring con muchos should clauses: Añadir más de 5-10 cláusulas should puede ralentizar la búsqueda. Solución: Priorizar con boost y limitar a los campos más importantes.
  4. No probar con datos reales: Desarrollar con un dataset pequeño y luego fallar en producción. Solución: Usar herramientas como Kibana Dev Tools para simular tráfico alto.
  5. Olvidar la paginación: Devolver miles de resultados en una sola consulta. Solución: Implementar from y size, y considerar search_after para resultados profundos.

Checklist de dominio

  • Puedo diseñar un mapeo de índice con campos text y keyword apropiados para un catálogo de e-commerce.
  • Sé configurar analizadores personalizados con sinónimos y filtros para español.
  • Puedo construir una bool query que combine must, should, y filter para una búsqueda compleja.
  • Entiendo cómo usar field_value_factor y script_score para ajustar relevancia basada en métricas comerciales.
  • Sé implementar paginación eficiente y manejar grandes volúmenes de resultados.
  • Puedo medir el rendimiento de búsquedas usando Kibana y ajustar consultas según métricas.
  • Sé crear un pipeline de ingestión para enriquecer datos antes de indexar (ej., añadir etiquetas de temporada).

Implementa una búsqueda avanzada para una tienda de electrónicos

En este ejercicio, crearás un sistema de búsqueda full-text para una tienda online de electrónicos usando Elasticsearch 8.x. Sigue estos pasos:

  1. Prepara el entorno: Instala Elasticsearch y Kibana localmente o usa un cloud service. Crea un índice llamado electronics_store con este mapeo:
    PUT /electronics_store
    {
      "mappings": {
        "properties": {
          "name": {"type": "text", "analyzer": "spanish"},
          "category": {"type": "keyword"},
          "price": {"type": "float"},
          "rating": {"type": "float"},
          "stock": {"type": "boolean"},
          "tags": {"type": "text", "analyzer": "spanish"}
        }
      }
    }
  2. Indexa datos de ejemplo: Inserta al menos 10 documentos con productos como laptops, smartphones, y accesorios. Usa este ejemplo y modifícalo:
    POST /electronics_store/_doc/1
    {
      "name": "Laptop Gaming ASUS",
      "category": "laptops",
      "price": 1200.00,
      "rating": 4.5,
      "stock": true,
      "tags": "rápida, potente, gaming"
    }
  3. Construye una consulta avanzada: Crea una búsqueda que:
    • Busque en name y tags con un término como "laptop rápida".
    • Filtre por categoría "laptops" y stock disponible.
    • Aumente la relevancia de productos con rating mayor a 4.0.
    • Ordene por precio ascendente como desempate.
    Escribe la consulta en Query DSL y pruébala en Kibana Dev Tools.
  4. Optimiza el análisis: Configura un analizador personalizado en el índice que expanda sinónimos (ej., "rápida" → "veloz", "ágil") y aplica a los campos de texto.
  5. Prueba y mide: Ejecuta la búsqueda con diferentes términos y verifica los resultados. Usa el endpoint _search con explain: true para entender el scoring.
Pistas
  • Usa una bool query con must para el término de búsqueda, filter para categoría y stock, y should para rating alto.
  • Para el analizador personalizado, define un settings en el índice con un filter de sinónimos basado en un archivo o lista inline.
  • Considera usar field_value_factor en una function_score query para ajustar el scoring basado en rating.

Evalua tu comprension

Completa el quiz interactivo de arriba para ganar XP.