RousselTMLEARNING

TP · OpenSearch : de la découverte à l'expertise

TP : Installer OpenSearch, indexer et chercher avec correction

La correction est intégrée au TP (Voir les encadrés de couleur vert)

Ce que vous allez apprendre dans ce TP
  • Démarrer OpenSearch
  • Déclarer les types
  • Chercher et agréger

Introduction #

Ce que vous allez apprendre dans cette section
  • Démarrer OpenSearch
  • Déclarer les types
  • Chercher et agréger

Contexte. Votre équipe veut un moteur de recherche de logs sous licence Apache 2.0. Vous évaluez OpenSearch sur une maquette.

Prérequis : Docker Compose, 4 Go de mémoire libre  ·  Durée estimée : 45 min

Un nœud et sa console.

Mise en place #

Étapes guidées, avec leur correction.

  1. 1. Démarrer la pile

    Pourquoi ? Sans mot de passe fort, OpenSearch refuse de démarrer.

    Écrivez .env et le Compose, réglez vm.max_map_count, puis vérifiez l'état du cluster.
    Voir la correction
    OPENSEARCH_INITIAL_ADMIN_PASSWORD=Str0ng!Passw0rd-2026
    services:
      opensearch:
        image: opensearchproject/opensearch:3
        environment:
          discovery.type: single-node
          OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
          OPENSEARCH_JAVA_OPTS: -Xms1g -Xmx1g
          path.repo: /usr/share/opensearch/data/snapshots
        ports:
          - "9200:9200"
        volumes:
          - os-data:/usr/share/opensearch/data
    
      dashboards:
        image: opensearchproject/opensearch-dashboards:3
        environment:
          OPENSEARCH_HOSTS: '["https://opensearch:9200"]'
        ports:
          - "5601:5601"
        depends_on: [opensearch]
    
    volumes:
      os-data:
    sudo sysctl -w vm.max_map_count=262144
    docker compose up -d
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' https://localhost:9200/_cat/health?v
  2. 2. Déclarer un modèle d'index

    Pourquoi ? Le type d'un champ ne se change plus après la première écriture.

    Créez un modèle pour logs-app-*.
    Voir la correction
    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"}
        }}
      }
    }'
  3. 3. Indexer par lots

    Pourquoi ? _bulk est le chemin normal des données.

    Indexez trois documents, puis lisez le champ errors de la réponse.
    Voir la correction
    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
  4. 4. Chercher et agréger

    Pourquoi ? filter est plus rapide que must quand le score ne compte pas.

    Cherchez « banque » dans le service paiement, puis calculez le p95 de la durée par service.
    Voir la correction
    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"}}]
      }}
    }'
    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]}}}
      }}
    }'
  5. 5. Essayer PPL et la console

    Pourquoi ? PPL est très lisible pour explorer des logs.

    Comptez les documents par niveau en PPL, puis retrouvez-les dans Discover sur http://localhost:5601.
    Voir la correction
    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"}'

Niveau de difficulté : ●○○○○ (1/5)

Mon suivi

  • ⏱ Durée estimée : ≈ 45 min

Connectez-vous pour suivre votre progression et prendre des notes. Se connecter

💬 Poser une question

Articles recommandés

Installer OpenSearch et OpenSearch Dashboards

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

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 ...

OpenSearch Dashboards, alertes et observabilité

Explorer ses données dans OpenSearch Dashboards, créer des moniteurs d'alerte et découvrir Trace ...

OpenSearch : concepts, architecture et différences avec Elasticsearch

Comprendre OpenSearch : origine du projet, licence, différences avec Elasticsearch, index, shards...

OpenSearch en production : ISM, sauvegardes, sécurité et bonnes pratiques

Automatiser le cycle de vie avec ISM, sauvegarder par snapshots, gérer les rôles et dimensionner ...

Alimenter OpenSearch : pipelines d'ingestion et Data Prepper

Transformer les données avec les pipelines d'ingestion, collecter avec Data Prepper, recevoir l'O...

Installer Zabbix et superviser son premier hôte

Installer Zabbix avec Docker Compose (serveur, PostgreSQL, interface web), installer l'agent 2 su...

Kibana : rôle, installation et premiers pas

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

Query DSL et agrégations avancées Elasticsearch, avec ES|QL

Écrire des requêtes Elasticsearch avancées : bool, filter et score, nested, function_score et per...

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 !