Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

🔍 OpenSearch – Le Guide Ultime

Deep Dive : Fork d'Elastic, Lucene, Shards, Query DSL, Agrégations & Dashboards.

1.1 Facile

1. C'est quoi OpenSearch ?

Moteur de recherche & analytics. Fork (Apache 2.0) d'Elasticsearch. Basé sur Lucene.

Search Analytics
1.2 Moyen

2. vs. Elasticsearch (La Fork)

Pourquoi la fork ? La licence (SSPL vs Apache 2.0). Implications (Plugins, AWS).

Elasticsearch License
1.3 Avancé

3. Architecture Distribuée

Cluster, Node (NƓud), Index, Shard (Fragment), Replica (RĂ©plique). ScalabilitĂ©.

Cluster Shard Replica
1.4 Moyen

4. Concepts (Index Inversé)

Document (JSON), Index (BDD), Mapping (Schéma), Index Inversé.

Inverted Index Document
1.5 Facile

5. API REST (_index, _bulk)

Tout est JSON sur HTTP. PUT /index, POST /_doc, GET /_doc/1, _bulk (critique).

REST _bulk
1.6 Avancé

6. Analyse (Full-Text)

Analyzer = Tokenizer + Filters. standard vs keyword. Stop words, Stemming.

Analyzer Tokenizer
2.1 Avancé

7. 🚀 Query DSL (bool)

Le langage de requĂȘte JSON. query vs filter. bool (must, should, filter).

Query DSL bool
2.2 Avancé

8. Query DSL (Types)

match (Full-text) vs term (Exact). range, multi_match.

match term
2.3 Avancé

9. 📊 AgrĂ©gations

La "killer feature". metrics (avg, sum, cardinality) & bucket (terms, histogram).

Aggregations Bucket
3.1 Moyen

10. UI : OpenSearch Dashboards

L'UI de visualisation (fork de Kibana). Discover, Visualize, Dashboard.

Dashboards Kibana
3.2 Avancé

11. Ingestion (Plugins & Addons)

La "Stack O-LK". Data Prepper (natif), Logstash, FluentBit (agents).

Ingestion Data Prepper
3.3 Avancé

12. Plugins (Security, k-NN)

Plugins inclus (gratuits) : Security (RBAC, Auth), Alerting, k-NN (Vecteur, AI).

Security k-NN Vector
1.1 C'est quoi OpenSearch ?

OpenSearch est un moteur de recherche et d'analyse de données distribué, open-source, et basé sur JSON. Il permet de stocker, rechercher, et analyser d'énormes volumes de données en quasi-temps réel.

C'est un fork (une copie) d'Elasticsearch (version 7.10.2), créé par Amazon (AWS) en 2021 suite à un changement de licence d'Elasticsearch (voir 1.2). Il est publié sous la licence Apache 2.0 (totalement open-source).

Sous le capot : Apache Lucene

Au cƓur d'OpenSearch (et d'Elasticsearch, et de Solr) se trouve Apache Lucene : une bibliothĂšque Java de recherche d'information. Lucene est le "moteur" (il gĂšre l'index inversĂ©, voir 1.4), et OpenSearch est la "voiture" (une API REST JSON distribuĂ©e autour du moteur).

Cas d'Usage Principaux
Cas d'UsageDescription
Analyse de Logs (Observabilité)Le cas n°1. Centraliser tous les logs (serveurs, applications) et les analyser. C'est la stack "O-LK" (OpenSearch, Logstash, Kibana/Dashboards).
Recherche Full-TextLe "moteur de recherche" pour un site e-commerce, un blog, ou une documentation.
Monitoring & MétriquesStocker et analyser des métriques (CPU, RAM, ...), souvent avec des agrégations (voir 2.3).
Recherche Vectorielle (AI/k-NN)(Moderne) Stocker des "embeddings" (vecteurs) pour la recherche sémantique ou par similarité (IA).
1.2 vs. Elasticsearch (La Fork & Les Licences)

On ne peut pas parler d'OpenSearch sans comprendre "la Fork" (la scission).

L'Histoire (Simplifiée)
  1. Avant 2021 : Elasticsearch était le roi. Il était (principalement) sous licence Apache 2.0 (open-source). AWS (Amazon) proposait un service "Amazon Elasticsearch Service" basé sur cet open-source.
  2. Le Conflit : Elastic (l'entreprise) n'aimait pas qu'AWS "profite" de leur travail sans contribuer (selon eux).
  3. Jan 2021 (Le Changement) : Elastic change la licence d'Elasticsearch (v7.11+) pour la SSPL (Server Side Public License). Cette licence n'est *pas* open-source (selon l'OSI) et interdit aux fournisseurs cloud de le proposer en service géré.
  4. Jan 2021 (La Réponse) : AWS (et d'autres) annoncent la création d'OpenSearch : un fork (une copie) de la derniÚre version Apache 2.0 d'Elasticsearch (7.10.2).
La Différence Clé (Licence = Plugins)

Aujourd'hui, ce sont deux projets parallÚles. La différence *majeure* pour les développeurs est l'écosystÚme des "plugins" (addons).

CritĂšreElasticsearch (Moderne)OpenSearch (La Fork)
Licence (Core)Double licence (SSPL & Elastic License). Non-OSI.Apache 2.0 (EntiĂšrement open-source).
Plugins de Base"X-Pack" (Open-Core). Les fonctionnalités de base (sécurité, alerting) sont gratuites mais sous SSPL. Les features avancées sont payantes.100% Gratuits (Apache 2.0). Les "plugins" (Security, Alerting, k-NN, ...) sont inclus et open-source.
UIKibana (SSPL / Elastic License)OpenSearch Dashboards (Fork de Kibana 7.10, Apache 2.0)
APIIdentiques (ou presque). Pour 95% des cas d'usage (search, aggs, bulk), les requĂȘtes JSON sont compatibles.
1.3 Architecture Distribuée (Cluster, Shard, Replica)

OpenSearch est conçu pour ĂȘtre distribuĂ© (scalable horizontalement) et haute-disponibilitĂ© (tolĂ©rant aux pannes).

Les 5 Concepts d'Architecture
ConceptDescription
ClusterL'ensemble de tous vos serveurs OpenSearch.
Node (NƓud)Un seul serveur (une instance Java) qui fait partie du cluster. (Ex: Master-node, Data-node).
IndexL'équivalent d'une "base de données" (ex: `logs-2025-11`).
Shard (Fragment)La clĂ© de la scalabilitĂ©. Un Index est trop gros pour un seul NƓud. OpenSearch le dĂ©coupe en "Shards". (Ex: `logs-2025-11` est dĂ©coupĂ© en 3 shards : P1, P2, P3).
Chaque Shard est un index Lucene *indépendant*.
Replica (Réplique)La clé de la haute-disponibilité. Un Replica est une *copie* d'un Shard. (Ex: R1, R2, R3).
OpenSearch s'assure qu'un Replica n'est jamais sur le mĂȘme NƓud que son Shard Primaire (P).
Exemple de Cluster (3 NƓuds, 1 Index, 3 Shards, 1 Replica)
CLUSTER (my-cluster)
+----------------------+ +----------------------+ +----------------------+
| NƒUD 1 (Serveur 1)   | | NƒUD 2 (Serveur 2)   | | NƒUD 3 (Serveur 3)   |
|                      | |                      | |                      |
|  [ Shard P1 ]        | |  [ Shard P2 ]        | |  [ Shard P3 ]        |
|  (Primaire 1)        | |  (Primaire 2)        | |  (Primaire 3)        |
|                      | |                      | |                      |
|  [ Shard R2 ]        | |  [ Shard R3 ]        | |  [ Shard R1 ]        |
|  (Réplique de P2)    | |  (Réplique de P3)    | |  (Réplique de P1)    |
|                      | |                      | |                      |
+----------------------+ +----------------------+ +----------------------+

(Si le NƒUD 3 tombe en panne...)
1. Le Cluster passe en statut "JAUNE" (il manque un NƓud).
2. Le Shard P3 (Primaire) est perdu.
3. OpenSearch "promeut" le Shard R3 (sur NƒUD 2) en P3.
4. L'application continue de fonctionner sans interruption.
1.4 Concepts (Document, Index, Index Inversé)

Pour comprendre *comment* OpenSearch recherche, il faut comprendre l'Index Inversé.

ConceptAnalogie SQLDescription
DocumentLigne (Row)Un objet JSON. C'est l'unité de base de stockage.
IndexTable (Table)Une collection de Documents (ex: "logs", "products").
MappingSchéma (Schema)La définition de l'Index (ex: "le champ 'prix' est un 'float'", "le champ 'nom' est 'text'").
L'Index Inversé (La "Magie" de Lucene)

Une base de données SQL stocke par "Document" (Ligne). C'est lent pour la recherche (il faut scanner toute la table).

Un moteur de recherche (Lucene) stocke par "Terme" (Mot). Il crée un "index" (comme à la fin d'un livre) qui mappe les Mots aux Documents.

Exemple de construction d'Index Inversé

Documents (Données entrantes) :

  • Doc 1 : { "titre": "OpenSearch est rapide" }
  • Doc 2 : { "titre": "OpenSearch et Kafka" }

Index Inversé (Ce que Lucene stocke, aprÚs analyse) :

Terme (Mot) | Documents
------------|-------------------
"opensearch"| [ Doc 1, Doc 2 ]
"est"       | [ Doc 1 ]
"rapide"    | [ Doc 1 ]
"et"        | [ Doc 2 ]
"kafka"     | [ Doc 2 ]

La RequĂȘte : Quand vous cherchez "OpenSearch", il n'a pas besoin de scanner les documents. Il va direct au terme "opensearch" et renvoie [Doc 1, Doc 2]. C'est *instantanĂ©*.

1.5 API REST (HTTP & JSON)

On ne parle pas SQL à OpenSearch. On lui parle via une API RESTful (JSON sur HTTP). Les verbes (GET, POST, PUT) sont utilisés pour manipuler les données.

Verbe HTTPURI (Endpoint)Description
PUT/mon-indexCréer un Index (avec son "mapping" dans le body).
DELETE/mon-indexSupprimer un Index.
POST/mon-index/_docIndexer (créer) un Document (l'ID est auto-généré).
PUT/mon-index/_doc/1Indexer (créer/remplacer) un Document avec un ID *spécifique*.
GET/mon-index/_doc/1Récupérer un Document par son ID.
DELETE/mon-index/_doc/1Supprimer un Document.
POST/mon-index/_searchRechercher des Documents (avec le Query DSL dans le body).
POST/_bulkLe plus important (Ingestion). Permet d'indexer/updater/supprimer *des milliers* de documents en 1 seul appel.
Le "Bulk" (_bulk) - L'API d'Ingestion

Ne *jamais* indexer des documents un par un (POST /_doc) en production (c'est trop lent). On utilise l'API _bulk.

# POST /_bulk
# (Le format est "Action" (meta), "Donnée" (optionnel), "Action", "Donnée"...)
# (Ce n'est PAS du JSON valide, c'est du "newline-delimited JSON")

{ "index" : { "_index" : "logs", "_id" : "1" } }
{ "message" : "Log A", "status": 200 }
{ "index" : { "_index" : "logs", "_id" : "2" } }
{ "message" : "Log B", "status": 500 }
{ "delete" : { "_index" : "logs", "_id" : "3" } }

1.6 Analyse (Full-Text) - La magie de la recherche

ProblĂšme : Si un utilisateur cherche "renard", doit-il trouver "Renards" ? Si je cherche "saute", doit-il trouver "sauter" ?
Réponse : Oui. C'est l'Analyse (Analysis). C'est le processus qui transforme le texte (riche) en "termes" (simples) pour l'index inversé.

Le Processus d'Analyse

Un Analyzer (Analyseur) est une chaßne de 3 étapes :

  1. Character Filters (Filtres de CaractĂšres) : Nettoyage brut (ex: "enlever le HTML").
  2. Tokenizer (Découpeur) : Découpe le string en "tokens" (mots). (Ex: standard découpe sur l'espace/ponctuation).
  3. Token Filters (Filtres de Jetons) : Nettoie les tokens (ex: lowercase, stop (enlĂšve "le", "la"), stemming ("sauter" -> "saut")).
Exemple (standard analyzer)
Texte d'entrée: "Le Quick Brown-Fox saute."

1. Character Filters: (Aucun)
2. Tokenizer (Standard): [ Le, Quick, Brown-Fox, saute ]
3. Token Filters (Lowercase): [ le, quick, brown-fox, saute ]
4. Token Filters (Stop words): [ quick, brown-fox, saute ]
5. Token Filters (Stemming): [ quick, brown-fox, saut ]

Termes stockés dans l'Index Inversé: [ "quick", "brown-fox", "saut" ]
text vs keyword (Mapping)

C'est la base du "Mapping". Quand vous définissez un champ de type "string" :

TypeAnalyse ?Quand l'utiliser ?
textOui. (Analyzé).Recherche Full-Text (ex: "Description d'un produit", "Corps d'un email").
keywordNon. (Non-analyzé).Recherche Exacte & Agrégations (ex: "Code Postal", "ID Produit", "Nom d'utilisateur").
2.1 🚀 Query DSL (Le langage de requĂȘte)

Le Query DSL (Domain Specific Language) est le "langage" (en JSON) que vous envoyez dans le *body* d'une requĂȘte _search pour trouver des donnĂ©es.

Contexte query vs filter (Performance)

C'est la distinction la plus importante :

  • Contexte query : "Est-ce que ça *matche* bien ?". Calcule un score de pertinence (_score). (Recherche Full-Text, floue).
  • Contexte filter : "Est-ce que ça *matche* (Oui/Non) ?". Ne calcule pas de score. (Recherche exacte). C'est beaucoup plus rapide et *cacheable*.
La Structure : bool (Booléen)

Pour combiner des requĂȘtes, on utilise la clause bool.

Clause boolAnalogie SQLDescription
must (Query)ANDDoit matcher. Contribue au score.
should (Query)OROptionnel, mais s'il matche, augmente le score.
filter (Filter)AND (cacheable)Doit matcher (Oui/Non). Ne contribue pas au score. (Le plus rapide).
must_not (Filter)NOT (cacheable)Ne doit pas matcher.
Exemple (POST /products/_search)

Objectif : Trouver des "chaussures rouges", qui sont en stock, et qui coûtent moins de 50.

{
  "query": {
    "bool": {
      
      "must": [
        // Contexte Query (calcul de score)
        // (Recherche "chaussure" OU "rouge" dans la description)
        { "match": { "description": "chaussures rouges" } } 
      ],
      
      "filter": [
        // Contexte Filter (rapide, pas de score)
        { "term": { "en_stock": true } },
        { "range": { "prix": { "lt": 50 } } } // lt = Less Than
      ]
      
    }
  }
}
2.2 Query DSL (Types de RequĂȘtes)

Il existe des dizaines de types de requĂȘtes. Voici les 4 plus importantes.

Type de QueryDescriptionQuand l'utiliser ?
matchRecherche Full-Text (Analyzée).
{ "match": { "description": "Quick Brown" } }
(Cherche quick OR brown, calcule un score).
Le champ de recherche principal (Google).
termRecherche Exacte (Non-Analyzée).
{ "term": { "status.keyword": "Published" } }
(Cherche la valeur exacte "Published").
Filtres, Facettes (sur un champ .keyword).
rangeRecherche par Intervalle.
{ "range": { "prix": { "gte": 10, "lte": 50 } } }
(gte=Greater-than-equal, lte=Less-than-equal).
Nombres, Dates.
multi_matchmatch sur plusieurs champs.
{ "multi_match": { "query": "alice", "fields": ["titre", "description"] } }
Barre de recherche "globale" (ex: chercher dans le titre ET la description).

.keyword : C'est quoi ?
Par défaut, OpenSearch crée 2 versions d'un champ string ("nom": "Mon Article") :
1. nom (Type text) -> (Analyzé : [mon, article]) -> Pour la recherche match.
2. nom.keyword (Type keyword) -> (Non-Analyzé : "Mon Article") -> Pour la recherche term et les agrégations.

2.3 📊 AgrĂ©gations (La "Killer Feature" d'Analytics)

Les agrégations (aggs) sont la *deuxiÚme* "killer feature" d'OpenSearch. Elles permettent de faire de l'analytique complexe (similaire à GROUP BY en SQL, mais en beaucoup plus puissant).

Il y a 2 types d'agrégations :

1. Metrics (Métriques)

Calcule une valeur (un chiffre) sur un ensemble de documents.

  • avg : Moyenne d'un champ.
  • sum : Somme.
  • min / max :
  • cardinality : Compte le nombre de valeurs *uniques* (approx.).
2. Bucket (Bacs)

Regroupe les documents en "bacs" (catégories).

  • terms : (Le plus courant) CrĂ©e un bac par valeur unique (SQL GROUP BY).
  • histogram / date_histogram : CrĂ©e des bacs par intervalle (ex: par jour, par heure).
  • range : Bacs par intervalles de prix (ex: 0-50€, 50-100€).
Exemple : Ventes moyennes par catégorie

Objectif : "Donne-moi le prix moyen (avg) par catégorie (terms) ?"

POST /ventes/_search
{
  "size": 0, // (On ne veut pas les "hits" (documents), juste l'agrégation)
  
  "aggs": {
    
    "par_categorie": {  // (Nom de notre 1Úre agrégation)
      
      "terms": { // (Type 2: Bucket)
        "field": "categorie.keyword" // (GROUP BY categorie)
      },
      
      "aggs": { // (Sous-agrégation, imbriquée)
        "prix_moyen": { // (Nom de la 2e agrégation)
          "avg": { // (Type 1: Metric)
            "field": "prix"
          }
        }
      }
      
    }
  }
}
3.1 UI : OpenSearch Dashboards (ex-Kibana)

OpenSearch Dashboards est l'interface web (UI) officielle pour OpenSearch. C'est un fork de Kibana 7.10.2 (sous licence Apache 2.0).

C'est l'outil de visualisation de la stack O-LK (OpenSearch-Logstash-Kibana).

Les 3 Écrans Principaux
ÉcranDescription
DiscoverL'écran "Logs". Permet d'explorer, de rechercher (KQL), et de filtrer les *données brutes* (documents JSON) qui arrivent.
VisualizeL'usine Ă  graphiques. Permet de crĂ©er des visualisations (Camemberts, Histogrammes, Cartes) basĂ©es sur des requĂȘtes et des *agrĂ©gations*.
DashboardL'écran d'assemblage. Permet de prendre plusieurs "Visualizations" et de les assembler en un tableau de bord interactif (avec filtres globaux).
KQL (Kibana Query Language)

Dans la barre de recherche "Discover", on n'utilise pas le Query DSL (JSON). On utilise KQL, une syntaxe simplifiée :

# Syntaxe KQL (simple)
status: 500 AND (response_time > 1000 OR user.name: "alice")

# (Est converti en Query DSL 'bool' en arriĂšre-plan)
3.2 Ingestion (Data Prepper, Logstash, FluentBit)

Les donnĂ©es (logs, mĂ©triques) doivent ĂȘtre *envoyĂ©es* Ă  OpenSearch. C'est le "pipeline d'ingestion". On utilise des "shippers" (agents) et des "processors" (ETL).

La Stack O-LK (ex-ELK)
ComposantRĂŽleProduit "Addon"
Shipper (Agent)Léger. "Lit" les fichiers de log sur le serveur et les *envoie* (ship).FluentBit (C), Filebeat (Elastic)
Processor (ETL)Lourd. Reçoit les logs, les *parse* (ex: Grok), les *enrichit* (ex: GeoIP), et les *transforme* avant de les indexer.Data Prepper (Natif OpenSearch), Logstash (Natif Elastic)
Store (BDD)Stocke et indexe les données.OpenSearch
Visualize (UI)Affiche les données (graphiques).OpenSearch Dashboards
Data Prepper (Le "plugin" natif)

Data Prepper est le "plugin" (projet) natif d'OpenSearch pour le traitement de donnĂ©es (l'Ă©quivalent de Logstash). Il est conçu pour ĂȘtre scalable (ex: sur Kubernetes).

Exemple de Pipeline (data-prepper.yml)
log-pipeline:
  # 1. INPUT (Source)
  source:
    http:
      path: "/logs"
      
  # 2. PROCESSORS (Transformation)
  processor:
    - grok: # (Parse un log Apache)
        match:
          log: [ '%{COMMONAPACHELOG}' ]
    - geo_ip: # (Enrichit l'IP)
        source: "clientip"

  # 3. SINK (Destination)
  sink:
    - opensearch:
        hosts: [ "https://localhost:9200" ]
        index: "apache-logs-%{yyyy-MM-dd}"
3.3 Plugins (Security, Alerting, k-NN)

Le plus gros avantage de la licence Apache 2.0 d'OpenSearch est que les "plugins" critiques (qui étaient payants ou "open-core" chez Elastic) sont 100% open-source et inclus.

PluginDescription
SecurityLe plus important. Active l'authentification (Basic Auth, SAML, OIDC), le chiffrement (TLS), et le contrĂŽle d'accĂšs (RBAC) au niveau de l'index, du document, ou du champ.
AlertingPermet de définir des "Monitors" (ex: "S'il y a plus de 10 erreurs 500 en 1 minute") et des "Triggers" (ex: "Envoyer un message Slack").
k-NN (k-Nearest Neighbors)(Recherche Vectorielle). Permet de stocker des "embeddings" (vecteurs IA) et de faire des recherches de similarité (ex: "trouve les images similaires", "trouve les textes sémantiquement proches").
Anomaly DetectionUtilise le Machine Learning (Random Cut Forest) pour détecter automatiquement des comportements anormaux (ex: "un pic soudain de logins échoués").