Concepto clave
Diseñar un índice optimizado en Elasticsearch para un dataset de productos es como construir una biblioteca especializada. En lugar de organizar libros por título o autor, creas un sistema donde cada producto tiene múltiples puntos de acceso: nombre, categoría, precio, especificaciones técnicas y reseñas. El mapeo avanzado define cómo se almacenan y analizan estos datos, determinando la velocidad y precisión de las búsquedas.
La optimización va más allá de la configuración básica. Implica decisiones estratégicas sobre tipos de campos, analizadores personalizados y estrategias de particionamiento. Por ejemplo, un campo de texto para nombres de productos puede necesitar un analizador que maneje sinónimos y errores ortográficos, mientras que un campo numérico para precios debe soportar agregaciones rápidas. La clave es anticipar los patrones de consulta y modelar el índice para satisfacerlos eficientemente.
Cómo funciona en la práctica
Vamos a crear un índice para productos electrónicos. Primero, definimos el mapeo con campos específicos:
PUT /productos_electronicos
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"analysis": {
"analyzer": {
"custom_spanish": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "spanish_stop", "spanish_stemmer"]
}
}
}
},
"mappings": {
"properties": {
"nombre": {
"type": "text",
"analyzer": "custom_spanish",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"precio": {
"type": "scaled_float",
"scaling_factor": 100
},
"categoria": {
"type": "keyword"
},
"especificaciones": {
"type": "nested",
"properties": {
"clave": {
"type": "keyword"
},
"valor": {
"type": "text",
"analyzer": "custom_spanish"
}
}
}
}
}
}Este mapeo usa un analizador personalizado para español en campos de texto, tipos optimizados como scaled_float para precios, y una estructura nested para especificaciones técnicas que permite búsquedas complejas sin pérdida de precisión.
Caso de estudio
Una tienda online de electrónicos con 500,000 productos necesita mejorar su búsqueda. El índice original tenía problemas: búsquedas lentas en nombres de productos y agregaciones imprecisas en precios. Implementamos un nuevo índice con las siguientes optimizaciones:
| Problema | Solución | Resultado |
|---|---|---|
| Búsqueda lenta en "nombre" | Analizador personalizado con stemmer español | Reducción de 200ms a 50ms por consulta |
| Agregaciones inexactas en "precio" | Campo scaled_float con factor 100 | Precisión del 99.9% en cálculos |
| Filtros complejos en especificaciones | Estructura nested para atributos técnicos | Consultas 3x más rápidas |
El diseño del índice redujo el tiempo promedio de búsqueda de 300ms a 80ms, mejorando la experiencia del usuario y aumentando las conversiones en un 15%.
Errores comunes
- Usar "text" para todos los campos: Campos como categorías o IDs deben ser "keyword" para filtros exactos y agregaciones rápidas.
- Ignorar el análisis de idioma: No configurar analizadores para el idioma de los datos (ej. español) reduce la relevancia de búsquedas full-text.
- Sobredimensionar shards: Crear demasiados shards (ej. 10 para 100,000 documentos) aumenta la sobrecarga de gestión sin beneficio.
- No usar tipos numéricos optimizados: Emplear "float" en lugar de "scaled_float" para precios puede causar problemas de precisión en agregaciones.
- Olvidar replicas en producción: Configurar 0 replicas compromete la disponibilidad durante fallos de nodos.
Checklist de dominio
- ¿Definiste analizadores personalizados para el idioma de tus datos?
- ¿Usaste tipos de campo específicos (keyword, scaled_float, nested) según el uso?
- ¿Configuraste un número adecuado de shards y replicas para tu volumen de datos?
- ¿Incluiste campos multifield (ej. texto + keyword) para búsquedas flexibles?
- ¿Probaste consultas reales contra el mapeo antes de cargar datos masivos?
- ¿Documentaste las decisiones de mapeo para el equipo?
- ¿Consideraste estrategias de indexación temporal (ej. índices por mes) para datos históricos?
Optimiza un índice de productos para una tienda de ropa
Implementa un índice Elasticsearch optimizado para un dataset de 100,000 productos de ropa. Sigue estos pasos:
- Crea un índice llamado "ropa_optimizado" con 2 shards y 1 replica.
- Define un mapeo con estos campos: nombre (texto con analizador español), precio (scaled_float), talla (keyword), color (keyword con subcampo text), y materiales (nested con clave y valor).
- Configura un analizador personalizado para español que incluya tokenizer standard, filtros lowercase, spanish_stop y spanish_stemmer.
- Indexa 3 documentos de ejemplo con datos realistas.
- Ejecuta una consulta que busque "camiseta algodon" en nombre y materiales, filtrando por talla "M" y rango de precio 10-50.
- Usa la API PUT para crear el índice con settings y mappings en una sola solicitud.
- Para el campo color, define un tipo keyword pero añade un subcampo text para búsquedas full-text.
- En la consulta, recuerda usar nested query para el campo materiales.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.