RousselTMLEARNING

Observabilité

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

Déclarer un modèle d'index, indexer avec bulk, chercher avec le Query DSL, agréger et interroger en PPL et en SQL. Exemples testés sur OpenSearch 3.9.

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"}'

Articles liés

OpenSearch : concepts, architecture et différences avec Elasticsearch

Comprendre OpenSearch : origine du projet, licence, différences avec Elasticsearch, index, shards, répliques,…

Installer OpenSearch et OpenSearch Dashboards

Installer OpenSearch avec Docker Compose ou l'archive : mot de passe initial, vm.max_map_count, certificats d…

Alimenter OpenSearch : pipelines d'ingestion et Data Prepper

Transformer les données avec les pipelines d'ingestion, collecter avec Data Prepper, recevoir l'OTLP et évite…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !