Les jointures ES|QL sont arrivées ! Oui, les jointures !
Elasticsearch 8.18 inclut la commande Lookup join d’ES|QL, notre premier JOIN de style SQL.

Elasticsearch 8.18 inclut notre premier JOIN de style SQL : la commande LOOKUP JOIN d’ES|QL.LOOKUP JOIN. Il est désormais disponible en aperçu technique et permet la corrélation et l’enrichissement des données grâce à des ensembles de données lookup facilement mises à jour. Besoin d’ajouter des informations sur les hôtes et les ressources à vos événements ? Pas de problème. Vous souhaitez vérifier quelles adresses IP ou URL figurent sur les listes de renseignement des menaces ? Bien sûr ! Vous pouvez mettre à jour l’ensemble de données lookup et les utiliser immédiatement !
Lookup Join est un LEFT OUTER JOIN de style SQL qui repose sur un nouveau mode d’index appelé lookup pour le côté droit. L’index lookup peut inclure des actifs, des données de renseignement sur les menaces comme des IP connues comme malveillantes, des informations de commande, des informations sur les employés ou les clients : les possibilités sont infinies.

Historiquement, Elasticsearch ne prenait pas en charge JOIN, malgré quelques tentatives au fil du temps, comme les types de champs imbriqués, _parent et join, ainsi que l’enrichissement. Nous préconisions généralement la dénormalisation des données en plaçant les données de référence avec les événements dans le même index, ou en effectuant des jointures côté client. Ces solutions nuisent à la scalabilité pour les grands volumes de données et peuvent s’avérer limitantes en cas de forte variété de données et de cas d’utilisation. Il est temps qu’Elasticsearch intègre les jointures. Et c’est désormais possible : ES|QL n’est pas qu’un simple langage, il repose sur un nouveau moteur de calcul. Ce moteur ES|QL permet d’implémenter des fonctionnalités avancées telles que JOIN.
Pour activer Lookup Join, nous avons créé un nouveau mode d’index : lookup. Un index lookup est similaire à un index classique (le mode standard est le mode par défaut), ce qui signifie qu’il est directement modifiable. La principale différence est qu’un index lookup ne comporte qu’une seule partition. Il est donc limité à 2 milliards de documents, une limite imposée par Lucene pour une partition. Cela devrait largement suffire pour stocker les données du « côté droit » dans de nombreux cas d’utilisation de Lookup Join. L’imposition de cette limite permet d’éviter certains problèmes liés aux jointures entièrement distribuées en réduisant la cardinalité source du côté droit de la jointure. Cela nous indique également quels ensembles de données vous prévoyez d’utiliser comme références lookup afin que nous puissions trouver des moyens de les optimiser à l’avenir.
Hormis le mode Lookup Index, il n’y a aucune restriction quant aux données sources et aucune préparation des données n’est requise pour effectuer une jointure. Cela signifie qu’il est facile d’ajouter des ensembles de données de recherche, et de les maintenir à jour.
Certaines de ces fonctionnalités étaient déjà disponibles grâce à la commande ENRICH dans ES|QL. ENRICH a été optimisé pour les recherches sur l’heure d’ingestion dans les pipelines d’ingestion et pour les petits ensembles de données qui ne changent pas souvent. C’était donc pratique mais pas idéal. Lookup Join est plus facile à configurer et à gérer que Enrich :
Aucune politique d’enrichissement à créer
Aucune exécution de politique
Les index de recherche sont modifiables
Il y a moins de copies des données
Meilleure gestion des correspondances multiples, alors que la fonction Enrich crée des champs à valeurs multiples lorsqu’il existe plusieurs correspondances, la fonction Lookup Join crée plusieurs lignes. Cela permet d’effectuer plus facilement des analyses supplémentaires, comme le regroupement et l’agrégation, par exemple le nombre d’octets transférés par utilisateur ou le total des commandes.
Lookup Join permet de spécifier à la volée le champ de correspondance
Voici quelques-unes des manières dont vous pourriez utiliser un LOOKUP JOIN :
Associer des événements de sécurité aux renseignements sur les menaces afin d’enrichir davantage un événement
Comparer la liste actuelle d’hôtes aux dernières informations sur les menaces ou aux métadonnées internes
Corréler les lectures IOT avec des métadonnées statiques ou dynamiques (fabricant, unité de volume)
Associer les événements de sécurité aux informations de l’hôte pour plus de contexte et de possibilités de filtrage
Ajouter quelques informations, telles que la criticité des actifs (cet utilisateur est un cadre)
Ajouter les AID de CrowdStrike à une source qui possède des noms d’hôte
Vérifier si certaines adresses IP figurent dans les flux de renseignements sur les menaces
Ajouter des informations sur les employés aux événements
Les possibilités sont infinies.
Exemple d’utilisation
Voyons quelques exemples concrets pour découvrir la facilité d’utilisation et la puissance de cette fonctionnalité.
En tant que SRE, vous devrez peut-être :
Ajouter un environnement aux logs en fonction de l’adresse IP ou du nom d’hôte
Joindre les informations des employés aux logs
Découvrir quelle équipe possède un serveur
Avant LOOKUP JOIN, vous deviez :
Insérer vos données de référence (environnements) dans un index
Définir une politique d’enrichissement basée sur cet index, en spécifiant le type de politique, le champ de correspondance et les champs d’enrichissement.
Exécuter la stratégie d’enrichissement une fois pour construire l’index d’enrichissement
Répéter pour chaque ensemble de données de référence (employés, équipes)
Exécuter la politique d’enrichissement chaque fois que les données changent
Avec LOOKUP JOIN, il suffit de mettre les données de référence dans un index LOOKUP et c’est parti !
Imaginez que vous receviez une alerte indiquant que des utilisateurs rencontrent des erreurs sur votre site e-commerce. Vous trouvez des logs web, où la réponse n’est pas le code de réponse HTTP 200 en cas de succès. Vous souhaiteriez analyser ces données par environnement pour voir si les clients de production sont concernés, mais les logs ne comportent pas de champ « environnement ». Tout va bien : il suffit d’ajouter Lookup Join sur l’environnement, peut-être en utilisant un fichier comme celui-ci :
clientip,environment
192.168.1.9,QA
192.168.14.2,Dev
192.168.12.3,Prod
…Ajoutez maintenant le LOOKUP JOIN à l’index de recherche de l’environnement (le mien s’appelle envs_lkp) :
FROM kibana_sample_data_logs | WHERE response.keyword != "200"
| LOOKUP JOIN envs_lkp ON clientip
| STATS COUNT(*) by response, environment
Il y a des erreurs dans la production et l’assurance qualité (QA). Nous pouvons croiser ces données avec une liste indiquant à quelle équipe appartient chaque serveur web afin de déterminer qui nous devons contacter :
host,team
www.elastic.co,Web team
artifacts.elastic.co,Delivery team
cdn.elastic-elastic-elastic.org,Cloud team
elastic-elastic-elastic.org,Web teamFROM 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
Les analystes sécurité adorent Join ! Ils pourront ainsi profiter des fonctionnalités suivantes :
Identifier les adresses IP des clients qui demandent des URL malveillantes connues.
Corréler avec les informations des actifs afin de regrouper les événements et d’attribuer la priorité ou le risque.
Vous pouvez télécharger une liste d’URL malveillantes depuis URLhaus sur Abuse.ch et l’importer dans un index de recherche.
FROM logs
| LOOKUP JOIN urlhaus_lkp ON url
| WHERE threat IS NOT NULL
| KEEP @timestamp, url.keyword, clientip, threat
Comment créer des Lookup
Vous aurez besoin d au moins un Lookup Index pour utiliser Lookup Join. Nous concevons des moyens pour faciliter et rendre pratique la création et la mise à jour des recherches dans Kibana. Pour l’instant, vous pouvez commencer par créer un index de recherche de plusieurs manières : le point essentiel est que le mode de l’index doit être Lookup.
Créer un Lookup Index à l’aide de Index Management
Dans le volet de navigation gauche de Kibana, cliquez sur Stack Management, puis Index management. À droite, cliquez sur Create index.

Indiquez un nom d’index, et sélectionnez Lookup dans la liste déroulante du mode index :

Cliquez sur Créer pour créer un index de recherche vide.
Créer un index de recherche via des API
Créez un index de recherche à l’aide de l’API Création d’index, assurez-vous simplement d’inclure le mode index :
PUT mylookupindex
{
"settings": {
"index.mode": "lookup"
}
}Créer un index de recherche à l’aide de l’uploader de fichiers ML
Dans le volet de navigation gauche de Kibana, cliquez sur Machine learning, puis File data visualizer (ou tapez « télécharger » dans la barre de recherche de Kibana).

Sélectionnez ou glissez-déposez votre fichier, le format CSV est parfaitement adapté.
Après avoir cliqué sur Importer, indiquez un nom pour l’index, puis cliquez sur Avancé pour afficher les paramètres de l’index. Ici, vous pourrez ajouter index.mode : lookup.

Complétez le téléchargement du fichier en cliquant sur Importer. Un index et un Data view seront créés.
Dans tous les cas, vous pouvez désormais faire référence au Lookup index dans vos requêtes ES|QL.
Répondre aux questions courantes
Q : Quand ne dois-je pas utiliser Join ? Lookup Join est vraiment puissant, mais avec un grand pouvoir… vous savez ce que c’est. Les jointures peuvent être coûteuses en ressources, et chaque jointure ajoute de la latence à la requête. Il existe cependant des cas où une jointure est excessive ou n’est pas la meilleure option. Par exemple, si un champ est très fréquemment joint dans de nombreuses requêtes, envisagez de le dénormaliser dans l’index de gauche. Ajoutez-le au moment de l’ingestion à l’aide d’un processeur d’ingestion enrichi, de la configuration de l’expéditeur de fichiers, d’un filtre Logstash, etc. Ce traitement d’ingestion ponctuel est un compromis entre une légère augmentation de l’utilisation de l’espace de stockage et des requêtes plus rapides. Cela s’applique surtout aux valeurs de référence qui ne changent pas fréquemment (le nom d’utilisateur d’un identifiant utilisateur) ou qui ne changent jamais (le fabricant d’un hôte).
Q : Puis-je interroger un lookup directement ?
Oui ! Un index lookup est essentiellement « juste un index », vous pouvez donc l’interroger avec ES|QL.
FROM <lookup_index> | …Ou alors, créez une data view.

Q : Puis-je envoyer des données depuis Logstash ou un agent ?
Oui ! Gardez simplement à l’esprit qu’un index de recherche n’est pas un flux de données et qu’il ne s’agit que d’une seule partition ; vous ne pouvez donc envoyer « que » jusqu’à 2 milliards de documents à chaque index de recherche.
Et ensuite ?
Nous travaillons à supprimer certaines limitations connues afin que Lookup Join devienne généralement disponible. De plus, nous concevons une expérience d’édition de premier ordre pour les ensembles de données de recherche. Imaginez pouvoir créer et modifier des index de recherche directement dans Kibana Discover, ou déposer un fichier CSV dans Discover pour remplir l’index. Voici une maquette de ce à quoi cela pourrait ressembler :

Et les Lookup Join ne sont que le début. Nous aimerions proposer d’autres types utiles de jointures, comme les jointures internes (INNER) ou les sous-requêtes, et aussi permettre la jonction contre n’importe quel index (pas seulement les indices de recherche).
Commencer
C’est donc lookup join, disponible dans Elasticsearch 8.18/9.0 en tant qu’aperçu technique.
Prêt à vous lancer ? Elastic 8.18 et 9.0 sont désormais disponibles sur Elastic Cloud, le service hébergé d’Elasticsearch qui intègre toutes les nouvelles fonctionnalités de cette dernière version. Au nom de l’équipe ES|QL, nous attendons vos commentaires, vous pouvez utiliser le bouton Soumettre des retours dans l’éditeur ES|QL dans Discover. Et au fait, on a terminé cet article sur JOIN sans faire de jeux de mots sur les jointures… Merci de nous avoir rejoints !
La publication et la date de publication de toute fonctionnalité ou fonction décrite dans le présent article restent à la seule discrétion d'Elastic. Toute fonctionnalité ou fonction qui n'est actuellement pas disponible peut ne pas être livrée à temps ou ne pas être livrée du tout.