1. La requête bool #
La base de tout.
Score et filtre #
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": truedétaille le calcul pour un document.function_scorecombine le score textuel avec la popularité, la fraîcheur (gausssur une date) ou la distance.nestedinterroge 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 :cardinalityest approximatif (HyperLogLog) ;compositepermet 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