Elasticsearch adopte enfin les JOIN de style SQL
(elastic.co)- ES 8.18 introduit la commande
LOOKUP JOINd’ES|QL, qui permet la corrélation et l’enrichissement des données - Plus simple à configurer et à administrer que la fonction ENRICH existante, elle est utile pour les jointures de données, la corrélation d’événements de sécurité et la fusion d’informations d’inventaire
- Introduction d’un nouveau mode
lookup indexbasé sur un shard unique, conçu spécialement pour les JOIN — il peut stocker jusqu’à 2 milliards de documents LOOKUP JOINgère facilement les jointures plusieurs-à-plusieurs et convient aussi à la spécification dynamique de champs ainsi qu’aux agrégations- Via Kibana ou l’API, il est facile de créer un index lookup à partir d’un CSV ; des fonctions INNER JOIN et de sous-requêtes sont également prévues
ES|QL a enfin un vrai JOIN : présentation de LOOKUP JOIN
Elasticsearch permet désormais les JOIN de style SQL
- Depuis Elasticsearch 8.18, ES|QL prend en charge
LOOKUP JOIN - Il s’agit d’un LEFT OUTER JOIN, et les données « à droite » sont gérées via le nouveau mode d’index
lookup - Exemples :
- fusionner des noms d’environnement (dev, QA, prod) selon l’adresse IP
- ajouter aux événements de sécurité des informations sur les employés, les actifs ou la threat intelligence
- analyser les environnements selon les codes de réponse dans les logs web
Différences avec ENRICH
-
Approche ENRICH
- il faut configurer à l’avance une policy basée sur un index
- à chaque modification des données, il faut relancer la policy
- en cas de correspondances multiples, le résultat est renvoyé dans un champ multivalué, ce qui complique le post-traitement
- peu adapté aux agrégations et aux analyses statistiques
- convient aux données statiques (informations de référence qui changent très peu)
-
Approche LOOKUP JOIN
- utilisable immédiatement, sans policy séparée
- comme l’index peut être modifié directement, les changements sont reflétés immédiatement
- en cas de correspondances multiples, les résultats sont séparés ligne par ligne, ce qui facilite l’analyse
- optimisé pour les groupements et les agrégations (ex. : somme du trafic par utilisateur)
- avantageux aussi pour des données dynamiques et fréquemment mises à jour
Exemples d’utilisation
FROM kibana_sample_data_logs
| WHERE response.keyword != "200"
| LOOKUP JOIN envs_lkp ON clientip
| STATS COUNT(*) by response, environment
-
analyser où surviennent les erreurs HTTP en joignant les données d’environnement par IP
-
on peut aussi joindre les informations de propriété des équipes pour identifier les serveurs problématiques et l’équipe qui les gère
FROM kibana_sample_data_logs | WHERE response.keyword != "200" | LOOKUP JOIN teams_lkp ON host | STATS num = COUNT(*) by host, response.keyword, team | SORT num DESC
Comment créer un index lookup
-
Depuis l’interface Kibana : Stack Management → Index Management → Create index
-
Via l’API REST :
PUT mylookupindex { "settings": { "index.mode": "lookup" } } -
Il est aussi possible d’uploader un CSV via le File Upload de machine learning, puis de définir le mode
lookuplors de la création de l’index
Points d’attention et conseils
- Comme les JOIN sont des opérations coûteuses, pour les champs souvent utilisés il faut envisager ENRICH + ingest-time denormalization plutôt que
lookup - Le
lookup indexest constitué d’un shard unique et limité à 2 milliards de documents - Il peut aussi être interrogé directement, comme une requête classique, avec
FROM <lookup_index> - L’ingestion de données est aussi possible via Logstash ou Elastic Agent (mais pas en data stream)
Feuille de route
- La prise en charge de INNER JOIN, SUBQUERY et des jointures sur des index classiques est également prévue
- Une interface permettant de créer et modifier directement des index lookup dans Kibana est en préparation
- par exemple : glisser-déposer un CSV dans Discover → création automatique de l’index
- une fonction de gestion des lookup basée sur une GUI est aussi prévue (une maquette a déjà été dévoilée)
En résumé et pour commencer
LOOKUP JOINest encore une technical preview avant la release officielle, mais c’est une fonction capable de faire passer ES|QL à un nouveau niveau- Il est possible de démarrer avec Elasticsearch 8.18 ou 9.0 sur Elastic Cloud
Aucun commentaire pour le moment.