Operaciones CRUD en Elasticsearch mediante API REST

Una vez desplegado un clúster de Elasticsearch, es fundamental monitorear su estado operativo: nodos activos, nodo maestro, salud del clúster y distribución de réplicas. Esta guía explica cómo interactuar con el clúster usando comandos curl estándar y la API REST, cubriendo operaciones de diagnóstico, gestión de índices, manipulación de documentos y procesamiento masivo.

Estructura básica de las solicitudes REST

La interfaz de Elasticsearch sigue el patrón RESTful. Cada petición se construye con los siguientes componentes:

  • Método HTTP: GET (lectura), POST (creación o acción no idempotente), PUT (creación o reemplazo idempotente), DELETE (eliminación).
  • URL base: http://<host>:<puerto>/<ruta>, donde <ruta> puede ser /_cat, /_cluster/health, /_search, etc.
  • Parámetros de consulta: como ?v (para mostrar encabezados), ?pretty (formato legible), ?s=docs.count:desc (ordenamiento), o ?health=yellow (filtro por estado).
  • Cuerpo de la solicitud (-d): JSON válido, usado en operaciones de escritura como creación o actualización.

Diagnóstico del clúster

Las rutas bajo /_cat ofrecen vistas tabulares útiles para administración rápida:

# Estado general del clúster
curl -X GET "http://192.168.31.215:9201/_cat/health?v&pretty" -u elastic:26tBktGolYCyZD2pPISW

# Nodo maestro actual
curl -X GET "http://192.168.31.215:9201/_cat/master?v" -u elastic:26tBktGolYCyZD2pPISW

# Todos los nodos participantes
curl -X GET "http://192.168.31.215:9201/_cat/nodes?v" -u elastic:26tBktGolYCyZD2pPISW

# Índices ordenados por tamaño de almacenamiento (descendente)
curl -X GET "http://192.168.31.215:9201/_cat/indices?v&h=i,store.size&s=store.size:desc" -u elastic:26tBktGolYCyZD2pPISW

# Shards del índice 'products', con detalles de estado y ubicación
curl -X GET "http://192.168.31.215:9201/_cat/shards/products?v" -u elastic:26tBktGolYCyZD2pPISW

# Total de documentos en todos los índices
curl -X GET "http://192.168.31.215:9201/_all/_count?pretty" -u elastic:26tBktGolYCyZD2pPISW

Operaciones CRUD sobre documentos

El comportamiento varía según el endpoint y el método HTTP utilizado:

Acción Método Endpoint Comportamiento clave
Crear (ID geenrado) POST /logs/_doc Asigna un ID único automáticamente. Múltiples peticiones generan documentos distintos incluso con contenido idéntico.
Crear (ID explícito) PUT o POST /logs/_create/101 Falla si ya existe un documento con ese ID. Garantiza exclusividad.
Indexar / Reemplazar PUT o POST /logs/_doc/101 Si el ID existe, reemplaza el documento completo y aumenta la versión (_version). No conserva campos ausentes en el nuevo cuerpo.
Leer GET /logs/_doc/101 Recupera el documento completo, incluyendo metadatos como _version y _seq_no.
Actualizar parcial POST /logs/_update/101 Modifica solo los campos especificados dentro del objeto "doc". No elimina campos omitidos. Requiere que el documento exista.
Eliminar documento DELETE /logs/_doc/101 Marca el documento como eliminado lógicamente (soft delete). El espacio se reclama en fusiones posteriores.
Eliminar índice DELETE /logs Borra todo el índice y sus datos asociados. Irreversible.

Ejemplos prácticos

Creación con ID generado

curl -X POST "http://192.168.31.215:9201/logs/_doc?pretty" \
  -H "Content-Type: application/json" \
  -u elastic:26tBktGolYCyZD2pPISW \
  -d '{
    "author": "Ana López",
    "topic": "Elasticsearch avanzado",
    "published": true,
    "year": 2024
  }'

Creación con ID fijo

curl -X PUT "http://192.168.31.215:9201/logs/_create/777?pretty" \
  -H "Content-Type: application/json" \
  -u elastic:26tBktGolYCyZD2pPISW \
  -d '{
    "author": "Carlos Méndez",
    "topic": "Gestión de clústeres",
    "published": false,
    "year": 2024
  }'

Actualización parcial

curl -X POST "http://192.168.31.215:9201/logs/_update/777?pretty" \
  -H "Content-Type: application/json" \
  -u elastic:26tBktGolYCyZD2pPISW \
  -d '{
    "doc": {
      "published": true,
      "reviewed_by": "Sofía Ruiz"
    }
  }'

Operaciones masivas

Bulk API

Permite agrupar múltiples operaciones (index, create, update, delete) en una sola llamada. Cada acción va seguida de su payload correspondiente, separados por saltos de línea (formato NDJSON):

curl -X POST "http://192.168.31.215:9201/_bulk?pretty" \
  -H "Content-Type: application/x-ndjson" \
  -u elastic:26tBktGolYCyZD2pPISW \
  --data-binary @- <<EOF
{ "index" : { "_index" : "logs", "_id" : "1001" } }
{ "author": "María Gómez", "topic": "Monitorización", "year": 2024 }
{ "create" : { "_index" : "logs", "_id" : "1002" } }
{ "author": "Javier Torres", "topic": "Seguridad", "year": 2024 }
{ "delete" : { "_index" : "logs", "_id" : "1003" } }
EOF

MGET — Lectura múltiple eficiente

Recupera varios documentos en una única petición, reduciendo latencia de red:

curl -X GET "http://192.168.31.215:9201/_mget?pretty" \
  -H "Content-Type: application/json" \
  -u elastic:26tBktGolYCyZD2pPISW \
  -d '{
    "docs": [
      { "_index": "logs", "_id": "1001" },
      { "_index": "logs", "_id": "1002" },
      { "_index": "metrics", "_id": "2024-01-01" }
    ]
  }'

MSEARCH — Búsqueda múltiple concurrente

Ejecuta varias consultas independientes en una sola llamada. Usa formato NDJSON: cada línea es un header (con índice y opciones) y la siguiente es el body de búsqueda:

curl -X GET "http://192.168.31.215:9201/logs/_msearch?pretty" \
  -H "Content-Type: application/x-ndjson" \
  -u elastic:26tBktGolYCyZD2pPISW \
  --data-binary @- <<EOF
{"size": 5}
{"query": {"match": {"topic": "Elasticsearch"}}}
{"index": "metrics", "size": 3}
{"aggs": {"avg_year": {"avg": {"field": "year"}}}}
EOF

Etiquetas: Elasticsearch rest-api bulk-api msearch curd

Publicado el 10-24 19:19