Questions d'entretien Elasticsearch
1. Qu'est-ce qu'Elasticsearch et quels sont ses cas d'usage ?
Elasticsearch est un moteur de recherche et d'analyse distribue, base sur Apache Lucene. Il stocke les données sous forme de documents JSON indexes pour une recherche rapide. Cas d'usage : recherche full-text (site e-commerce, documentation), analyse de logs (avec la stack ELK : Elasticsearch, Logstash, Kibana), monitoring d'applications (APM), recherche geospatiale, et analytics temps réel. Il excelle dans la recherche textuelle complexe et l'agrégation de données.
2. Expliquez les concepts d'index, document et mapping.
Un document est l'unité de données dans Elasticsearch (objet JSON). Un index est une collection de documents (equivalent d'une table SQL). Le mapping définit la structure des documents dans un index (types de champs : text, keyword, integer, date, geo_point, etc.). Le mapping peut être dynamique (Elasticsearch infere les types) ou explicite (vous le définissez). Depuis Elasticsearch 8, le concept de "type" a été supprime (un seul type par index).
3. Quelle est la différence entre les champs "text" et "keyword" ?
Un champ text est analyse : le texte est tokenise (decoupe en mots), normalise (minuscules, stemming) et stocke dans un index inverse pour la recherche full-text. Un champ keyword est stocke tel quel, sans analyse, pour les correspondances exactes, le tri, les agrégations et les filtres. Exemple : pour un champ "email", utilisez keyword (match exact). Pour un champ "description", utilisez text (recherche de mots). Beaucoup de champs utilisent un mapping multi-field (text + keyword).
4. Expliquez la différence entre query et filter dans Elasticsearch.
Une query calcule un score de pertinence (relevance) pour chaque document : "à quel point ce document correspond-il a la recherche ?". Un filter est un oui/non binaire : "ce document correspond-il ou non ?". Les filtres sont plus rapides car ils ne calculent pas de score et sont mis en cache automatiquement. Utilisez des queries pour la recherche textuelle et des filtres pour les critères exacts (statut, date, catégorie). Combinez-les dans un bool query (must, should, filter, must_not).
5. Comment fonctionne la recherche full-text dans Elasticsearch ?
Le processus : lors de l'indexation, le texte passe par un analyzer qui le decompose en tokens (tokenizer) et les transforme (filters : lowercase, stemming, stop words). Les tokens sont stockes dans un index inverse (map token -> documents). Lors de la recherche, la requête passe par le même analyzer, et Elasticsearch trouve les documents correspondants via l'index inverse, calcule un score de pertinence (BM25 par défaut), et retourne les résultats tries par score.
6. Qu'est-ce qu'un cluster Elasticsearch et comment est-il distribue ?
Un cluster est un ensemble de nœuds (instances Elasticsearch). Les données d'un index sont divisees en shards (partitions) distribues sur les nœuds. Chaque shard est une instance Lucene. Les réplicas sont des copies des shards primaires sur d'autres nœuds pour la haute disponibilité et le load balancing des lectures. Rôles des nœuds : master (gestion du cluster), data (stockage), ingest (transformation), coordinating (routage des requêtes).
7. Comment optimiser les performances d'Elasticsearch ?
Indexation : utilisez le bulk API pour les insertions massives, desactivez le refresh pendant les imports (refresh_interval: -1), optimisez le mapping (desactivez le stockage des champs inutilises). Recherche : utilisez des filtres plutôt que des queries quand possible (cache), limitez le nombre de shards par index (recommandation : 20-40 Go par shard), utilisez routing pour diriger les requêtes vers le bon shard. Infrastructure : dimensionnez la JVM heap à 50% de la RAM (max 32 Go), reservez l'autre moitie pour le cache filesystem de Lucene.
8. Expliquez les agrégations dans Elasticsearch.
Les agrégations analysent et resument les données. Types : Bucket (regroupe les documents : terms, date_histogram, range, filters), Metric (calcule des métriques : avg, sum, min, max, cardinality, percentiles), Pipeline (traite les résultats d'autres agrégations : moving_avg, derivative). Les agrégations peuvent être imbriquées (une métrique dans chaque bucket). Elles sont la base des dashboards dans Kibana et remplacent les GROUP BY de SQL.
9. Comment gérer le cycle de vie des index ?
Index Lifecycle Management (ILM) automatise la gestion des index dans le temps. Phases : hot (index actif, écritures et lectures), warm (lectures uniquement, moins de réplicas), cold (lectures rares, stockage moins cher), frozen (archive, recherche à la demande), delete (suppression). Utilisez des index templates pour configurer automatiquement les nouveaux index, et des data streams pour les données temporelles (logs, métriques).
10. Comment sécuriser un cluster Elasticsearch ?
Activez Elasticsearch Security (inclus depuis la version 8) : authentification (utilisateurs natifs, LDAP, SAML, OIDC), autorisation avec des rôles granulaires (accès par index, par champ, par document), chiffrement TLS entre les nœuds et pour les clients, audit logging pour tracer les accès. Configurez un reverse proxy (Nginx) devant Elasticsearch, ne l'exposez jamais directement sur Internet, et utilisez des API keys plutôt que des credentials dans les applications.