RousselTMLEARNING

Artículo · OpenSearch: del descubrimiento a la maestría

Indexar y buscar: mapping, DSL, PPL y SQL

Este artículo está disponible en francés.

1. Déclarer ses index #

Modèle et mapping.

Un modèle d'index #

Déclarez les types avant la première écriture : le type d'un champ existant ne se change pas sans réindexer.

curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X PUT https://localhost:9200/_index_template/logs_app -d '{
  "index_patterns": ["logs-app-*"],
  "template": {
    "settings": {"number_of_shards": 1, "number_of_replicas": 0},
    "mappings": {"properties": {
      "@timestamp": {"type": "date"},
      "level": {"type": "keyword"},
      "service": {"type": "keyword"},
      "message": {"type": "text"},
      "duree_ms": {"type": "integer"}
    }}
  }
}'
TypePourRecherche
keywordValeur exacte : niveau, serviceFiltre, agrégation, tri
textTexte libre : messagePlein texte, analysé
date, integer, ipValeurs typéesPlages, agrégations, CIDR

2. Indexer #

L'API bulk.

Écrire par lots #

cat > lot.ndjson <<'EOF'
{"index":{"_index":"logs-app-000001"}}
{"@timestamp":"2026-11-04T10:00:00Z","level":"ERROR","service":"paiement","message":"timeout vers la banque utilisateur=alice","duree_ms":3100}
{"index":{"_index":"logs-app-000001"}}
{"@timestamp":"2026-11-04T10:00:01Z","level":"INFO","service":"paiement","message":"paiement accepté","duree_ms":120}
{"index":{"_index":"logs-app-000001"}}
{"@timestamp":"2026-11-04T10:00:02Z","level":"INFO","service":"panier","message":"article ajouté","duree_ms":40}
EOF
curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/x-ndjson' \
  -X POST 'https://localhost:9200/_bulk?refresh=true' --data-binary @lot.ndjson
Bonne pratique : utilisez toujours _bulk pour de gros volumes, et lisez "errors" dans la réponse : le code HTTP reste 200 même si des documents sont refusés. Évitez refresh=true en production ; il sert ici à lire aussitôt le résultat.

3. Chercher #

Query DSL, agrégations, PPL et SQL.

La recherche #

Dans un bool, must compte dans le score, tandis que filter dit seulement oui ou non, et se met en cache. Mettez dans filter tout ce qui n'a pas besoin de pertinence.

curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST 'https://localhost:9200/logs-app-*/_search' -d '{
  "query": {"bool": {
    "must":   [{"match": {"message": "banque"}}],
    "filter": [{"term": {"service": "paiement"}}]
  }}
}'

Les agrégations #

curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST 'https://localhost:9200/logs-app-*/_search' -d '{
  "size": 0,
  "aggs": {"par_service": {
    "terms": {"field": "service"},
    "aggs": {"p95": {"percentiles": {"field": "duree_ms", "percents": [95]}}}
  }}
}'

Résultat de notre essai : paiement a 2 documents (p95 de 3100 ms) et panier 1 (p95 de 40 ms).

PPL et SQL #

Pour explorer des logs, le PPL enchaîne les opérations avec des |, à la manière d'un shell.

curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST https://localhost:9200/_plugins/_ppl \
  -d '{"query":"source=logs-app-* | where service=\"paiement\" | stats count() by level"}'

curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST https://localhost:9200/_plugins/_sql \
  -d '{"query":"SELECT service, COUNT(*) n FROM logs-app-000001 GROUP BY service"}'

📄 Indexer et chercher dans OpenSearch : mapping, DSL, PPL et SQL →

Mi seguimiento

  • ⏱ Duración estimada : ≈ 7 min

Inicia sesión para seguir tu progreso y tomar notas. Iniciar sesión

💬 Hacer una pregunta

Artículos recomendados

Utiliser SigNoz : APM, traces, logs, dashboards et alertes

Exploiter SigNoz au quotidien : vue APM des services, explorateur de traces et de logs, query bui...

Ingestion Elasticsearch : Bulk API, ingest pipelines, enrich et reindex

Ingérer et transformer des données dans Elasticsearch : Bulk API, ingest pipelines et processeurs...

Dynatrace : Différences entre SQL Modifications, SQL Queries or Procedures, et SQL Transactions

Cet article détaille les différences entre trois concepts essentiels dans l'exécution des instruc...

Explorer ses données dans Discover : KQL, Lucene et ES|QL

Rechercher et analyser des logs dans Kibana Discover : filtres, KQL, syntaxe Lucene, et le langag...

Index Lifecycle Management (ILM) : data tiers, rollover et rétention

Automatiser le cycle de vie des index avec ILM : data tiers hot, warm, cold et frozen, rollover p...

Kibana : rôle, installation et premiers pas

Ce qu'est Kibana dans la suite Elastic, comment l'installer avec Elasticsearch (start-local, Dock...

Performance et capacity planning Elasticsearch : shards, heap, indexation et benchmarks

Dimensionner et optimiser Elasticsearch : taille et nombre de shards, heap JVM, caches, réglages ...

L'observabilité sur ClickHouse : pourquoi une base colonne change la donne

Pourquoi de plus en plus de plateformes d'observabilité stockent logs, traces et métriques dans C...

Stocker et interroger la télémétrie directement dans ClickHouse

Envoyer logs et traces dans ClickHouse avec l'exportateur OpenTelemetry, comprendre le schéma des...

Apoyar

♥ APOYAR

Apoya RousselTM Learning

Los cursos, artículos, prácticas y certificados siguen siendo gratuitos y sin publicidad intrusiva. Una contribución libre, por el importe que elijas, financia el alojamiento, los entornos de prácticas y nuevos contenidos.

Contribuir con PayPal Importe libre · tarjeta o cuenta PayPalMás información
QR code PayPal
O escanea este código QR con tu teléfono

¡Gracias, cada contribución cuenta!