En resumen
Las API de Elasticsearch permiten búsqueda y análisis a gran escala. Indexa documentos como JSON, consulta usando el potente DSL y agrega resultados para análisis. La autenticación se realiza con claves API o autenticación básica. Para pruebas, utiliza Apidog para validar asignaciones de índices, probar consultas y depurar agregaciones antes de desplegar en producción.
Introducción
Elasticsearch es un motor distribuido de búsqueda y análisis. Procesa texto estructurado, logs, métricas y más. Es común en aplicaciones de búsqueda de texto completo, análisis de logs para debugging y dashboards de analítica en tiempo real.
Elasticsearch es el núcleo de la pila ELK (Elasticsearch, Logstash, Kibana), pero puedes consumirlo directamente vía API.
💡 Consejo: Si desarrollas funciones de búsqueda o análisis de logs, Apidog te permite probar consultas, validar asignaciones y depurar agregaciones. Guarda tus plantillas de búsqueda y compártelas con el equipo.
Prueba las API de Elasticsearch con Apidog - gratis
Al finalizar esta guía podrás:
- Indexar y gestionar documentos
- Escribir consultas de búsqueda con el DSL de Elasticsearch
- Usar agregaciones para análisis
- Configurar asignaciones y analizadores
- Monitorizar la salud del clúster
Primeros pasos
Ejecutar Elasticsearch localmente
# Docker
docker run -p 9200:9200 \
-e "discovery.type=single-node" \
elasticsearch:8.11.0
# O descarga el binario desde elastic.co
Verificar instalación
curl -X GET "http://localhost:9200"
Respuesta esperada:
{
"name": "elasticsearch-1",
"cluster_name": "elasticsearch",
"cluster_uuid": "abc123",
"version": {
"number": "8.11.0",
"build_flavor": "default"
},
"tagline": "You know, for search"
}
Autenticación
Desde la versión 8.x, Elasticsearch requiere autenticación por defecto.
curl -X GET "http://localhost:9200/_cluster/health" \
-u elastic:your_password
Alternativamente, usa claves API generadas en Kibana o vía API.
Índices y documentos
Crear un índice
Define settings y mappings iniciales:
curl -X PUT "http://localhost:9200/products" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"properties": {
"name": { "type": "text" },
"price": { "type": "float" },
"category": { "type": "keyword" },
"in_stock": { "type": "boolean" },
"created_at": { "type": "date" }
}
}
}'
Indexar un documento
curl -X POST "http://localhost:9200/products/_doc" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones",
"price": 79.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
Respuesta:
{
"_index": "products",
"_id": "abc123",
"_version": 1,
"result": "created",
"_seq_no": 0,
"_primary_term": 1
}
Obtener un documento
curl -X GET "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
Actualizar un documento
curl -X PUT "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"name": "Wireless Headphones Pro",
"price": 99.99,
"category": "electronics",
"in_stock": true,
"created_at": "2026-03-24T10:00:00Z"
}'
Eliminar un documento
curl -X DELETE "http://localhost:9200/products/_doc/abc123" \
-u elastic:your_password
Operaciones masivas (bulk)
Indexa varios documentos eficientemente:
curl -X POST "http://localhost:9200/products/_bulk" \
-u elastic:your_password \
-H "Content-Type: application/x-ndjson" \
-d '{"index":{"_id":"1"}}
{"name":"Product A","price":10.99,"category":"books","in_stock":true}
{"index":{"_id":"2"}}
{"name":"Product B","price":20.99,"category":"electronics","in_stock":false}
'
Consultas de búsqueda
Búsqueda básica
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"query": {
"match": {
"name": "headphones"
}
}
}'
Consultas booleanas
Combina condiciones para búsquedas avanzadas:
{
"query": {
"bool": {
"must": [
{ "match": { "name": "headphones" } }
],
"filter": [
{ "term": { "category": "electronics" } },
{ "range": { "price": { "lte": 100 } } },
{ "term": { "in_stock": true } }
]
}
}
}
Búsqueda de texto completo con puntuación
{
"query": {
"multi_match": {
"query": "wireless audio headphones",
"fields": ["name^2", "description"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
}
Los campos con ^2 tienen mayor peso en la puntuación.
Búsqueda de frases
Busca frases exactas:
{
"query": {
"match_phrase": {
"description": "noise canceling"
}
}
}
Comodín y expresiones regulares
{
"query": {
"wildcard": {
"name": "*headphone*"
}
}
}
Ordenación
{
"query": { "match_all": {} },
"sort": [
{ "price": "asc" },
{ "_score": "desc" }
]
}
Paginación
{
"from": 20,
"size": 10,
"query": { "match_all": {} }
}
Agregaciones
Utiliza agregaciones para obtener estadísticas y métricas.
Precio promedio por categoría
curl -X GET "http://localhost:9200/products/_search" \
-u elastic:your_password \
-H "Content-Type: application/json" \
-d '{
"size": 0,
"aggs": {
"by_category": {
"terms": { "field": "category" },
"aggs": {
"avg_price": { "avg": { "field": "price" } },
"min_price": { "min": { "field": "price" } },
"max_price": { "max": { "field": "price" } }
}
}
}
}'
Histograma de precios
{
"size": 0,
"aggs": {
"price_histogram": {
"histogram": {
"field": "price",
"interval": 25
}
}
}
}
Histogramas de fechas
{
"size": 0,
"aggs": {
"sales_over_time": {
"date_histogram": {
"field": "created_at",
"calendar_interval": "month"
}
}
}
}
Cardinalidad (recuentos únicos)
{
"size": 0,
"aggs": {
"unique_categories": {
"cardinality": { "field": "category" }
}
}
}
Asignaciones y analizadores
Tipos de campo
| Tipo | Uso para |
|---|---|
text |
Texto completo, analizado |
keyword |
Valores exactos, filtrado, ordenación |
integer, float
|
Números |
boolean |
Verdadero/falso |
date |
Fechas y horas |
object |
Objetos JSON anidados |
nested |
Arrays de objetos (mantiene relaciones) |
geo_point |
Coordenadas lat/lon |
Analizadores personalizados
Configura un analizador para autocompletado:
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "autocomplete_filter"]
}
},
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 20
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
Gestión del clúster
Salud del clúster
curl -X GET "http://localhost:9200/_cluster/health"
Respuesta:
{
"cluster_name": "elasticsearch",
"status": "green",
"number_of_nodes": 3,
"active_primary_shards": 25
}
Estados:
- verde: Todos los shards asignados
- amarillo: Réplicas no asignadas (nodo único)
- rojo: Faltan shards primarios
Estadísticas de índice
curl -X GET "http://localhost:9200/_cat/indices?v"
Estadísticas de nodo
curl -X GET "http://localhost:9200/_nodes/stats"
Borrar caché
curl -X POST "http://localhost:9200/_cache/clear"
Pruebas con Apidog
Las consultas en Elasticsearch pueden ser complejas. Testéalas a fondo antes de desplegar.
1. Guardar consultas comunes
Define plantillas reutilizables con variables:
{
"query": {
"bool": {
"must": [
{ "match": { "{{search_field}}": "{{search_term}}" } }
],
"filter": [
{ "range": { "{{price_field}}": { "lte": "{{max_price}}" } } }
]
}
}
}
2. Validar respuestas
Automatiza pruebas de respuesta con JavaScript en Apidog:
pm.test('Search returns results', () => {
const response = pm.response.json()
pm.expect(response.hits.total.value).to.be.above(0)
})
pm.test('Aggregations present', () => {
const response = pm.response.json()
pm.expect(response.aggregations).to.exist
})
3. Separación de entornos
Define variables para ambientes local y producción:
# Local
ES_HOST: http://localhost:9200
ES_USER: elastic
ES_PASSWORD: your_password
# Producción
ES_HOST: https://search.yourcompany.com
ES_API_KEY: prod_api_key
Prueba las API de Elasticsearch con Apidog - gratis
Errores comunes y soluciones
403 Prohibido
Causa: Autenticación fallida o permisos insuficientes.
Solución: Verifica tus credenciales y que la clave API tenga permisos correctos.
404 index_not_found_exception
Causa: El índice no existe.
Solución: Crea el índice antes o habilita la creación automática (no recomendado para producción).
circuit_breaking_exception
Causa: Consulta requiere demasiada memoria.
Solución: Reduce el parámetro size, simplifica la consulta o añade filtros.
search_phase_execution_exception
Causa: Error de sintaxis en la consulta.
Solución: Valida el JSON. Corrige comillas, rutas de campo o errores de formato.
Alternativas y comparaciones
| Característica | Elasticsearch | OpenSearch | Meilisearch | Typesense |
|---|---|---|---|---|
| Configuración | Autoalojado | Autoalojado | Binario único | Binario único |
| Calidad de búsqueda | Excelente | Bueno | Excelente | Bueno |
| Curva de aprendizaje | Pronunciada | Pronunciada | Fácil | Fácil |
| Escalabilidad | Excelente | Excelente | Bueno | Bueno |
| Oferta en la nube | Elastic Cloud | OpenSearch Serverless | Meilisearch Cloud | Typesense Cloud |
Elasticsearch tiene la mayor cantidad de características y comunidad. Meilisearch y Typesense son más simples para búsquedas básicas.
Casos de uso en el mundo real
Búsqueda en e-commerce: Indexa productos, permite búsquedas por nombre, descripción, categoría y rango de precios. Implementa autocompletado y filtros por categoría/disponibilidad.
Logs de aplicaciones: Envía logs a Elasticsearch con Filebeat. Filtra por servicio, severidad y tiempo. Usa dashboards para tasas de error y tiempos de respuesta.
Analítica de seguridad: Indexa logs de red, busca IPs sospechosas, visualiza patrones de tráfico y detecta anomalías con agregaciones.
Conclusión
Lo aprendido:
- Indexación de documentos JSON
- Consultas usando el DSL de Elasticsearch
- Agregaciones para análisis
- Configuración de asignaciones óptimas
- Monitorización del clúster
Próximos pasos:
- Ejecuta Elasticsearch localmente
- Crea un índice con mappings adecuados
- Indexa documentos de prueba
- Escribe consultas de búsqueda
- Prueba agregaciones
Prueba las API de Elasticsearch con Apidog - gratis
Preguntas frecuentes
¿Cuál es la diferencia entre Elasticsearch y Solr?
Ambos son motores de búsqueda basados en Lucene. Elasticsearch está más orientado a APIs y distribución; Solr ofrece más funciones empresariales. Para proyectos nuevos, Elasticsearch suele ser preferido.
¿Cómo manejo caracteres especiales en búsquedas?
Escapa estos caracteres: ()[]{}:^\"\\+-!~*?| con una barra invertida. O utiliza simple_query_string.
¿Qué es un shard?
Partición de un índice. Un shard primario es para escritura; los de réplica son copias para lectura/escalado.
¿Cuántos shards crear?
20-50 GB por shard es buena práctica. Empieza con 1 shard primario y réplicas; sólo aumenta los primarios si es necesario.
¿Puedo cambiar mappings tras la indexación?
Puedes añadir nuevos campos. Para cambiar tipos de campo existentes, es necesario reindexar. Usa plantillas de índice para consistencia.
¿Qué es el parámetro _routing?
Permite enrutar documentos a shards específicos según un campo (por defecto _id). Útil si consultas siempre filtran por un campo concreto (ej: user_id).
¿Cómo manejo datos basados en tiempo?
Usa índices por fecha (logs-2026.03.24). Así puedes eliminar datos antiguos fácilmente y mejorar el rendimiento de consulta.

Top comments (0)