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:
- 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").
- Combina consultas con bool query: Crea una consulta booleana con secciones
must(requerido),should(opcional pero aumenta relevancia), yfilter(exacto, sin afectar scoring). - Aplica scoring personalizado: Usa funciones como
field_value_factorpara 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) ytitle.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
titleydescriptionsimultá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
- Usar solo match queries sin filtros: Esto devuelve demasiados resultados irrelevantes. Solución: Siempre combinar con
filterpara restringir por categoría, precio, o disponibilidad. - 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.
- Sobrecargar el scoring con muchos should clauses: Añadir más de 5-10 cláusulas
shouldpuede ralentizar la búsqueda. Solución: Priorizar conboosty limitar a los campos más importantes. - 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.
- Olvidar la paginación: Devolver miles de resultados en una sola consulta. Solución: Implementar
fromysize, y considerarsearch_afterpara 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:
- Prepara el entorno: Instala Elasticsearch y Kibana localmente o usa un cloud service. Crea un índice llamado
electronics_storecon 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"} } } } - 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" } - Construye una consulta avanzada: Crea una búsqueda que:
- Busque en
nameytagscon 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.
- Busque en
- 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.
- Prueba y mide: Ejecuta la búsqueda con diferentes términos y verifica los resultados. Usa el endpoint
_searchconexplain: truepara entender el scoring.
- 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.