RousselTMLEARNING

Observabilité

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 pertinence BM25, agrégations bucket, metrics et pipeline, composite, et le langage ES|QL.

1. La requête bool #

La base de tout.

Score et filtre #

Clauses de la requête bool
GET products/_search
{
  "query": { "bool": {
    "must":     [ { "match": { "name": { "query": "chaussure trail", "operator": "and" } } } ],
    "should":   [ { "term": { "brand": { "value": "acme", "boost": 2 } } } ],
    "filter":   [ { "term": { "in_stock": true } }, { "range": { "price": { "lte": 150 } } } ],
    "must_not": [ { "term": { "status": "discontinued" } } ]
  } }
}
Bonne Pratique : Tout ce qui est oui/non (statut, plage de dates, client) va dans filter : plus rapide, mis en cache, et n'altère pas la pertinence.

2. Pertinence #

Comprendre et ajuster le score.

Outils #

  • Le score par défaut est BM25 : fréquence du terme dans le document, rareté dans l'index, longueur du champ.
  • "explain": true détaille le calcul pour un document.
  • function_score combine le score textuel avec la popularité, la fraîcheur (gauss sur une date) ou la distance.
  • nested interroge chaque objet d'un tableau séparément (sinon « taille 42 » et « couleur rouge » peuvent venir de deux lignes différentes).

3. Agrégations #

Analyser, pas seulement chercher.

Exemples #

GET logs-nginx-*/_search
{
  "size": 0,
  "query": { "range": { "@timestamp": { "gte": "now-24h" } } },
  "aggs": {
    "par_heure": {
      "date_histogram": { "field": "@timestamp", "fixed_interval": "1h" },
      "aggs": {
        "erreurs":   { "filter": { "range": { "http.response.status_code": { "gte": 500 } } } },
        "p95":       { "percentiles": { "field": "event.duration", "percents": [ 95 ] } },
        "taux":      { "bucket_script": { "buckets_path": { "e": "erreurs>_count", "t": "_count" }, "script": "params.e / params.t * 100" } }
      }
    },
    "top_paths": { "terms": { "field": "url.path", "size": 10 } },
    "visiteurs": { "cardinality": { "field": "source.ip" } }
  }
}
À savoir : cardinality est approximatif (HyperLogLog) ; composite permet de paginer sur toutes les combinaisons d'une agrégation, contrairement à terms.

ES|QL #

FROM logs-nginx-*
| WHERE @timestamp > NOW() - 24 hours AND http.response.status_code >= 500
| STATS erreurs = COUNT(*) BY url.path
| SORT erreurs DESC
| LIMIT 10

Articles liés

Transforms et enrich : résumer et enrichir les données dans Elasticsearch

Créer des index centrés sur les entités avec les transforms pivot et latest, et enrichir les documents à l'in…

OpenTelemetry et Elasticsearch : compatibilité et architecture

Envoyer de l'OpenTelemetry vers Elasticsearch : Collector et exportateur elasticsearch, endpoint OTLP géré, A…

Ingérer des logs OpenTelemetry dans Elasticsearch

Collecter et structurer des logs avec le Collector OpenTelemetry (receiver filelog, opérateurs, processeur tr…

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 !