<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Kibana - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Kibana - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/fr/search-labs/blog/category/kibana</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/blog/category/kibana</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/category/kibana.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 14:29:39 GMT</lastBuildDate>
  <item>
    <title><![CDATA[API Kibana Dashboards : un contrat stable pour chaque type de panneau, testé par plus de 50 équipes avant DG]]></title>
    <description><![CDATA[Gérez les tableaux de bord Kibana sous forme de code : enregistrez-les dans Git, promouvez-les dans différents environnements et automatisez les déploiements avec l'API Kibana et Terraform.]]></description>
    <content:encoded><![CDATA[<p>Les<a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards"> API Kibana Dashboards et de visualisation</a> sont prêtes pour la production dans Elastic 9.5 ; elles sont disponibles pour tous les niveaux d'abonnement et offrent une rétrocompatibilité totale. Définissez vos tableaux de bord au format JSON, validez-les dans Git, puis déployez-les dans différents environnements à l'aide de pipelines d'intégration et de déploiement continus (CI/CD), de <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Terraform</a> ou de tout autre outil que vous utilisez déjà. Plus de 50 équipes ont testé l'API lors de la <a href="https://www.elastic.co/search-labs/blog/kibana-dashboards-as-code-terraform-api">préversion technique 9.4</a>, certaines l'exploitant même déjà en production. La version 9.5 ajoute également de nouveaux points de terminaison (en préversion technique) pour le panneau <a href="https://dashboardsapispec.kibana.dev/tags.html">Tags</a>, avec des points de terminaison pour les panneaux <a href="https://dashboardsapispec.kibana.dev/markdowns.html"> Markdown</a> et<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"> Links</a> disponibles dès maintenant dans Elastic Cloud Serverless et prochainement dans la version 9.6.</p><h2>Ce que la rétrocompatibilité implique pour l'API Kibana Dashboards</h2><p>Pendant la préversion technique, la forme de l'API pouvait changer d'une version à l'autre.[1] Ce n'est plus le cas. La disponibilité générale (DG) signifie :</p><ul><li><p><strong>Rétrocompatibilité totale.</strong> De nouveaux champs et types de panneaux seront ajoutés au fil du temps, mais les champs et comportements existants demeureront inchangés. Toute modification majeure susceptible de rompre la compatibilité sera examinée avec la plus grande attention et ne sera introduite que dans une nouvelle version majeure de la pile technologique.</p></li><li><p><strong>Prête pour la production avec compatibilité totale.</strong> L'API bénéficie des garanties de compatibilité complète d'Elastic. Vous pouvez l'utiliser en toute sécurité dans les environnements de production pour les déploiements automatisés, la promotion de l'environnement et la gestion programmatique des tableaux de bord.</p></li></ul><h2>Nouveaux points de terminaison de l'API Kibana pour les panneaux Tags, Markdown et Links</h2><p>Elastic 9.5 introduit également un nouveau point de terminaison autonome pour le panneau <a href="https://dashboardsapispec.kibana.dev/tags.html"><strong>Tags</strong></a>, qui vous permet de catégoriser et filtrer les tableaux de bord. Vous pouvez désormais les gérer par programmation via des points de terminaison CRUD dédiés, ce qui facilite leur organisation à grande échelle dans différents environnements.	</p><p>De nouveaux points de terminaison pour les panneaux <a href="https://dashboardsapispec.kibana.dev/markdowns.html"><strong>Markdown</strong></a> et <a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"><strong>Liens</strong></a> sont désormais disponibles dans Serverless et seront intégrés dans la prochaine version de la pile (9.6).</p><h2>Quels types de panneaux l'API Kibana Dashboards prend-elle en charge ?</h2><p>L'API Dashboards prend en charge tous les panneaux <em>par valeur</em> de la version 9.5 (ceux définis directement dans un tableau de bord, par opposition aux panneaux de bibliothèque enregistrés pour être réutilisés). Chaque type de panneau pris en charge dispose d'un schéma typé et validé.</p><p><strong>Type de panneau</strong></p><p><strong>État</strong></p><p>Graphiques XY</p><p>Compatibles</p><p>Métriques</p><p>Compatibles</p><p>Circulaires</p><p>Compatibles</p><p>Jauge</p><p>Compatibles</p><p>Carte thermique</p><p>Compatibles</p><p>Tables de données</p><p>Compatibles</p><p>Arborescence</p><p>Compatibles</p><p>Sessions Discover</p><p>Compatibles</p><p>Contrôles</p><p>Compatibles</p><p>Markdown</p><p>Compatibles</p><p>Liens</p><p>Compatibles</p><p>Panneaux ML</p><p>Compatibles</p><p>Panneaux Observability</p><p>Compatibles</p><p>Maps</p><p>Bientôt disponible</p><p>Vega</p><p>Bientôt disponible</p><h2>Comment gérer les tableaux de bord Kibana sous forme de code</h2><p>L'API Dashboards permet un workflow complet de tableaux de bord sous forme de code : exportez un tableau de bord au format JSON propre et facilement comparable, validez-le dans Git comme source de référence, examinez les modifications via des requêtes pull et déployez la même définition dans les environnements de développement, de préproduction et de production. Une fois qu'un tableau de bord est géré sous forme de code, considérez Git comme source de référence unique : les modifications effectuées directement dans l'interface utilisateur seront écrasées lors du prochain déploiement.</p><p>La principale difficulté lors du transfert d'un tableau de bord entre des espaces, des clusters ou des environnements est que les tableaux de bord font référence à des objets (data views ou visualisations de bibliothèques, par exemple) au moyen d'identifiants. Comme ces identifiants sont générés automatiquement et varient d'un environnement à l'autre, un tableau de bord exporté depuis un environnement peut pointer vers des objets inexistants dans un autre. Il existe trois méthodes pour gérer cette situation, présentées ici de la plus automatisée à la moins automatisée :</p><ul><li><p><strong>Utilisez Terraform.</strong> Le <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">fournisseur Elastic Stack Terraform</a> suit chaque ressource et associe automatiquement les identifiants par environnement, afin que les références restent cohérentes lorsque vous faites passer un tableau de bord de l'environnement de développement à l'environnement de production.</p></li><li><p><strong>Définissez par valeur les </strong><a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"><strong>panneaux Elasticsearch Query Language (ES|QL)</strong></a><strong>.</strong> La méthode la plus portable pour créer un panneau consiste à définir sa visualisation à l'aide d'ES|QL directement dans le tableau de bord. Une requête <a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql-kibana">ES|QL</a> lit les données à partir des index qui y sont spécifiés ; le panneau ne contient donc aucune référence externe à des data views ou à des objets de bibliothèque. On obtient ainsi un tableau de bord entièrement autonome et portable.</p></li><li><p><strong>Attribuer les identifiants correspondants.</strong> Si vous référencez des objets enregistrés, tels que des data views ou des visualisations de bibliothèque, créez-les avec un identifiant spécifique en utilisant la méthode PUT (upsert) plutôt que POST (qui génère automatiquement un identifiant). Utilisez des identifiants explicites et lisibles, comme logs-prod, afin qu'ils soient faciles à reconnaître et à réutiliser d'un environnement à l'autre.</p></li></ul><p>Pour une présentation détaillée de ces modèles de portabilité et du workflow complet des tableaux de bord sous forme de code, consultez la documentation <a href="https://www.elastic.co/docs/explore-analyze/dashboards/manage-dashboards-as-code#dashboards-as-code-portability">Gérer les tableaux de bord sous forme de code</a>.</p><h3>Création d'un tableau de bord Kibana avec l'API Dashboards en utilisant PUT</h3><p>Voici un exemple rapide de création d'un tableau de bord avec un panneau de métriques, utilisant la méthode PUT au lieu de POST pour attribuer un identifiant personnalisé basé sur le nom du tableau de bord (service-health-overview). La même logique s'applique à la création de visualisations autonomes enregistrées dans la bibliothèque.</p>PUT kbn:/api/dashboards/service-health-overview
{
  "title": "Service health overview",
  "description": "Key service metrics — managed via API",
  "tags": [
    "production",
    "sre-team"
  ],
  "panels": [
    {
      "type": "vis",
      "grid": {
        "x": 0,
        "y": 0,
        "w": 12,
        "h": 8
      },
      "config": {
        "title": "Error rate (5xx)",
        "type": "metric",
        "data_source": {
          "type": "esql",
          "query": "FROM logs-* | WHERE http.response.status_code &gt;= 500 | STATS error_rate=count(*) BY host.name"
        },
        "metrics": [
          {
            "type": "primary",
            "column": "count"
          }
        ]
      }
    }
  ]
}<h2>Roadmap de l'API Kibana Dashboards : Maps, Vega et points de terminaison autonomes</h2><p>Nous travaillons activement à étendre la surface de l'API. La prise en charge des panneaux Maps et Vega est la prochaine étape, avec ajout de schémas typés. Nous développons également des points de terminaison CRUD autonomes pour les sessions Discover (au-delà de leur prise en charge actuelle en tant que panneaux de tableau de bord), les panneaux Vega, Maps et les Annotations, le tout dissocié du cycle de vie des tableaux de bord.</p><p>Pour les définitions complètes des schémas, consultez la <a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">documentation de l'API Dashboards</a>. Pour les utilisateurs de Terraform, le <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">fournisseur Elastic Stack Terraform</a> prend en charge l'API Dashboards en DG.</p><h2>Remarque</h2><ol><li><p>Les points de terminaison principaux restent inchangés par rapport à la préversion technique. Si vous avez développé des intégrations pour la version 9.4, elles fonctionneront avec la version 9.5. Les seuls changements entraînant une rupture de compatibilité sont deux modifications mineures concernant la liste des tableaux de bord et les formats d'unité de durée ; elles sont documentées <a href="https://www.elastic.co/docs/release-notes/kibana/breaking-changes">ici</a>.</p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/dashboards-as-code-kibana-api</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/dashboards-as-code-kibana-api</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[Expérience développeur]]></category>
    <category><![CDATA[Intégrations]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ed7e33de291f255/6a730619c8b7ac02b251f9d3/image1.png" length="0" type="image/png"/>
    <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Du prompt au tableau de bord en moins d'une minute, pour un coût divisé par 5 : tableaux de bord IA et graphiques Vega-Lite personnalisés dans Kibana]]></title>
    <description><![CDATA[Décrivez vos métriques en langage naturel ; le chat IA de Kibana génère des tableaux de bord et des graphiques Vega-Lite basés sur ES|QL, allant des nuages de points à la mise en forme conditionnelle et aux infobulles personnalisées.]]></description>
    <content:encoded><![CDATA[<p>Le <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat">chat IA</a> de Kibana crée désormais des tableaux de bord complets <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">basés sur le langage de requête Elasticsearch (ES|QL)</a> à partir d'un prompt en langage naturel, en moins d'une minute. Dans la version Elastic 9.5, cette fonctionnalité passe au stade de disponibilité générale (DG) (<a href="https://www.elastic.co/fr/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana">en préversion technique 9.4</a>) et intègre un mécanisme de récupération des erreurs qui relance les requêtes ayant échoué, réduit par cinq les coûts de génération ES|QL grâce au routage hiérarchisé des modèles et propose des contrôles de filtrage interactifs. Cette version ajoute également la création de graphiques <a href="https://www.elastic.co/docs/explore-analyze/visualize/custom-visualizations-with-vega">Vega-Lite</a> en langage naturel, incluant des nuages de points, des diagrammes en boîte, une mise en forme conditionnelle et des infobulles personnalisées, autant d'éléments qu'il fallait auparavant coder manuellement en JSON.</p><h2>Quoi de neuf dans la création de tableaux de bord IA avec Kibana</h2><p><strong>Fonctionnalité</strong></p><p><strong>Préversion technique (9.4)</strong></p><p><strong>DG (9.5)</strong></p><p>Gestion des erreurs</p><p>Pas de nouvelle tentative en cas d'échec des requêtes ES|QL</p><p>Jusqu'à trois tentatives automatiques avec inspection et ajustement des requêtes</p><p>Coût de génération ES|QL</p><p>Toutes les requêtes sont acheminées via le modèle principal</p><p>Modèle de routage à plusieurs niveaux, jusqu'à 5 fois moins cher</p><p>Plage temporelle</p><p>Fenêtre fixe par défaut</p><p>Sélection automatique en fonction de la distribution temporelle des données</p><p>Contrôles de filtre</p><p>Non pris en charge</p><p>Ajoutés automatiquement pour les champs les plus pertinents</p><p>Graphiques Vega-Lite</p><p>Non pris en charge</p><p>Création en langage naturel, incluant les nuages de points, les diagrammes en boîte, la mise en forme conditionnelle et les infobulles personnalisées</p><p>Modification de graphique</p><p>Non pris en charge</p><p>Modification des panneaux Vega-Lite existants en langage naturel</p><h3>Récupération automatique des erreurs pour la génération de tableaux de bord par IA</h3><p>Dans la préversion technique, l'agent ne relançait pas les requêtes ES|QL ayant échoué. Avec la version 9.5, il détecte les erreurs de requête et tente de les réexécuter jusqu'à trois fois ; il analyse chaque erreur et ajuste la requête avant d'abandonner. En pratique, cela élimine la majeure partie des problèmes de panneaux vides et permet d'obtenir des tableaux de bord qui s'affichent correctement dès la première tentative.</p><h3>Pourquoi la création de tableaux de bord par IA est-elle moins coûteuse dans Elastic 9.5 ?</h3><p>Les étapes de génération d'un tableau de bord ne nécessitent pas toutes le même niveau de raisonnement. Dans la version 9.5, la génération ES|QL passe par un modèle plus léger par défaut et revient au modèle principal uniquement en cas de besoin. Si votre <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/connectors">connecteur</a> utilise Claude Opus 4.8 d'Anthropic, la génération ES|QL pour tous les panneaux revient alors cinq fois moins cher.</p><h3>Sélection automatique de la plage temporelle basée sur vos données</h3><p>Les tableaux de bord ne sont utiles que s'ils affichent la fenêtre de données appropriée. L'agent applique désormais une logique optimisée pour sélectionner une période pertinente au regard des données interrogées, à moins que l'utilisateur ne spécifie une plage horaire particulière. Il prend en compte la répartition temporelle des données et adapte son choix en conséquence, qu'il s'agisse de la dernière heure pour un incident en cours ou des 90 derniers jours pour une analyse de tendance, plutôt que de s'en tenir systématiquement à une fenêtre temporelle fixe.</p><h3>Contrôles de filtrage automatiques sur les tableaux de bord générés par IA</h3><p>La création de tableaux de bord prend désormais en charge les contrôles, c'est-à-dire des filtres interactifs qui permettent aux utilisateurs d'affiner un tableau de bord en fonction des valeurs des champs sans modifier les requêtes sous-jacentes. Lors de la génération d'un tableau de bord, l'agent ajoute automatiquement des contrôles en haut pour les champs les plus pertinents à filtrer.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a5520e66ae76001/6a719a218a155220ed6498e7/image3.png" alt="Kibana AI chat generating an ES|QL-backed host metrics dashboard with automatic filter controls in 71 seconds" /><h2>Graphiques Vega-Lite à partir du langage naturel : types de graphiques et mise en forme au-delà des valeurs par défaut</h2><p><a href="https://vega.github.io/vega/">Vega</a> et <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> prennent en charge une grande variété de types de graphiques et de personnalisations dans Kibana. Avec la version 9.5, vous pouvez les créer en langage clair au lieu d'écrire le code vous-même. </p><h3>Nuages de points, diagrammes en boîte et autres types de graphiques Vega-Lite</h3><p>Les nuages de points, les diagrammes en boîte, les graphiques à facettes, les graphiques à bulles et les graphiques de composition (tels que la combinaison d'histogrammes et de cartes thermiques), entre autres, sont pris en charge par <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a>. Un prompt comme <em>Affiche-moi un nuage de points du temps de réponse en fonction de la taille de la requête, avec une coloration par nom de service</em> génère un panneau Vega-Lite intégrant les mappings de données appropriés. Ces graphiques utilisent les palettes de couleurs par défaut de Kibana afin de s'harmoniser avec le reste du tableau de bord.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1651fe7ac903d47/6a719a49f124649f746fc1b4/image5.png" alt="Kibana dashboard with four Vega-Lite charts: box plot, bubble chart, faceted small multiples, and heatmap." /><h3>Mise en forme conditionnelle, infobulles personnalisées et étiquettes sur graphiques standard</h3><p>Même pour les types de graphiques déjà intégrés dans les tableaux de bord comme les graphiques à barres, linéaires ou en aires, il est parfois nécessaire de disposer d'un contrôle plus poussé que celui offert par les fonctionnalités par défaut. Vega-Lite permet de combler cette lacune via le chat. En voici quelques exemples :</p><ul><li><p><strong>Mise en forme conditionnelle des couleurs</strong> : appliquez une couleur différente aux points de données dépassant un certain seuil ; par exemple, colorez en rouge les points d'un graphique linéaire ou en barres lorsqu'une métrique dépasse votre objectif de niveau de service (SLO). Demandez à l'agent quelque chose comme <em>Colore en rouge tous les points dépassant 500 ms sur mon graphique linéaire.</em> </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc1211784e9033557/6a719a6ab966e1736163d7d1/image1.png" alt="Vega-Lite line and bar charts in Kibana with conditional colour formatting showing data points above a threshold in red" /><p></p></li><li><p><strong>Marqueurs et étiquettes personnalisés</strong> : ajoutez des émojis, des symboles ou des étiquettes textuelles intégrées aux points de données pour obtenir des indicateurs d'état visibles d'un seul coup d'œil.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3c59c3748484bc1/6a719aa02888394fdc07bac1/image2.png" alt="Lite horizontal bar chart in Kibana with emoji flag labels and custom tooltip showing requests by country" /><p></p></li><li><p><strong>Infobulles personnalisées</strong> : enrichissez les états au survol avec des métriques supplémentaires, du contexte ou des valeurs calculées qui ne figurent pas sur les axes du graphique. Demandez par exemple <em>Ajoute une infobulle indiquant le nombre total d'enregistrements et le pourcentage par barre.</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt43f241f4382b5b90/6a719ab7ded0cf3367f49275/image4.png" alt="Vega-Lite stacked bar chart in Kibana with custom tooltip showing total records and percentage of total by extension" /><p></p></li></ul><p>Cette méthode fonctionne également pour modifier des graphiques Vega existants. Si vous avez un panneau Vega-Lite nécessitant une retouche comme modifier une échelle de couleurs, ajuster un axe ou changer le type de marqueur, décrivez la modification dans le chat plutôt que de fouiller dans le code JSON.</p><h2>Comment nous avons créé la génération Vega-Lite en langage naturel dans Kibana</h2><p>Générer un graphique Vega-Lite à partir d'une phrase ne se résume pas à un simple prompt unique <em>demandant au modèle de fournir du JSON</em>. Nous avons mis au point un petit pipeline de type agent capable de transformer une intention exprimée en langage naturel en un graphique validé et étayé par des données.</p><p>À la réception d'une requête, l'agent détermine d'abord si Vega-Lite est la solution appropriée. Pour les requêtes Vega-Lite, il ancre la visualisation sur une véritable requête ES|QL adressée à Elasticsearch, puis utilise un modèle pour générer le code Vega-Lite. Avant le rendu, le résultat passe par une couche de normalisation qui corrige le schéma et lie la requête canonique ; des transformations visant à garantir la sécurité du rendu sont également appliquées. </p><p>Quelques choix de conception rendent ce workflow fiable :</p><ul><li><p><strong>Appel d'outil typé</strong> : la création de graphiques repose sur l'appel structuré d'un outil plutôt que sur l'insertion de code Vega-Lite en format libre dans la conversation.</p></li><li><p><strong>Génération contrainte</strong> : le modèle génère du code Vega-Lite selon un schéma défini, ce qui rend la sortie plus prévisible et plus facile à valider.</p></li><li><p><strong>Exemples sélectionnés</strong> : les schémas structurels, tels que la navigation à facettes, les marqueurs superposés et les cartes thermiques, fournissent des indications sans copier les données sous-jacentes.</p></li><li><p><strong>Boucles d'exécution et de vérification</strong> : les requêtes sont exécutées avant la création du graphique, et les échecs de validation déclenchent des tentatives correctives pour la génération ES|QL.</p></li></ul><h2>Essayez la création de tableaux de bord par IA et les graphiques Vega-Lite dans Kibana</h2><p>Pour tester la création de tableaux de bord en langage naturel et les graphiques Vega-Lite, passez à <strong>Elastic 9.5</strong> (ou <a href="https://cloud.elastic.co/registration">commencez un essai gratuit</a>) et ouvrez le <strong>chat</strong> dans Kibana. Demandez ensuite à l'outil de générer un tableau de bord à partir de vos données. Pour Vega-Lite, demandez un type de graphique que vous avez toujours voulu mais que vous n'avez jamais créé, comme un nuage de points ou un graphique à bulles. Si le résultat ne vous convient pas tout à fait, indiquez à l'agent ce qu'il faut modifier ; il itère avec vous.</p><p>Cela nécessite une licence Entreprise. <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Commencer</a>.</p><p><em>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.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboards-kibana-vega-lite</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboards-kibana-vega-lite</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Marta Bondyra,Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt54406ad0378bc5fc/6a7199ffed03ccee0dac9d7c/image6.png" length="0" type="image/png"/>
    <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[137 000 personnes, zéro décision humaine : réponse agentique aux catastrophes avec Elasticsearch]]></title>
    <description><![CDATA[Découvrez comment une règle de détection Kibana, un workflow et un agent IA ont automatiquement relocalisé 137 000 militaires sur sept sites lors du passage d'un ouragan, sans aucune intervention de régulateur.]]></description>
    <content:encoded><![CDATA[<p>Elastic vient de coordonner l'évacuation automatisée de 137 000 militaires répartis sur sept sites, sans aucune intervention humaine. Un ouragan de catégorie 4 frappe le littoral de Hampton Roads. La fonctionnalité d'enrichissement géospatial d'Elasticsearch identifie, dès l'indexation, toutes les installations situées dans la zone d'impact. Une règle de détection Kibana se déclenche. Un workflow initie une conversation avec un agent IA. L'agent évalue les capacités d'accueil, les distances et la compatibilité des unités, puis diffuse 16 notifications d'évacuation et de prise en charge en une seule opération. Le tout automatiquement, en passant de l'événement brut (issu du GDACS) à une action coordonnée.</p><p>Chaque année, les catastrophes naturelles contraignent les responsables de la gestion des urgences, les commandants militaires et les autorités de sécurité publique à prendre des décisions aux enjeux considérables dans des délais très courts. Ces décisions reposent traditionnellement sur des chaînes d'appel, des feuilles de calcul et des connaissances institutionnelles réparties entre des dizaines de personnes. À elle seule, la surcharge liée à la coordination fait perdre un temps précieux.</p><p>Cet article montre comment Elastic permet de disposer d'un système de coordination agentique réactif et autonome pour la réponse aux catastrophes. Ce système détecte une menace, analyse les aspects logistiques et prend des mesures automatiquement. Pour illustrer ce concept, nous avons créé une simulation : un ouragan fictif de catégorie 4 menaçant le littoral de Hampton Roads déclenche le déplacement automatisé de plus de 137 000 personnes réparties sur sept installations militaires.</p><p><strong>Avertissement</strong> : <strong>ceci est un scénario entièrement fictif élaboré à des fins de démonstration. </strong>L’ouragan ELARA-26 n’existe pas. Les emplacements des installations reposent sur des données géographiques réelles et accessibles au public issues de l'ensemble de données MIRTA (Military Installations, Ranges and Training Areas) du département de la Défense des États-Unis. Toutes les données opérationnelles, telles que les effectifs, la capacité de logement, les ressources, les adresses e-mail de contact et les profils de mission, sont entièrement fictives. Rien dans cette démonstration ne reflète la préparation opérationnelle, les capacités ou les procédures opérationnelles militaires réelles.</p><h2>Pourquoi la réponse automatisée aux catastrophes nécessite une coordination géospatiale et agentique</h2><p>Lorsqu'une catastrophe naturelle menace les infrastructures critiques, le défi de la coordination est immédiat :</p><ul><li><p>Quelles installations se trouvent dans la zone d'impact ?</p></li><li><p>Combien de membres du personnel doivent être déplacés ?</p></li><li><p>Où peuvent-ils aller, et ces installations ont-elles la capacité nécessaire ?</p></li><li><p>Qui doit être informé immédiatement ?</p></li></ul><p>Ces questions n'attendent pas. Les réponses non plus.</p><h2>Déploiement du pipeline : prérequis et configuration</h2><p>Suivez les instructions <a href="https://github.com/tehbooom/elastic_natural_disaster/blob/main/README.md">ici dans le dépôt d'exemples</a> pour déployer un cluster Elastic local avec Elastic Inference Service (EIS) via <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/connect-self-managed-cluster-to-eis#set-up-eis-with-cloud-connect">Cloud Connect</a>.</p><h2>Fonctionnement du pipeline agentique de réponse aux catastrophes d'Elasticsearch</h2><p>Le pipeline comporte sept couches qui fonctionnent ensemble de bout en bout :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf09bfae87ab35bec/6a4693ef31bdbbe3ef8b33ae/61814cddea0409162fb057c2113e0a496c105238-1999x275.png" alt="Pipeline flowchart Alt text: Horizontal flowchart with seven labeled boxes connected by arrows: GDACS feed, ingest pipeline, enrich (geo_shape), detection rule, workflow, AI agent, and email." /><ol><li><p><strong>Ingestion de données</strong> : les événements de catastrophe du Système mondial d'alerte et de coordination en cas de catastrophe (GDACS) sont envoyés à Elasticsearch.</p></li><li><p><strong>Pipeline d'ingestion</strong> : les données GeoJSON sont ingérées et normalisées selon Elastic Common Schema (ECS).</p></li><li><p><strong>Enrichissement géospatial</strong> : le polygone de la zone touchée par l'événement est confronté aux limites indexées des installations militaires.</p></li><li><p><strong>Alerting</strong> : une règle de détection Kibana se déclenche lorsqu'une catastrophe recoupe une installation.</p></li><li><p><strong>Automatisation du workflow</strong> : l'alerte déclenche un workflow Kibana qui lance une conversation avec un agent IA.</p></li><li><p><strong>Raisonnement de l'IA</strong> : l'agent analyse les installations concernées, leurs actifs et les installations de soutien les plus proches afin de déterminer la relocalisation de l'ensemble des actifs et du personnel.</p></li><li><p><strong>Notifications par e-mail</strong>: l'agent envoie des e-mails à tous les destinataires concernant le personnel et/ou les actifs entrants et sortants.</p></li></ol><p>Passons en revue chaque couche.</p><h2>Étape 1 : Indexation des installations militaires avec limites géographiques</h2><p>La base repose sur l'ensemble de données DoD MIRTA provenant de <a href="https://source.coop/seerai/hifld/military-installations-ranges-and-training-areas-mirta-dod-sites---boundaries">source.coop/seerai/hifld</a>. Cet ensemble fournit une géométrie de type Point pour chaque installation, à savoir des coordonnées de centroïde plutôt que de polygones délimitant l'intégralité du périmètre.</p><p>Chaque document d'installation dans l'index 'mitra-facilities' est enrichi de données de profil opérationnel (toutes fictives), au-delà de ce que fournit MIRTA :</p>{
  "entity_name": "Naval Station Norfolk",
  "branch_of_service": "Navy",
  "mission_function_type": "fleet_support",
  "personnel_count": 50000,
  "housing_capacity": 55000,
  "temporary_housing_capacity": 10000,
  "logistics_capabilities": ["fuel", "airlift", "sealift", "medical"],
  "available_assets": [
    { "type": "helicopters", "count": 24 },
    { "type": "transport_vehicles", "count": 150 }
  ],
  "contact_email": "norfolk.ops@navy.mil.gov.fake",
  "operational_status": "act",
  "is_joint_base": false,
  "entity_geo_location": { "type": "polygon", "coordinates": [...] }
}<p>C'est cet index riche qui permet à l'agent IA de prendre des décisions d'affectation intelligentes. Il ne s'agit pas simplement d'identifier des bases à proximité, mais de repérer celles qui disposent de capacités de logement disponibles, de types de missions compatibles et de la logistique nécessaire pour accueillir les ressources entrantes.</p><h2>Étape 2 : Ingestion et normalisation des événements GDACS</h2><p>GDACS publie des données GeoJSON en temps réel concernant les séismes, les cyclones tropicaux, les inondations, les feux de forêt, les volcans et les sécheresses. Nous intégrons ce flux dans un flux de données (logs-gdacs.events-*) à l'aide d'un pipeline d'ingestion personnalisé qui normalise les données GeoJSON brutes au format de champs ECS.</p><p>À noter que le pipeline d'ingestion GDACS effectue plusieurs opérations :</p><p><strong>Extraction de la géométrie</strong> : le centroïde est stocké sous forme de 'geo_point' pour l'affichage cartographique, et le polygone d'impact est stocké sous forme de 'geo_shape' dans 'gdacs.affected_area', un champ qui sera utilisé ultérieurement pour les requêtes de recoupement.</p><p><strong>Normalisation de la gravité</strong> : chaque type de catastrophe présente une échelle de gravité différente. Un cyclone tropical se mesure par la vitesse du vent en km/h, tandis qu'un séisme s'évalue selon la magnitude de Richter. Le pipeline convertit toutes ces mesures en un score normalisé allant de 0 à 100 :</p>// Painless snippet from the ingest pipeline
if (type == 'TC') {
  norm = Math.min(100.0, Math.max(0.0, (val - 40.0) / 2.6));
} else if (type == 'EQ') {
  norm = Math.min(100.0, Math.max(0.0, (val - 4.0) * 20.0));
}<p>Le score de gravité normalisé est ensuite associé à une étiquette de niveau de gravité (faible, moyen, élevé, critique) utilisée pour la correspondance du niveau de gravité de l'alerte dans la règle de détection.</p><p><strong>Alignement ECS</strong> : event.kind : alerte, event.category : menace, horodatages mappés sur event.start/event.end et un _id stable basé sur une empreinte pour la déduplication.</p><h2>Étape 3 : Enrichissement géospatial - identifier les installations affectées au moment de l'indexation</h2><p>La politique d'enrichissement 'geo_match' d'Elasticsearch fait correspondre le polygone de la zone sinistrée à chaque périmètre d'installation lors de l'indexation, sans nécessiter de jointure au moment de la requête. Au lieu d'effectuer une requête lors de la recherche, nous utilisons un <strong>processeur d'enrichissement</strong> dans le pipeline d'ingestion pour faire correspondre le polygone d'impact de la catastrophe avec chaque limite d'installation <em>au moment où le document est indexé</em>.</p><p>La politique d'enrichissement est une politique 'geo_match' :</p>{
  "geo_match": {
    "indices": "mitra-facilities",
    "match_field": "entity_geo_location",
    "enrich_fields": [
      "entity_name",
      "entity_type",
      "entity_station_number",
      "entity_geo_city_name",
      "entity_geo_region_name"
    ]
  }
}<p>Le processeur s'exécute à la fin du pipeline d'ingestion :</p>{
  "enrich": {
    "policy_name": "facilities-geo",
    "field": "gdacs.affected_area",
    "target_field": "affected_facilities",
    "shape_relation": "INTERSECTS",
    "max_matches": 128
  }
}<p>INTERSECTS permet de détecter toute installation dont la limite touche ou chevauche le polygone de la catastrophe, y compris en cas d'intersection partielle. Par conséquent, chaque document d'événement GDACS est enregistré avec un tableau imbriqué 'affected_facilities' indiquant précisément quelles installations se trouvent dans la zone d'impact. Aucune requête de jointure n'est nécessaire.</p><h2>Étape 4 : Règle de détection – alerting en cas d'impact sur les installations</h2><p>Une règle de détection Kibana surveille le flux de données logs-gdacs.events-* et se déclenche lorsqu'un événement GDACS a été enrichi avec au moins une infrastructure affectée :</p>Requête : affected_facilities : { entity_name: * }<p>La règle s'exécute selon une planification horaire (couvrant une fenêtre allant de 'now-1h' à 'now') et utilise une correspondance dynamique de la gravité ; le champ 'gdacs.severity_level', calculé par le pipeline d'ingestion, détermine automatiquement la gravité de l'alerte.</p><p>La gravité de l'alerte détermine également le score de risque via le mapping de champs :</p>"risk_score_mapping": [
  {
    "field": "gdacs.normalized_severity",
    "operator": "equals",
    "value": ""
  }
]<p>Lorsque la règle se déclenche, elle transmet à un workflow Kibana l'intégralité du contexte de l'alerte, y compris le tableau 'affected_facilities' enrichi contenant les noms, types et emplacements des installations.</p><h2>Étape 5 : Automatisation des workflows – relier l'alerte à l'agent</h2><p>Les workflows Kibana gèrent la transition entre la détection et la réponse. Le workflow de réponse aux catastrophes naturelles est déclenché par l'alerte :</p>triggers:
  - type: alert
steps:
  - name: start_convo
    type: kibana.request
    with:
      method: "POST"
      path: "/api/agent_builder/converse"
      body:
        agent_id: "mitra.response"
        input: "New Natural Disaster Alert: {{ event.alerts | json }}"<p>L'intégralité de la charge utile de l'alerte (type de catastrophe, gravité, zone touchée et liste des installations impactées) est transmise à l'agent IA en tant que contexte initial. L'agent prend ensuite le relais.</p><h2>Étape 6 : L'agent IA – des données à l'action coordonnée</h2><p>L'agent mitra.response utilise l'intégralité de la charge utile d'alerte et, au cours d'une seule boucle agentique, évalue le périmètre, trouve les établissements d'accueil, affecte le personnel et envoie des notifications d'évacuation et de prise en charge, le tout sans intervention humaine.</p><p>L'agent dispose de deux outils :</p><ul><li><p><strong>mitra.nearest_facility</strong>interroge l'index mitra-facilities à l'aide d'une requête geo_shape, triée par distance par rapport à une coordonnée donnée, et renvoie jusqu'à 50 installations actives à proximité disposant de capacités d'accueil.</p></li><li><p><strong>mitra.send_email</strong> itère sur un tableau JSON d'objets d'installation et transmet des notifications formatées d'évacuation ou de réception.</p></li></ul><p>L'ensemble d'instructions de l'agent définit un workflow clair :</p><ol><li><p><strong>Évaluer la situation.</strong> Analyser l'alerte, identifier les installations touchées et déterminer l'ampleur de la catastrophe.</p></li><li><p><strong>Faire l'inventaire de ce qui doit être déplacé.</strong> Effectifs, ressources critiques, besoins en hébergement par établissement.</p></li><li><p><strong>Rechercher les installations de destination.</strong> Appeler mitra.nearest_facility pour chaque installation concernée, en excluant celles qui se trouvent encore dans la zone de danger.</p></li><li><p><strong>Prendre des décisions d'allocation.</strong> Raisonner sur les solutions monosite par rapport aux solutions multisites, la compatibilité des branches, la capacité d'hébergement, le support technique des actifs.</p></li><li><p><strong>Envoyer les e-mails de coordination.</strong> Transmettre les ordres d'évacuation aux établissements d'origine et les notifications d'admission aux établissements d'accueil.</p></li><li><p><strong>Générer un rapport récapitulatif. </strong>Produire un court résumé, à transmettre dans le chat pour examen, de toutes les installations concernées, de l'effectif total, des actifs déplacés, des installations de destination et de toute préoccupation.</p></li></ol><p>La logique d'affectation de l'agent respecte des contraintes réelles : ne pas dépasser la capacité d'hébergement, privilégier les réaffectations au sein d'une même branche lorsque c'est possible, utiliser des bases interarmées pour les excédents multibranches et prioriser la distance afin de minimiser le temps de trajet.</p><h3>L'outil d'installation la plus proche</h3><p>La requête de workflow sous-jacente utilise geo_shape avec un filtre de cercle et un tri _geo_distance :</p>"query": {
  "bool": {
    "filter": [
      {
        "geo_shape": {
          "entity_geo_location": {
            "shape": {
              "type": "circle",
              "coordinates": [{{ inputs.lon }}, {{ inputs.lat }}],
              "radius": "5000km"
            },
            "relation": "intersects"
          }
        }
      },
      { "term": { "operational_status.keyword": "act" } }
    ]
  }
},
"sort": [
  {
    "_geo_distance": {
      "entity_geo_point": { "lat": {{ inputs.lat }}, "lon": {{ inputs.lon }} },
      "order": "asc",
      "unit": "km"
    }
  }
],
"script_fields": {
  "available_capacity": {
    "script": {
      "source": "Math.max(0, doc['housing_capacity'].value - doc['personnel_count'].value)"
    }
  }
}<p>La capacité disponible est calculée au moment de la requête via un champ de script qui soustrait l'effectif actuel de la capacité d'hébergement. L'agent utilise cette information pour répartir le personnel entre les différentes destinations sans dépasser les limites.</p><h2>Ouragan ELARA-26 : coordination agentique de 137 000 personnes, de bout en bout</h2><p>L'ouragan ELARA-26 est une tempête de catégorie 4 (vitesse maximale de 213 km/h) dont l'arrivée sur les côtes est prévue dans la région de Hampton Roads, en Virginie. Lors de l'intégration de l'événement GDACS, le polygone de la zone touchée recoupe sept installations militaires majeures de la région. La règle de détection se déclenche. Le workflow initie une conversation entre agents.</p><p>Au sein d'une seule boucle agentique, l'agent :</p><ul><li><p>a identifié sept installations dans la zone d'impact pour un total de 137 372 membres du personnel ;</p></li><li><p>a appelé mitra.nearest_facility pour trouver des établissements d'accueil situés en dehors de la trajectoire de la tempête ;</p></li><li><p>a réparti le personnel entre neuf établissements d'accueil en fonction de la capacité d'hébergement disponible et de la distance ;</p></li><li><p>a généré et envoyé des ordres d'évacuation aux sept installations concernées ;</p></li><li><p>a généré et envoyé des notifications d'admission aux neuf installations destinataires ;</p></li><li><p>a généré un récapitulatif complet de coordination, semblable à ce qui suit :</p></li></ul><p><strong>Sites évacués :</strong></p><p>Installation</p><p>Personnel</p><p>Base navale de Norfolk</p><p>50 000</p><p>Base expéditionnaire interarmées Little Creek-Fort Story</p><p>18 000</p><p>Base aéronavale Oceana</p><p>15 355</p><p>Annexe Dam Neck de la base aéronavale d'Oceana</p><p>17 509</p><p>Réserve militaire d'État de la Garde nationale Camp Pendleton</p><p>9 707</p><p>Base interarmées Langley-Eustis</p><p>15 000</p><p>Base d'armement naval de Yorktown</p><p>11 801</p><p><strong>Installations d'accueil :</strong></p><p>Installation</p><p>Distance</p><p>Personnel entrant</p><p>Fort Gregg-Adams</p><p>97 km</p><p>~40 000</p><p>Base du Corps des Marines de Quantico</p><p>148 km</p><p>~30 000</p><p>Installation de soutien naval d'Indian Head</p><p>151 km</p><p>~30 000</p><p>Base interarmées Andrews</p><p>180 km</p><p>~30 000</p><p>Base aéronavale de Patuxent River</p><p>141 km</p><p>~10 000</p><p>Camp Butner de la Garde nationale</p><p>174 km</p><p>~5 000</p><p>Site d'entraînement de la Garde nationale Bethany Beach</p><p>209 km</p><p>~4 707</p><p>Base de Rivanna</p><p>140 km</p><p>~7 500</p><p>Centre d'approvisionnement général de la Défense</p><p>22 km</p><p>~6 000</p><p>Les moyens redéployés comprennent des véhicules de transport, des hélicoptères, des patrouilleurs, des unités médicales, des engins du génie, des groupes électrogènes, des remorques-citernes, des kits d'hébergement et des systèmes de communication.</p><h3>Notifications par e-mail automatisées</h3><p>Une fois son plan d'affectation finalisé, l'agent a appelé mitra.send_email et a envoyé 16 e-mails en une seule opération : des ordres d'évacuation destinés aux sept installations concernées et des avis d'admission adressés aux neuf établissements d'accueil. Chaque message précisait l'établissement de destination, le nombre de personnes transférées, les ressources à déplacer ainsi qu'un contact de coordination. Ce qui aurait nécessité des heures de chaînes d'appels téléphoniques a été accompli automatiquement dès que l'agent a achevé son raisonnement.</p><h3>Extension de la réponse agentique aux catastrophes avec la RAG et l'ancrage des politiques</h3><p>Cette démo repose uniquement sur des données structurées, telles que les capacités, les distances et l'état opérationnel. Les fonctionnalités de recherche sémantique et de génération augmentée par récupération (RAG) d'Elastic contribuent à rendre l'agent nettement plus intelligent, grâce à deux ajouts :</p><p><strong>Récupération des réponses historiques</strong> : indexation des anciens rapports post-intervention, des résumés d'incidents de l'Agence fédérale de gestion des urgences (FEMA) et des archives de réponse aux catastrophes sous forme d'embeddings vectoriels. Lorsqu'un nouvel événement se déclenche, l'agent peut effectuer une recherche sémantique sur la manière dont des événements similaires ont été traités, afin d'éclairer les décisions d'allocation grâce aux connaissances institutionnelles plutôt qu'aux seuls calculs de capacité.</p><p><strong>Ancrage dans les politiques et la doctrine</strong> : indexation des directives de gestion des urgences du DoD, des plans de continuité des opérations des installations et des orientations du commandement. L'agent peut récupérer et citer les politiques réelles régissant une réponse, garantissant ainsi que chaque décision est fondée sur la doctrine plutôt que sur une inférence.</p><p>Ces deux fonctionnalités suivent la même approche Elastic native : un pipeline d'inférence génère des embeddings au moment de l'indexation, et un outil de recherche sémantique est exposé à l'agent. Le pipeline de coordination reste le même. L'agent devient simplement plus intelligent.</p><h2>Pourquoi Elasticsearch est la plateforme idéale pour la réponse agentique dans le secteur public</h2><p>Ce n'est pas un chatbot. Ce n'est pas un tableau de bord. C'est un système de workflow agentique réactif, lequel a détecté une menace, analysé un problème logistique complexe et coordonné le déplacement de 137 000 personnes sans intervention humaine. Ce type de résultat n'est possible que parce que chaque fonctionnalité dont il dépend repose sur une plateforme unique et unifiée.</p><p>La prise en charge géospatiale d'Elasticsearch (geo_point, geo_shape, stratégies d'enrichissement et tri basé sur la distance) gère le raisonnement spatial qui rend possibles la détection des recoupements et la recherche d'installations à grande échelle. La recherche sémantique et les embeddings vectoriels ancrent les agents dans la réalité, garantissant que le raisonnement de l'IA repose sur ce qui se trouve réellement dans vos données plutôt que sur des hypothèses hallucinées. Le moteur de détection de Kibana, Workflows, Agent Builder et les outils d'Agent Builder connectent l'ensemble au sein d'un pipeline allant de l'événement brut à l'action coordonnée, sans nécessiter le moindre code de liaison externe.</p><p>Aucune autre plateforme ne réunit ces capacités comme le fait Elastic. L'alliance de l'indexation en temps réel, de la précision géospatiale, de la recherche sémantique et de l'orchestration par agents, le tout au sein d'une même pile technologique intégrant sécurité et observabilité de niveau entreprise, distingue Elastic des outils qui excellent dans un seul de ces domaines tout en vous obligeant à assembler vous-même les autres éléments.</p><h2>Réponse géospatiale agentique pour la gestion des urgences, les services d'incendie, les forces de l'ordre et la santé publique</h2><p>La même architecture s'applique partout où les personnes, les installations, et les événements en temps réel se recoupent. Les données spécifiques changent. Le pipeline ne change pas.</p><p><strong>Gestion des urgences</strong> : la FEMA et les services de gestion des urgences des États peuvent cartographier l'emplacement des abris, les zones de déploiement et les populations vulnérables en regard des polygones de conditions météorologiques extrêmes émis par le National Weather Service (NWS), déclenchant ainsi le prépositionnement automatisé des ressources avant qu'une tempête ne touche terre.</p><p><strong>Services d'incendie et de secours d'urgence</strong> : les services d'incendie peuvent superposer l'emplacement des unités et les zones d'intervention aux périmètres des feux de forêt ou aux clusters d'incendies de structures, en acheminant automatiquement les demandes d'entraide vers les unités disponibles les plus proches dotées de l'équipement adapté.</p><p><strong>Forces de l'ordre</strong> : les organismes peuvent corréler les lieux d'incidents en cours avec les zones scolaires, les infrastructures critiques et la position des agents, déclenchant ainsi des notifications de confinement géolocalisées ou le déploiement de ressources sans attendre un tri manuel.</p><p><strong>Sécurité des établissements scolaires</strong> : les districts scolaires peuvent monitorer les flux de menaces en temps réel par rapport au périmètre des campus. Lorsqu'une menace franchit le périmètre d'une école, un agent peut immédiatement avertir l'administration, déclencher les communications de confinement et coordonner la réponse des forces de l'ordre, avant même qu'un coordinateur ne décroche son téléphone.</p><p><strong>Santé publique</strong> : les services de santé peuvent comparer les données de surveillance des maladies ou les zones de risques environnementaux avec les emplacements des établissements de soin, les couches de densité de population et les inventaires des dépôts de fournitures afin d'acheminer les ressources là où elles sont le plus nécessaires.</p><p>Secteur</p><p>Cas d'utilisation</p><p>Capacité Elastic</p><p>Gestion des urgences</p><p>Croiser les emplacements des abris aux polygones de phénomènes météorologiques violents du NWS</p><p>Enrichissement geo_shape + workflows Kibana</p><p>Incendie et SMU</p><p>Superposer les emplacements des unités aux périmètres des feux de forêt</p><p>Routage géospatial + requête de recherche de l'installation la plus proche</p><p>Application de la loi</p><p>Corréler les incidents avec les zones scolaires et les positions des agents</p><p>Règles d'alerte tenant compte de la géolocalisation + répartition des agents</p><p>Sécurité des établissements scolaires</p><p>Monitorer les flux de menaces par rapport aux périmètres de campus</p><p>Règles de détection + notification automatisée</p><p>Santé publique</p><p>Croiser les zones de danger avec les emplacements des établissements de soin et les dépôts de ravitaillement</p><p>Recherche sémantique + enrichissement géospatial</p><p>Les données varient selon les scénarios, mais le schéma sous-jacent reste identique : ingestion, enrichissement lors de l'indexation, détection des recoupements, déclenchement d'une réponse agentique et exécution de l'action. Elastic fournit aux organismes du secteur public une plateforme permettant de concevoir cette solution une seule fois et de l'adapter partout.</p><p><em>La publication et la date de publication des fonctionnalités ou fonctions décrites 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.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-agentic-disaster-response</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-agentic-disaster-response</guid>
    <category><![CDATA[IA agentique]]></category>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Alec Carpenter]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt969cad2694920de4/6a4693f37746672ad42675b5/cb292a501835472598dee30bef25c77afc54db6c-720x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[AI Chat dans Kibana prend désormais en charge l'affichage natif des tableaux de bord]]></title>
    <description><![CDATA[Elastic AI Chat dans Kibana permet désormais de créer des tableaux de bord à partir du langage naturel. Vos visualisations et analyses sont conservées dans un seul fil de discussion et vous pouvez les enregistrer en tant qu'objets Kibana réutilisables.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Elastic AI Chat</a> dans Kibana transforme désormais une question en langage simple en <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">visualisations</a> <strong>ES|QL</strong> ou en <strong>tableau de bord</strong> complet, directement dans votre <strong>conversation</strong>. Décrivez les métriques dont vous avez besoin, affinez au fur et à mesure et enregistrez lorsque le résultat vous convient. Tous les éléments <strong>restent dans la conversation</strong> jusqu'à ce que vous soyez prêt à les <strong>enregistrer</strong>, puis deviennent un objet Kibana à part entière que votre équipe peut ouvrir, modifier et réutiliser. Disponible en préversion technique dans Elastic 9.4.</p><p>L'agent crée des tableaux de bord à partir de zéro, mais il fonctionne également avec ce que vous avez déjà. Ouvrez la barre latérale AI Chat tout en affichant un tableau de bord et celui-ci <strong>se joint</strong> <strong>automatiquement</strong>. Demandez pourquoi une métrique a augmenté, ventilez-la par région ou ajoutez un panneau de comparaison. Votre tableau de bord existant devient le <strong>point de départ</strong>, et pas seulement le produit final.</p><h2>Dans les coulisses : comment nous avons développé des tableaux de bord dans AI Chat</h2><p>Nous enseignons à l'agent des tâches spécifiques au moyen de <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-skills">skills</a>, des descriptions structurées de la manière de traiter un problème donné. Cependant, développer un skill de tableau de bord impliquait d'apprendre à un LLM à générer des tableaux de bord Kibana valides, et l'ancienne API Saved Object rendait cette tâche pénible en raison de données JSON profondément imbriquées, de modifications subtiles d'une version à l'autre et de références instables. Il nous fallait une approche différente</p><h3>Une API spécialement conçue pour la création de tableaux de bord par programme</h3><p>La nouvelle <a href="https://dashboardsapispec.kibana.dev/dashboards.html">API Dashboards</a> a été conçue exactement pour ce scénario. Au lieu d'exposer l'état interne brut, elle propose des schémas typés et validés pour chaque type de panneau. L'API gère la traduction entre des structures externes claires et les représentations internes de Kibana, afin que l'agent puisse se concentrer sur ce que le tableau de bord doit contenir plutôt que sur sa mise en forme.</p><h3>Un seul skill, un seul outil, de nombreuses opérations</h3><p>Le skill <code>dashboard-management</code> un seul outil <code>manage_dashboard</code> qui accepte un tableau ordonné d'<strong>opérations</strong>. Chaque opération est une action discrète : définir les métadonnées, ajouter un panneau Markdown, créer des visualisations basées sur ES|QL à partir du langage naturel, modifier des panneaux existants, regrouper les panneaux en sections repliables ou repositionner les éléments sur la grille.</p><p>L'agent peut décrire un tableau de bord entier : titre, description, sections et tous les panneaux qui les composent en un seul appel :</p>{
 "operations": [
   { "operation": "set_metadata", "title": "Checkout latency investigation" },
   {
     "operation": "add_section",
     "title": "Overview",
     "panels": [
       { "query": "p95 checkout latency over the last 24h", "chartType": "xy" },
       { "query": "checkout error rate by region", "chartType": "metric" }
     ]
   }
 ]
}<p>Les opérations s'exécutent dans l'ordre, de sorte que les étapes ultérieures peuvent faire référence et s'appuyer sur les précédentes. Cette conception permet de concentrer la conversation sur l'intention plutôt que sur les détails de mise en œuvre.</p><h3>Pipeline de visualisation : du langage naturel à ES|QL et aux visualisations</h3><p></p><p>Lorsque vous demandez un tableau de bord, l'agent explore vos données – index, mappings de champs, types – puis planifie les visualisations et appelle manage_dashboard.</p><p>Chaque panneau s'exécute via son propre pipeline : sélection du type de graphique, génération ES|QL, configuration de la visualisation et validation. Nous avons isolé ce processus du fil principal de l'agent. En effet, la création de la visualisation nécessiterait plusieurs appels au modèle par panneau, et l'intégrer au contexte principal alourdirait la fenêtre et rendrait le raisonnement moins clair.</p><p>Dans manage_dashboard, tous les panneaux sont créés simultanément, puis réassemblés dans l'ordre. Le résultat est un tableau de bord complet avec des panneaux intégrés ; pas de visualisations orphelines, pas de problèmes de synchronisation.</p><h3>Pourquoi avez-vous déplacé la création de visualisations à l'intérieur de l'outil de tableau de bord ?</h3><p>Dans un premier temps, nous avons utilisé un outil create_visualization distinct : un appel par panneau, puis un transfert manuel de chaque élément vers l'outil de tableau de bord. Cela fonctionnait, mais chaque visualisation nécessitait son propre appel d'outil, son propre cycle de vie et un transfert explicite. Pire encore, la modification d'une visualisation dans la conversation ne mettait pas à jour le panneau du tableau de bord, ce qui semait la confusion chez les utilisateurs.</p><p>Nous avons intégré la création de visualisations directement dans manage_dashboard. Les mêmes workflows parallèles s'exécutent, mais les panneaux s'assemblent directement dans la structure du tableau de bord sans passer par des pièces jointes intermédiaires. Moins d'appels, aucun problème de synchronisation, un seul cycle de vie.</p><p>Les visualisations autonomes fonctionnent toujours (vous pouvez ajouter des graphiques existants à un tableau de bord via des références de pièces jointes), mais pour créer du contenu à partir de zéro, la création intégrée est la solution la plus simple.</p><h2>Pour les équipes de sécurité</h2><p>Les analystes SOC et les ingénieurs en détection n'ont pas le temps de faire des allers-retours vers l'éditeur de tableau de bord en pleine investigation. Avec AI Chat, demandez le volume d'alertes par type de règle, par hôte ou par tactique MITRE, et consultez-le dans votre fil de discussion en une minute environ. Au fur et à mesure que l'enquête avance, ajoutez des panneaux – anomalies d'exécution des processus, connexions réseau, comparaisons chronologiques – sans perdre le contexte.</p><p>Enregistrez lorsque vous avez terminé. Le tableau de bord servira alors de référence pour l'analyse post-incident, de point de départ pour le prochain analyste ou de compte rendu hebdomadaire sur les menaces, sans qu'il soit nécessaire de tout réexpliquer.</p><p>Pour en savoir plus sur la façon dont les équipes de sécurité peuvent utiliser la création de tableaux de bord et d'autres fonctionnalités d'AI Chat récemment lancées, consultez cet <a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">article de blog</a>.</p><h2>Pour les ingénieurs en observabilité et fiabilité des sites (SRE)</h2><p>Lorsqu'un service se dégrade à 2 heures du matin, on n'a pas le temps de créer des tableaux de bord à partir de zéro. Avec AI Chat, un ingénieur SRE peut décrire les métriques dont il a besoin (latence p99 par service, taux d'erreur par rapport aux événements de déploiement, redémarrages de pods au cours de la dernière heure) et obtenir un tableau de bord complet dans le fil de discussion dédié à l'investigation en une minute environ. L'agent peut l'affiner étape par étape à mesure que la situation se précise : ajouter un panneau, modifier la fenêtre temporelle, ventiler les données par région.</p><p>Enregistrez le tableau de bord ; il sera immédiatement accessible dans la salle de crise (mêmes panneaux, même mise en page) pour tous les participants à la réunion de gestion de l'incident. Une fois l'incident terminé, il servira de base à l'analyse rétrospective.</p><h2>Prochaines étapes</h2><p>Nous travaillons à l'optimisation des jetons, à des interactions plein écran plus riches, à la prise en charge d'un plus grand nombre de panneaux et à l'amélioration continue de la qualité. Le préversion technique est le bon moment pour définir les priorités. S'il manque quelque chose, dites-le-nous via l'icône "<strong>Envoyer des commentaires</strong>" dans le menu supérieur.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6783ac3a6540ba5b/6a17dd804b055d813e4320e0/1bb71a01a12641961134f2231778344a6249e8f4-1490x634.png" alt="Page de gestion du tableau de bord affichant une liste comprenant une entrée intitulée &quot;[OTel] Détails de l'hôte – Aperçu&quot;, ainsi que des filtres, un champ de recherche, un bouton &quot;Créer un tableau de bord&quot; et une option permettant d'envoyer des commentaires." /><h2>Faites l'essai</h2><p>Passez à <strong>Elastic 9.4</strong> (ou démarrez un essai), ouvrez <strong>AI Chat </strong>en mode plein écran et essayez-le sur une enquête réelle. Demandez à l'agent de tracer les métriques que vous examinez, puis demandez la ventilation suivante. Lorsque le récit se tient, enregistrez et partagez – mêmes panneaux, même cadrage, aucune ré-explication nécessaire. Nécessite une licence d'entreprise (<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">prise en main</a>).
<em>La sortie et le calendrier des fonctionnalités décrites dans cet article restent à la seule discrétion d'Elastic. Toutes les caractéristiques ou fonctionnalités non disponibles actuellement peuvent ne pas être livrées à temps, voire pas du tout.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler,Robert Jaszczurek]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc2ccc8f75d7cc972/6a17dd82577262f0831bcb21/f3c7ce5e05cabea693363616e62f5e30e0be2cd5-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Kibana réduit le temps de chargement des tableaux de bord jusqu'à 25 %. Voici la stratégie d'interrogation qui se cache derrière]]></title>
    <description><![CDATA[Découvrez comment Kibana utilise l'interrogation continue et la détection HTTP/2 côté navigateur pour réduire les temps de chargement des tableaux de bord jusqu'à 25 %, avec repli automatique sur HTTP/1.]]></description>
    <content:encoded><![CDATA[<p>Les tableaux de bord Kibana et Discover se chargent désormais jusqu'à 25 % plus rapidement grâce à l'interrogation continue. Au lieu d'interrompre l'exécution entre les vérifications périodiques, Kibana maintient les connexions HTTP ouvertes et fournit les résultats des requêtes Elasticsearch dès qu'ils sont disponibles. Sur HTTP/2 et versions ultérieures (configuration par défaut de Kibana depuis la version 9.0), cette fonctionnalité est activée automatiquement, sans aucune configuration nécessaire. Sur HTTP/1, Kibana utilise l'interrogation classique pour éviter la saturation du pool de connexions.</p><h2>Comment Kibana récupère les données lors du chargement d'un tableau de bord</h2><p>Lorsqu'un tableau de bord est ouvert, la plupart des panneaux, (en interne, nous les appelons <em>panneaux intégrables</em>) lancent une ou plusieurs requêtes Elasticsearch. Mais au lieu du simple échange d'appels et de réponses d'une recherche synchrone (sync), nous utilisons la puissance de la recherche asynchrone (async) (<a href="https://www.elastic.co/docs/solutions/search/async-search-api">documentation</a>).</p><p>Avec la recherche asynchrone, les résultats des requêtes restent disponibles dans Elasticsearch en dehors de toute requête HTTP particulière. Ce point est important, car il</p><ul><li><p>rend le chargement des données résistant aux perturbations du réseau.</p></li><li><p>alimente notre <a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">fonctionnalité de recherche en arrière-plan</a>, qui permet aux utilisateurs de travailler sur d'autres éléments dans Kibana pendant qu'ils attendent la fin d'une session de tableau de bord ou Discover de longue durée.</p></li></ul><p>Une fois la requête initiale envoyée, Kibana surveille la recherche pour détecter sa fin et récupérer l'ensemble des résultats.</p><h3>Comment l'interrogation classique affecte les temps de chargement du tableau de bord Kibana</h3><p>Dans le système d'interrogation traditionnel, Kibana envoie une requête, ferme la connexion initiale, puis vérifie périodiquement auprès d'Elasticsearch si l'opération est terminée.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Diagramme illustrant l'interrogation classique dans Kibana. La chronologie Kibana montre une courte période de connexion ouverte après l'envoi de la requête, suivie d'une longue période d'inactivité, puis d'une brève interrogation pour vérifier l'état, et enfin la transmission des résultats. La chronologie Elasticsearch exécute une requête qui se termine au milieu de la période d'inactivité de Kibana, illustrant ainsi le décalage de coordination à l'origine de la perte de temps." /><p>Après l'envoi d'une requête, Elasticsearch dispose d'un court laps de temps pour effectuer la recherche et renvoyer les résultats. Si la recherche s'achève rapidement, il s'agit d'un simple échange de données. En revanche, pour les recherches plus longues, la connexion initiale est fermée et Kibana vérifie régulièrement l'état d'avancement de la recherche. Ce processus est appelé <em>interrogation</em>.</p><h4>Inconvénients de l'interrogation classique en termes de performance</h4><p>Si vous observez la figure ci-dessus, vous pouvez constatez peut-être l'inconvénient de cette approche en termes de performances : la recherche a de fortes chances de se terminer pendant l'un des intervalles d'inactivité de Kibana, ce qui entraîne une perte de temps.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="Diagramme chronologique illustrant la dégradation des performances qu'implique l'interrogation classique. La chronologie Kibana montre une période de connexion ouverte, une longue période d'inactivité, une interrogation pour vérifier l'état, puis la transmission des résultats. La chronologie Elasticsearch montre la requête se terminant à mi-chemin de la période d'inactivité de Kibana, suivie d'un segment rouge représentant la perte de temps, soit la durée gaspillée avant que Kibana ne se réactive et récupère les résultats." /><p>Dans le pire des cas (lorsqu'une recherche se termine au début d'une période d'inactivité), toute la durée de l'intervalle d'interrogation sera perdue.</p><h4>L'impact d'une stratégie de temporisation</h4><p>Il est d'usage, lors des interrogations, d'appliquer une stratégie de temporisation. Cela signifie que plus la durée de la recherche est longue, moins les interrogations sont fréquentes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="Graphique à barres horizontales illustrant le programme de temporisation des intervalles d'interrogation de Kibana en fonction de la durée des requêtes. Les requêtes inférieures à 1,5 seconde utilisent un intervalle d'environ 0,5 seconde, celles de 1,5 à 5 secondes, un intervalle de 1 seconde, celles de 5 à 20 secondes, un intervalle d'environ 2,5 secondes, et celles supérieures à 20 secondes, un intervalle de 5 secondes." /><p>Toutefois, cela signifie également que le temps potentiellement perdu est proportionnel à la durée de la recherche.</p><h4>Comment les intervalles d'interrogation créent des schémas de latence en dents de scie</h4><p>En rassemblant ces facteurs, notre temps perdu devient une fonction en dents de scie par paliers.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="Graphique linéaire montrant le temps perdu en secondes en fonction du temps d'exécution de la requête en secondes, formant un motif en dents de scie où le temps perdu augmente puis retombe à zéro de manière répétée, avec des pics passant de moins d'une seconde à 5 secondes à mesure que la durée de la requête augmente de 0 à 30 secondes." /><p>Ici, les pics représentent les scénarios les plus défavorables et les creux les scénarios les plus favorables. Cela montre que le coût d'un système d'interrogation traditionnel varie de zéro à la durée totale de l'intervalle d'interrogation, selon la durée de la recherche (et les conditions du réseau).</p><h2>Interrogation continue : comment Kibana élimine les temps d'attente</h2><p>Le problème avec les interrogations classiques est le manque fondamental de coordination entre Kibana et Elasticsearch. Idéalement, Kibana devrait être informé immédiatement de la disponibilité des résultats. Et si l'on inversait le schéma d'interrogation pour que la quasi-totalité du temps soit consacrée à la vérification d'Elasticsearch, sans aucune interruption ?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="Diagramme chronologique illustrant l'interrogation continue dans Kibana. La chronologie Kibana est entièrement bleue : la connexion reste ouverte depuis l'envoi de la requête jusqu'à la réception des résultats après deux actualisations, et ce, sans interruption. La chronologie Elasticsearch montre l'exécution de la requête et la réception immédiate des résultats. La légende montre le temps perdu barré, signalant ainsi son élimination." /><p>Avec cette combinaison d'interrogations de longue durée et d'absence de périodes de veille, les résultats sont transmis dès qu'ils sont prêts.</p><h3>Dégradation HTTP/1</h3><p>La théorie tient la route. Alors pourquoi ce déploiement Kibana semble-t-il si dégradé lorsque nous activons l'interrogation continue ?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="Enregistrement d'écran animé d'un tableau de bord Kibana chargeant l'ensemble de données Sample Logs Data, montrant plusieurs panneaux se remplissant en séquence, notamment une série chronologique des codes de réponse, une carte des États-Unis du nombre total de requêtes, le nombre de visiteurs uniques, les métriques du taux d'erreur HTTP et un graphique de Sankey des données du système d'exploitation et de destination de la machine." /><p>Le point important est que ce déploiement s'exécute sur HTTP/1. Avec HTTP/1, les requêtes HTTP sont associées une à une à des connexions TCP. Par conséquent, plusieurs requêtes d'interrogation de longue durée monopolisent le nombre limité de connexions du navigateur, ce qui entraîne la mise en file d'attente d'autres requêtes.</p><p>En revanche, avec HTTP/2+, les requêtes réseau peuvent partager des connexions TCP via le multiplexage, ce qui nous évite ce problème.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Diagramme comparant HTTP/1 et HTTP/2 pour l'interrogation continue de Kibana. HTTP/1 requiert une connexion TCP par requête, ce qui sature le pool de connexions du navigateur (six connexions disponibles). HTTP/2 multiplexe plusieurs requêtes d'interrogation sur une seule connexion TCP, évitant ainsi la saturation du pool et préservant les performances." /><p>Ainsi, sur HTTP/2+, l'interrogation continue est une vertu, mais sur HTTP/1, elle devient un vice.</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>Connexions TCP</p><p>Une par requête HTTP</p><p>Multiplexée (plusieurs requêtes partagent les mêmes connexions)</p><p>Comportement de l'interrogation continue</p><p>Dégrade les performances (saturation du pool de connexions)</p><p>Bénéfice complet (résultats immédiats)</p><h4>Comment Kibana détecte le protocole HTTP pour une interrogation optimale</h4><p>HTTP/2 est le protocole recommandé et celui par défaut de Kibana depuis la version 9.0 ; il serait donc dommage de ne pas intégrer cette amélioration des performances. En revanche, l'expérience utilisateur avec HTTP/1 est tellement dégradée qu'il est inacceptable de prendre le risque de l'utiliser sur les déploiements sur site dont le protocole n'a pas encore été mis à niveau. La solution est claire : nous devons détecter le protocole utilisé et appliquer la stratégie d'interrogation optimale.</p><p>Il est tout à fait possible que le serveur Kibana sache quel protocole il utilise. Cependant, il y a un hic : le facteur limitant est le pool de connexions du navigateur. Autrement dit, ce qui compte vraiment, c'est le protocole utilisé par le <em>navigateur</em>.</p><p>En raison des proxys, ceux-ci ne sont pas toujours identiques.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="Schéma d'architecture illustrant trois composants disposés horizontalement : le serveur Kibana à gauche, un proxy optionnel au centre et le client Kibana à droite. La liaison entre le serveur et le proxy est indiquée par kibana.yml server.protocol qui précise le protocole connu. La liaison entre le proxy et le client est indiquée par trois points d'interrogation, signalant que le protocole de cette dernière liaison est inconnu et peut différer." /><p>Si nous basons notre optimisation sur le protocole du serveur, nous pourrions nous tromper de deux manières.</p><ol><li><p>Appliquer une interrogation continue à tort et dégrader l'expérience utilisateur.</p></li><li><p>Ne pas parvenir à appliquer une interrogation continue quand il le faudrait et passer à côté de l'optimisation.</p></li></ol><p>Heureusement, les navigateurs modernes permettent de détecter le protocole du dernier saut réseau de toute requête terminée grâce à l'utilisation de <code>PerformanceObserver</code>. Ainsi, nous surveillons le protocole du premier envoi de requête et optimisons en conséquence.</p>new PerformanceObserver((list) =&gt; {
  const entries = list.getEntries();
  const entry = entries.find(({ name }) =&gt; name.includes('/internal/search/'));
  if (entry) {
    this.protocolSupportsMultiplexing = ['h2', 'h3'].includes(entry.nextHopProtocol);
  }
});<h2>Résultats en laboratoire : interrogation continue et interrogation classique dans Kibana</h2><p>Pour valider l'interrogation continue, nous avons créé des tableaux de bord avec des délais de requête allant de 1 à 23 secondes et mesuré les temps de chargement avec et sans l'optimisation activée. Nous avons ensuite chargé les tableaux de bord avec et sans interrogation continue pour mesurer les gains (nous nous sommes bien amusés avec la <a href="https://github.com/kertal/race-for-the-prize">course aux prix</a>).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba4af840d8324923/6a1710ceb339d52fe076a0b6/5f19fb45c5307a7491037fe1ad1a302728793203-1200x742.png" alt="Graphique à barres présentant les résultats des tests en laboratoire pour l'interrogation continue de Kibana : gain de temps par rapport à l'interrogation classique pour des durées de requête allant de 1 à 23 secondes. Les gains varient de presque zéro à 4,9 secondes selon le moment où les requêtes se terminent par rapport aux limites de l'intervalle d'interrogation, confirmant le motif de latence en dents de scie prédit par la stratégie de temporisation." /><p>Ce schéma rappelle notre diagramme en dents de scie initial. Pour certaines durées de requête, les gains sont faibles, tandis que pour d'autres, ils atteignent plusieurs secondes.</p><h2>Conclusion</h2><p>Cette optimisation remplace efficacement la latence inhérente à l'interrogation classique par une stratégie d'interrogation continue plus performante. La principale difficulté résidait dans la mise en œuvre conditionnelle de cette optimisation afin d'éviter toute dégradation des performances sur les déploiements HTTP/1. Nous l'avons résolue en utilisant la fonction <code>PerformanceObserver</code> du navigateur pour détecter de manière fiable le protocole utilisé pour le dernier saut du réseau.</p><p>Des tests en laboratoire valident cette théorie, démontrant que l'interrogation continue fournit des résultats dès qu'ils sont disponibles. En moyenne, cela se traduit par une amélioration significative de l'expérience utilisateur, avec un temps de chargement des données jusqu'à 25 % plus rapide.</p><p>Ce travail représente la dernière étape de notre engagement à réduire le délai d'accès aux informations pour nos utilisateurs. En faisant de Kibana un proxy plus transparent pour les données Elasticsearch, nous optimisons les performances dans notre domaine d'expertise. À suivre !</p><p>(En 2025, Thomas Neirynk a donné un <a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">excellent aperçu</a> des méthodes et des motivations derrière l'amélioration des performances du tableau de bord Kibana. Ceci est une mise à jour de cette initiative.)</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Drew Tate,Matthias Wilhelm]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Décrivez, ne dessinez pas : tableaux de bord Kibana IA natifs via MCP et ES|QL]]></title>
    <description><![CDATA[Du prompt au tableau de bord. Apprenez à créer des tableaux de bord Kibana en langage naturel grâce à example-mcp-dashbuilder : une application MCP open source qui écrit des requêtes ES|QL, crée des graphiques interactifs et exporte des tableaux de bord entièrement fonctionnels directement vers Kibana.]]></description>
    <content:encoded><![CDATA[<p>example-mcp-dashbuilder est une application MCP open source qui transforme un simple prompt de commande en un tableau de bord Kibana interactif et en temps réel, directement dans la fenêtre de chat de votre éditeur. Décrivez le tableau de bord souhaité : l'IA détecte la structure de votre index, génère les agrégations ES|QL appropriées pour chaque visualisation et affiche un aperçu en temps réel. Une fois la configuration terminée, une simple commande permet d'exporter un tableau de bord Kibana entièrement fonctionnel : visualisations Lens, disposition en grille exacte et couleurs personnalisées conservées. Six types de graphiques sont actuellement pris en charge ; l'ensemble des fonctionnalités de Kibana Lens sera intégré ultérieurement.</p><h2>Qu'est-ce qu'un générateur de tableaux de bord Kibana ?</h2><p>Et si vous pouviez décrire le tableau de bord que vous souhaitez en langage clair et le voir apparaître, avec des graphiques interactifs, une mise en page par glisser-déposer et une exportation vers Kibana en un clic ?</p><p>C'est exactement ce que fait <a href="https://github.com/elastic/example-mcp-dashbuilder.git"><strong>example-mcp-dashbuilder</strong></a>. Il s'agit d'une application open source (Model Context Protocol (MCP)) qui connecte les assistants IA à Elasticsearch, vous permettant de créer des tableaux de bord Kibana complets par chat. Pas besoin de cliquer dans les menus. Pas de configurations de visualisation à écrire manuellement. Il suffit de décrire ce dont vous avez besoin, et l'IA explore vos données, écrit les requêtes en langage de requête Elasticsearch (ES|QL), construit les graphiques et propose un tableau de bord interactif en direct, le tout dans la fenêtre de chat de votre éditeur.</p><h2><strong>Du prompt au tableau de bord en quelques secondes</strong></h2><p>Voici à quoi cela ressemble concrètement. Vous tapez quelque chose comme :</p><p>"Crée-moi un tableau de bord de trafic web à partir de logstash-* avec le nombre total de requêtes, les nombre d'octets transférés au fil du temps, les principales sources géographiques et une répartition des codes de réponse"</p><p>L'IA va alors :</p><ol><li><p><strong>Découvre vos données</strong> : liste les index, inspecte les mappings de champs.</p></li><li><p><strong>Rédige des requêtes ES|QL</strong> : adaptées à votre schéma, utilisant les bonnes agrégations.</p></li><li><p><strong>Crée des visualisations</strong> : graphiques à barres, graphiques linéaires, métriques avec sparklines, cartes thermiques, graphiques circulaires.</p></li><li><p><strong>Organise tout</strong> : sections pliables, titres compréhensibles, mise en page adéquate.</p></li><li><p><strong>Affiche un aperçu interactif</strong> : directement dans le chat, avec des infobulles, un sélecteur de temps et un système de glisser-déposer.</p></li></ol><p>Chaque graphique apparaît en ligne au fur et à mesure qu'il est créé, ce qui vous permet de voir les progrès réalisés en temps réel. Ensuite, <code>view_dashboard</code> affiche le tableau de bord complet avec tous les panneaux disposés dans la grille à 48 colonnes de Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75af5d9042d141b5/6a17e99dbe608675a4004792/dcbf47c4f17bf1a184fb0167408ebeb861ef6c9d-1404x1568.png" alt="Deux graphiques affichés dans l'interface example-mcp-dashbuilder. Le premier est un graphique à barres verticales intitulé &quot;Principales sources géographiques&quot;, montrant le nombre de requêtes par code pays. Le second est un graphique circulaire intitulé &quot;Répartition des codes de réponse HTTP&quot;, montrant des segments pour les réponses 200, 404 et 503." /><p><em>Aperçu du graphique unique intégré.</em></p><h2><strong>Propulsé par ES|QL</strong></h2><p>Toutes les recherches de données utilisent <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>, le langage de requête d'Elasticsearch. L'IA ne se contente pas de traiter les requêtes brutes, elle utilise aussi une connaissance intégrée d'ES|QL ainsi que des informations sur la structure de vos données pour écrire des requêtes correctes et efficaces pour chaque type de visualisation.</p><p>Le serveur inclut une référence ES|QL complète en tant que ressource MCP. Avant d'écrire une requête, l'IA lit cette référence pour comprendre les commandes, fonctions et schémas disponibles. Associée à un guide des bonnes pratiques de visualisation de données (également utilisé comme ressource), l'IA sait non seulement <em>comment</em> interroger, mais aussi <em>ce qui</em> génère une bonne visualisation :</p><ul><li><p>Utilisez <code>BUCKET(@timestamp, 1 day)</code> pour les séries temporelles ; toujours <code>SORT</code> par le champ temporel.</p></li><li><p>Limitez les graphiques circulaires à six tranches avec <code>| SORT value DESC | LIMIT 6</code>.</p></li><li><p>Choisissez des graphiques à barres pour les comparaisons de catégories, des graphiques linéaires pour les tendances, des métriques pour les indicateurs clés de performance (KPIs).</p></li></ul><h2><strong>Exploration de données pilotée par l'IA avec analyse ouverte</strong></h2><p>Créer un tableau de bord que vous avez déjà imaginé est une chose. Se demander "Qu'y a-t-il d'intéressant dans cet index?" et obtenir une réponse utile est plus difficile ; cela exige que l'IA sache <em>explorer</em>, et pas seulement dessiner.</p><p>Example-mcp-dashbuilder propose une ressource <code>analysis://guidelines</code> qui définit un flux d'exploration structuré : profiler les données, effectuer des agrégations ciblées, faire apparaître des schémas dignes d'être étudiés, créer des graphiques pour les résultats les plus intéressants et proposer des requêtes d'exploration que l'utilisateur pourrait souhaiter ensuite. Des expressions déclencheurs, telles que "analyser mes logs" ou "trouver des tendances dans cet index", incitent l'IA à lire le playbook avant toute autre action. Ainsi, une requête ouverte produit une analyse cohérente plutôt qu'une multitude de graphiques aléatoires.</p><p>Résultat : vous pouvez fournir à l'IA un index inconnu et obtenir en retour un point de départ : un tableau de bord accompagné d'une courte liste de questions du type "Voici ce que j'ai remarqué, voulez-vous que j'approfondisse certains de ces points ?".</p><h2><strong>Exportation et importation du tableau de bord Kibana : le processus complet</strong></h2><p>C'est au niveau de l'exportation/importation que example-mcp-dashbuilder devient réellement utile pour les équipes qui travaillent déjà avec Kibana. example-mcp-dashbuilder est un outil à part entière, une interface de tableau de bord conversationnelle intégrée à votre éditeur, mais qui ne confine pas votre travail à cet éditeur. Les tableaux de bord créés ici peuvent être transférés vers Kibana à votre guise, et inversement, les tableaux de bord Kibana existants peuvent être importés pour une édition assistée par l'IA.</p><h3><strong>Exporter vers Kibana</strong></h3><p>Lorsque vous êtes satisfait de votre tableau de bord, une commande permet de l'exporter :</p><p>"Exporter ce tableau de bord vers Kibana"</p><p>Chaque panneau est traduit en une véritable visualisation Kibana Lens. La traduction préserve :</p><ul><li><p><strong>Requêtes ES|QL</strong> : transférées directement en tant que sources de données Lens ES|QL.</p></li><li><p><strong>Positions de la grille</strong> : le même système à 48 colonnes que celui utilisé par Kibana, votre mise en page est donc identique.</p></li><li><p><strong>Couleurs personnalisées :</strong> Palettes de séries, arrière-plans de métriques, rampes de couleurs de carte thermique.</p></li></ul><p>Le résultat est un tableau de bord Kibana entièrement fonctionnel. Pas une capture d'écran. Pas une intégration. Un vrai tableau de bord que vous pouvez partager et continuer à modifier dans Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1921c74c2833cabe/6a17e99f6864a4a712b687da/5e27777bc0a82cafb373943f65298bdb21d66176-1999x902.png" alt="Deux tableaux de bord sont affichés côte à côte. Le tableau de bord de gauche intitulé &quot;Modifier le trafic web – Logstash (Dashbuilder)&quot; affiche les métriques de trafic récentes, ainsi qu'un panneau de volume de trafic, un histogramme géographique et un diagramme circulaire des codes de réponse. Le tableau de bord de droite propose une présentation similaire, mais avec des totaux plus élevés ; il comprend également un panneau de volume de trafic, un graphique à barres géographique et un graphique circulaire des codes de réponse." /><p><em>Tableau de bord Kibana et tableau de bord dans le chat Cursor côte à côte.</em></p><h3><strong>Importer depuis Kibana</strong></h3><p>L'aller-retour fonctionne également dans l'autre sens :</p><p>"Importer le tableau de bord Kibana avec l'identifiant abc-123"</p><p>Cette opération récupère un tableau de bord Kibana existant, traduit ses visualisations Lens en configurations de graphiques éditables, préserve la disposition de la grille et les sections, puis charge le tout dans example-mcp-dashbuilder. À partir de là, vous pouvez le modifier en langage naturel et le réexporter.</p><p>L'IA devient ainsi un collaborateur de votre workflow Kibana existant, sans le remplacer.</p><h2><strong>Thèmes et couleurs personnalisés</strong></h2><p>Vous souhaitez un tableau de bord personnalisé ? Il suffit de demander :</p><p>"Créer un tableau de bord à thème rose avec des couleurs personnalisées"</p><p>Chaque type de visualisation prend en charge la configuration personnalisée des couleurs :</p><ul><li><p><strong>Graphiques</strong> : <code>palette</code> accepte un tableau de couleurs hexadécimales pour les séries et les tranches.</p></li><li><p><strong>Métriques</strong> : <code>color</code> définit la couleur de fond.</p></li><li><p><strong>Cartes thermiques</strong> : <code>colorRamp</code> définit le gradient, des valeurs faibles aux valeurs élevées.</p></li></ul><p>L'IA interprète naturellement les demandes de thème. Par exemple, si vous dites "Thème Océan", elle choisira des bleus et des turquoises. Si vous dites "Respecter les couleurs de notre marque" et fournissez les valeurs hexadécimales, elles seront automatiquement intégrées à Kibana lors de l'exportation.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2bc7cddbdef81354/6a17e9a1ec0f89ee155a665e/4aceba013ac9cbb4a541109efd6acddf8a6ec47d-1562x1568.png" alt="Un tableau de bord e-commerce thématique aux couleurs roses personnalisées. La mise en page affiche les KPI relatifs au chiffre d'affaires et aux commandes en haut, une section de tendances réduite et deux graphiques par catégorie en dessous : un graphique à barres pour le chiffre d'affaires par catégorie et un graphique circulaire pour les commandes par catégorie." /><p><em>Un tableau de bord thématique avec des couleurs personnalisées.</em></p><p><strong>Fonctionnement de example-mcp-dashbuilder : architecture MCP</strong></p><p>example-mcp-dashbuilder est basé sur <a href="https://modelcontextprotocol.io/">MCP</a>, la norme ouverte permettant de connecter les assistants IA à des outils et données externes. Voici l'architecture générale :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c0cd879646e9947/6a17e9a36864a4c408b687df/cbfeabe151ec1ee2b0655f4d17468c9bb358df7e-1024x559.png" alt="Diagramme d'architecture montrant l'hôte MCP connecté au serveur MCP, qui contient des outils, des ressources et des instructions. En dessous, un cadre de l'application MCP inclut les graphiques Elastic et la disposition en grille de Kibana. Elasticsearch et Kibana apparaissent en bas avec des flèches les reliant à l'application MCP." /><p>Le <strong>serveur MCP</strong> expose 25 outils directement accessibles à l'IA, permettant notamment l'exécution de requêtes ES|QL et l'exportation de tableaux de bord. Il propose également quelques outils internes "application uniquement", utilisés par l'aperçu intégré pour récupérer des données, enregistrer les modifications de mise en page et détecter les champs temporels. Trois ressources sont disponibles : un guide des bonnes pratiques de visualisation des données, une documentation de référence ES|QL et un playbook d'analyse approfondie, déclenché par des prompts ouverts ("analyse mes logs", "qu'y a-t-il d'intéressant dans cet index"). Le serveur fonctionne via les E/S standard (stdio) ou HTTP. Le protocole HTTP prend en charge les réponses par flux et la gestion des sessions, permettant ainsi à plusieurs clients de se connecter simultanément.</p><p>L'<strong>application MCP</strong> est l'aperçu interactif. Elle est développée avec React, <a href="https://elastic.github.io/elastic-charts">Elastic Charts</a>, et l'<a href="https://eui.elastic.co/">interface utilisateur Elastic</a>, le tout intégré dans un seul fichier HTML autonome. Lorsque l'IA appelle <code>view_dashboard</code> ou crée un graphique, l'hôte affiche ce HTML dans une iframe en sandbox. L'application communique avec le serveur exclusivement via le <a href="https://modelcontextprotocol.io/extensions/apps/overview">protocole MCP Apps</a>, en utilisant <code>callServerTool()</code> sur postMessage pour récupérer les données, enregistrer les mises en page et détecter les champs temporels. Il n'y a pas de serveur local, pas de port à configurer, aucune dépendance réseau externe.</p><p>Cela signifie qu'il fonctionne avec n'importe quel client compatible MCP : Cursor, Claude Desktop, Claude.ai, VS Code avec Copilot et bien d'autres.</p><h2><strong>Quels sont les types de graphiques pris en charge par example-mcp-dashbuilder ?</strong></h2><p>Au moment de la rédaction de cet article, six types de graphiques couvrant les scénarios de tableaux de bord les plus courants sont pris en charge :</p><p>Type</p><p>Idéal pour</p><p>Exemple</p><p>À barres</p><p>Comparaison des catégories</p><p>Requêtes par source géographique</p><p>Linéaire</p><p>Tendances au fil du temps</p><p>Octets transférés par heure</p><p>Zone</p><p>Volume au fil du temps</p><p>Volume de requêtes au fil du temps</p><p>Tarte</p><p>Partie du tout (six tranches maximum)</p><p>Distribution des codes de réponse</p><p>Métrique</p><p>KPI unique avec sparkline</p><p>Nombre total de requêtes avec tendance horaire</p><p>Carte thermique</p><p>Schémas en deux dimensions</p><p>Requêtes par jour de la semaine et heure</p><p>Les tableaux de bord prennent en charge les sections pliables pour l'organisation, un sélecteur temporel avec détection automatique des champs temporels, ainsi que la possibilité d'enregistrer et de basculer entre plusieurs tableaux de bord ; les sessions de chat parallèles restent isolées les unes des autres via un <code>dashboardId</code> intégré à chaque appel d'outil.</p><h2><strong>Comment installer et exécuter example-mcp-dashbuilder</strong></h2><p>example-mcp-dashbuilder est open source et prêt à être utilisé. Vous aurez besoin de Node.js 22+, d'une instance Elasticsearch (locale ou Elastic Cloud) et d'un client compatible MCP.</p><p><strong>Claude Desktop</strong> : téléchargez la dernière version <code>.mcpb</code> depuis <a href="https://github.com/elastic/example-mcp-dashbuilder/releases">GitHub Releases</a>, et double-cliquez dessus. Claude Desktop vous demandera vos identifiants Elasticsearch.</p><p><strong>Cursor/Claude Code/VS Code Copilot</strong> : indiquez à votre configuration MCP l'emplacement de l'archive tar publiée ; pas de clone, pas de <code>npm install</code> :</p>{
  "mcpServers": {
    "example-mcp-dashbuilder": {
      "type": "stdio",
      "command": "npx",
      "args": ["https://github.com/elastic/example-mcp-dashbuilder/releases/latest/download/example-mcp-dashbuilder.tgz"]
    }
  }
}<p>Définissez <code>ES_NODE, ES_API_KEY</code> (ou <code>ES_USERNAME / ES_PASSWORD</code>) et <code>KIBANA_URL</code> comme variables d'environnement. Si vous préférez travailler à partir de la source, clonez le dépôt et exécutez <code>npm run setup</code> pour lancer un assistant interactif qui gère à la fois Elasticsearch local et Elastic Cloud (Cloud ID + clé API).</p><p>Et commence à créer :</p><p>"Explorer l'index des logs et me créer le tableau de bord le plus pertinent possible ?"</p><p>L'IA prend le relais. 😉</p><h2><strong>Roadmap : nouveautés à venir concernant example-mcp-dashbuilder</strong></h2><p>Il s'agit d'une version préliminaire, et nous travaillons activement à son développement. Voici quelques axes sur lesquels nous nous concentrons :</p><ul><li><p><strong>Autres types de graphiques</strong> : jauge, diagramme en anneau, arborescence, table de données et nuage de tags pour correspondre à toutes les capacités de Lens.</p></li><li><p><strong>Transférez les tableaux de bord vers Git</strong> : inscrivez les configurations des tableaux de bord dans un référentiel pour le contrôle des versions et les workflows de révision du code.</p></li><li><p><strong>Meilleure expérience utilisateur en cas d'erreur</strong> : commentaires plus détaillés en cas d'échec des requêtes ES|QL, avec des suggestions de solutions courantes.</p></li><li><p><strong>Flux d'analyse plus riches</strong> : extension du playbook d'analyse approfondie pour couvrir davantage de formes de données (logs, métriques, traces).</p></li></ul><p>Nous serions ravis de savoir ce que vous allez en faire. Essayez-le, signalez les problèmes et faites-nous savoir quelles visualisations et quels workflows seraient les plus utiles pour votre équipe.</p><p><a href="https://github.com/elastic/example-mcp-dashbuilder">GitHub : elastic/example-mcp-dashbuilder</a></p><h3>Remerciements</h3><p>Merci à <a href="mailto:walter.rafelsberger@elastic.co">Walter Rafelsberger</a> et <a href="mailto:tim.schnell@elastic.co">Tim Schnell</a> pour leurs contributions à la mise en œuvre.</p><h3>FAQ</h3><p><strong>Qu'est-ce que example-mcp-dashbuilder ?</strong> example-mcp-dashbuilder est une application MCP (Model Context Protocol) open source qui connecte les assistants IA à Elasticsearch. Il vous permet de décrire un tableau de bord Kibana en langage clair, de générer automatiquement des requêtes ES|QL, de créer des visualisations et de diffuser un tableau de bord interactif en direct dans la fenêtre de chat de votre éditeur.</p><p><strong>Quel langage de requête example-mcp-dashbuilder utilise-t-il pour récupérer les données ?</strong> Toutes les récupérations de données utilisent ES|QL, le langage de requête canalisé d'Elasticsearch. Le serveur MCP inclut une référence ES|QL intégrée que l'IA lit avant d'écrire toute requête, garantissant une syntaxe correcte et des agrégations efficaces pour chaque type de visualisation.</p><p><strong>Puis-je exporter vers Kibana des tableaux de bord créés avec example-mcp-dashbuilder ?</strong> Oui. L'exécution de "Exporter ce tableau de bord vers Kibana" traduit chaque panneau en une véritable visualisation Kibana Lens, préservant les requêtes ES|QL, la mise en page de la grille à 48 colonnes, les couleurs personnalisées et les palettes de séries. Le résultat est un tableau de bord Kibana entièrement fonctionnel, et non une capture d'écran ou une intégration.</p><p><strong>Puis-je importer un tableau de bord Kibana existant dans example-mcp-dashbuilder pour une édition assistée par l'IA ?</strong> Oui. Il suffit de fournir l'identifiant du tableau de bord Kibana pour le récupérer, convertir ses visualisations Lens en configurations de graphique modifiables et les charger dans example-mcp-dashbuilder. Vous pouvez ensuite modifier le tableau de bord en langage naturel et le réexporter vers Kibana.</p><p><strong>Quels sont les clients MCP compatibles avec example-mcp-dashbuilder ?</strong> example-mcp-dashbuilder fonctionne avec n'importe quel client compatible MCP, y compris Cursor, Claude Desktop, Claude.ai, et VS Code avec Copilot. Il prend en charge les protocoles stdio et HTTP, sans aucun serveur local ni configuration de port nécessaire.</p><p><strong>Quels sont les types de graphiques pris en charge par example-mcp-dashbuilder ?</strong> La version actuelle prend en charge six types de graphiques : à barres, linéaire, à aires, en camembert, métriques (avec sparkline) et cartes thermiques. Les ajouts prévus incluent les graphiques à jauge, en anneau, arborescents, tables de données et nuages de tags afin de correspondre à l'ensemble des fonctionnalités de Kibana Lens.</p><p><strong>De quoi ai-je besoin pour exécuter example-mcp-dashbuilder ?</strong> Vous avez besoin de Node.js 22 ou version ultérieur, d'une instance Elasticsearch (locale ou Elastic Cloud) et d'un client compatible MCP. Définissez les variables d'environnement ES_NODE, ES_API_KEY (ou ES_USERNAME/ES_PASSWORD) et KIBANA_URL. Pour Claude Desktop, téléchargez le fichier .mcpb depuis les versions GitHub et double-cliquez dessus pour l'installer.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-builder-mcp-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-builder-mcp-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[IA]]></category>
    <dc:creator><![CDATA[Stratoula Kalafateli]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a69a35d6d51ff47/6a17e9a5b1e11339cd79f2b3/0d38385fd64c1445b2e955ba20532570f7f38679-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Améliorer l'interactivité des tableaux de bord Kibana grâce aux contrôles variables]]></title>
    <description><![CDATA[Découvrez comment utiliser les contrôles variables dans Kibana 8.18+ pour filtrer les visualisations individuelles, ajuster les intervalles de temps et regrouper les données par champs dans les tableaux de bord Kibana.]]></description>
    <content:encoded><![CDATA[<p>Nous sommes ravis d'annoncer que <strong>les contrôles variables sont désormais disponibles dans les tableaux de bord Kibana</strong> à partir de la version 8.18 et pour toute la série 9.x ! Cette fonctionnalité est l'un des ajouts les plus demandés par les utilisateurs des tableaux de bord, et elle est enfin là 🎉 Au cours des derniers mois, nous avons continué à développer et affiner <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#add-variable-control">les contrôles variables</a>. C'est donc le moment parfait pour leur consacrer un article de blog.</p><h2>Qu'est-ce que les contrôles variables ?</h2><p>Si vous avez déjà travaillé avec des tableaux de bord Kibana, vous connaissez probablement nos contrôles de tableau de bord classiques : ces menus déroulants pratiques affichent des valeurs extraites de vos données pour vous permettre de les filtrer en quelques clics.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7405fbff7584b1b/6a17ee5cfbc5f8aea1491b5d/b82c1b25a0b38661e5ce4552f763be487d5074aa-1600x701.png" alt="" /><p>Les contrôles variables semblent similaires à première vue, mais ils comportent une particularité astucieuse : au lieu de filtrer automatiquement chaque panneau de votre tableau de bord, ils peuvent être directement intégrés dans <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">des requêtes ES|QL au sein de visualisations individuelles</a>.</p><p>Cela signifie que <em>vous</em> décidez où chaque contrôle s'applique. Mieux encore, vous pouvez les utiliser pour toutes sortes de choses, comme ajuster les intervalles de temps, changer les champs de répartition ou modifier les paramètres de visualisation à la volée. En résumé, ils offrent une expérience véritablement interactive pour vos tableaux de bord et permettent ainsi d'obtenir des informations plus rapidement et plus facilement.</p><h2>Cas d'utilisation des contrôles variables</h2><p>Les contrôles variables semblent utiles, mais qu'offrent-ils vraiment ? Voici quelques exemples de la manière dont ils améliorent vos tableaux de bord :</p><h3>Filtrez les visualisations sélectionnées</h3><p>Vous souhaitez filtrer <em>certaines</em> visualisations seulement ? C'est possible avec les contrôles variables. Choisissez les panneaux sur lesquels vous souhaitez agir et connectez-les dans les requêtes ES|QL à l'origine de vos visualisations.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd014bba50a3a61e/6a17ee5e14d90c006d79b69a/efa367363830b03bc67028aceafe78c4b44e578f-1440x562.gif" alt="" /><h3>Sélectionnez différents intervalles de temps</h3><p>Donnez à vos utilisateurs la possibilité de choisir entre « 5 minutes », « 1 heure », « 1 jour », ou tout autre intervalle temporel souhaité. Créez un contrôle variable avec des intervalles prédéfinis et connectez-le à votre requête de série temporelle.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt237797ddea95ce08/6a17ee602f4a5cfd65fa8996/62aa9f4e728036f8c70213b76b1cf131f36f5b4d-1440x606.gif" alt="" /><h3>Modifier les fonctions</h3><p>Au lieu de créer plusieurs graphiques pour chaque opération, les utilisateurs du tableau de bord peuvent choisir s'ils veulent voir le maximum, la moyenne, différents centiles ou tout autre agrégateur.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4c856460132fb604/6a17ee627b54f920838b3991/f6a2b4c73dc35efe462c2924a153d7b3fa3a7922-1436x606.gif" alt="" /><h3>Grouper par différents champs</h3><p>Il est parfois nécessaire de décomposer les données selon différents facteurs lors d'une enquête. Grâce aux contrôles variables, vous pouvez définir plusieurs champs « grouper par » et permettre aux utilisateurs du tableau de bord de choisir celui qui les aidera à obtenir les informations souhaitées.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbf1a24038dde55b8/6a17ee646864a413b6b6884c/fe8745a6fddccadba0666686b8ebc67fdaf64158-1438x606.gif" alt="" /><h2>Comment faire ?</h2><p>Le moyen le plus simple (et probablement le plus agréable) de créer un contrôle variable est directement depuis l'<strong>éditeur de requêtes ES|QL</strong> dans votre visualisation. Commencez simplement à taper votre requête, utilisez le menu de saisie automatique et Kibana vous fournira la structure de contrôle nécessaire.</p><p>Mais si vous préférez partir de la variable elle-même, vous pouvez également aller dans : <strong>Add panel → Controls → Variable control (Ajouter un panneau → Contrôles → Contrôle de variable)</strong> et ajouter la variable à vos visualisations après avoir créé le contrôle.</p><h3>Exemple 1 : Contrôle de filtrage avec sélection à valeurs multiples</h3><p>1. Choisissez une visualisation alimentée par une requête ES|QL et cliquez sur « Create control » (Créer un contrôle) dans la clause WHERE</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1356c9ac1ffce732/6a17ee661d1b83104a93e4f3/46cb6f2a6775aee152d42eb5ee85170f1bdf26cb-1600x668.png" alt="" /><p>2. Vous serez automatiquement redirigé vers le menu de création de variable, où le type « Values from a query » (Valeurs d’une requête) sera sélectionné pour vous, et le nom de la variable déjà pré-rempli. N’oubliez pas que le nom d’un contrôle doit toujours commencer par « ?... » pour fonctionner dans la requête de visualisation.</p><p>Vous aurez traditionnellement besoin d'une requête comme celle-ci pour obtenir les valeurs d'un champ et les mettre à jour selon l'intervalle de temps sélectionné dans le tableau de bord :</p>FROM &lt;datasource_name&gt;
| WHERE @timestamp &lt;=?_tend and @timestamp &gt;?_tstart
| STATS BY &lt;field_name&gt;<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb34ecc3303fda700/6a17ee68a2929914e3d02d23/a2a72d4e3159923c6207908da9b4172e27cd5f81-1600x716.png" alt="" /><p>3. Lorsque vous enregistrez le contrôle, vous le verrez apparaître en haut du tableau de bord et votre requête de visualisation sera mise à jour avec le nom du contrôle variable.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte03c74e0c60bdb42/6a17ee6a0b0bed13cddd3636/5fc434c8951889e9769652b675191711d126a685-1600x653.png" alt="" /><p>4. Si vous souhaitez ajouter <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#esql-multi-values-controls">une sélection à valeurs multiples</a> au contrôle, vous devez utiliser la fonction <code>MV_CONTAINS</code> dans la requête et sélectionner « Allow multiple selections » (Autoriser les sélections multiples) lors de la création du contrôle à l’étape 2 (disponible à partir de la version 9.3).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt218a166f7a1dc52c/6a17ee6ca2929979a9d02d27/1f237cea0a37cb25a7917a2a683707a269adae8e-1600x670.png" alt="" /><h3>Exemple 2 : contrôle de l'intervalle de temps</h3><p>Si vous créez une série temporelle, vous pouvez facilement ajouter un contrôle variable pour l'intervalle de votre histogramme de dates :</p><p>1. Lors de la rédaction d'une requête ES|QL pour votre série temporelle, cliquez sur « Create control » (Créer un contrôle). Lorsque vous créez une variable pour des intervalles, il est préférable d'utiliser <code>TBUCKET</code> au lieu de <code>BUCKET</code> pour prendre en charge des intervalles plus lisibles tels que « 1 heure », « 1 jour », etc. Une option automatique sera bientôt disponible pour <code>TBUCKET</code> afin qu'il puisse s'adapter automatiquement aux périodes de temps.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta6f32acf5ed19697/6a17ee6e6864a4a32fb68850/b0ad53d790ff9bdd42db5e77477318319f423534-1600x664.png" alt="" /><p>2. Définissez les intervalles pour remplir les options dans le menu déroulant.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf08d6a75afe87314/6a17ee6f25daab58fe08a2fa/f3bd83f530cfa4698c1a3b1ae60d08d0414043b5-1600x757.png" alt="" /><p>3. Sélectionnez différents intervalles dans le menu déroulant et observez comment votre visualisation change.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ecd5f376b096063/6a17ee7196142a0f77eb1b9b/0f928d9c70929f64926e065059188d140cd48943-1600x671.png" alt="" /><h3>Exemple 3 : variables pour les fonctions</h3><ol><li><p>Créez une variable en utilisant le type de contrôle « Static values » (Valeurs statiques) et ajoutez des noms de fonctions à vos valeurs déroulantes. Il est important d'utiliser un nom de variable qui commence par « ??… » pour remplacer les fonctions.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6bdc0c817465f3f0/6a17ee73505ac3268cad8bea/531444237b7e152d3c8a6f3ca7e464f954f9e856-1600x663.png" alt="" /><p>2. Incluez le nom de la variable dans votre requête ES|QL.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd631ad49bbb93c3e/6a17ee75e9ea87708ea9c6aa/9858442abb26d8d266d464852871b139fde63b89-1600x665.png" alt="" /><h3>Exemple 4 : variables pour les champs</h3><ol><li><p>Vous pouvez utiliser le type de contrôle « Static values » (Valeurs statiques) et indiquer les noms des champs que vous souhaitez. Le nom de variable doit commencer par « ??… » pour les champs.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29079f2b85c7239c/6a17ee77b1e113328f79f30b/33534c3df2fae024b25c28b4aed5d742e54202a2-1600x710.png" alt="" /><p>2. Référencez la variable souhaitée dans la requête de visualisation.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ca73c08dfa27319/6a17ee780b0bed31e8dd363a/71cdf3e9df72c59d957628a3aa6e4aa9bd60d6d5-1600x676.png" alt="" /><h2>Contrôles variables dans Discover</h2><p>Les contrôles variables ne sont pas seulement une fonctionnalité du tableau de bord. Ils sont également disponibles directement dans l'éditeur ES|QL de Discover. Vous pouvez créer des contrôles pour accélérer l'exploration des données dans Discover, les intégrer au tableau de bord et inversement.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40c9ce5eed7ded45/6a17ee7b420229747b29f684/fdddeec902d0bc746caed9276d01d7d48793dd85-1600x709.png" alt="" /><h2>Détails techniques</h2><p>Vous avez probablement remarqué que les contrôles de variables sont assortis de quelques règles, telles que les éléments d'une requête auxquels ils peuvent faire référence et les préfixes que vous devez utiliser (« ?... » pour les valeurs et « ??... » pour les champs ou les fonctions). En effet, les variables ne sont pas de simples remplacements de chaînes effectués sur le client. Ce sont des éléments essentiels du langage de requête (connus sous le nom de <a href="https://www.elastic.co/docs/solutions/search/agent-builder/tools/esql-tools#parameter-types">paramètres dans ES|QL</a>).</p><p></p><p>Cette conception apporte de grands avantages. D'une part, Kibana peut comprendre le contexte de chaque variable, ce qui nous permet de générer et de pré-remplir automatiquement sa configuration pour vous. C’est aussi beaucoup plus sécurisé : le langage valide strictement les entrées variables et empêche ainsi les injections malveillantes tout en signalant toute erreur. De plus, il améliore les performances et la stabilité en transférant la validation complexe et la gestion des erreurs vers le serveur plutôt que vers le client. Une note sur les performances : une bonne pratique consiste à créer des variables qui incluent des requêtes rapides, car elles se chargent avant le tableau de bord. Ainsi, des requêtes lentes peuvent affecter les performances globales du tableau de bord.</p><p>Bien sûr, cette architecture présente aussi quelques <a href="https://www.elastic.co/docs/solutions/search/agent-builder/limitations-known-issues#esql-limitations">limites</a>, pour le moment. Les variables ne prennent pas encore en charge l'option « Tout » pour le filtrage, et elles ne peuvent actuellement pas être utilisées avec certains opérateurs tels que <code>LIKE</code>ou <code>FROM</code> (pour changer de source de données). La bonne nouvelle ? Nous travaillons activement à l'ajout de ces fonctionnalités.</p><h2>Ce que l'avenir réserve aux contrôles</h2><p>Nous ne nous arrêtons pas là ! Parmi les améliorations que nous suivons de près, citons :</p><p>✨ La possibilité de placer des contrôles n'importe où sur le tableau de bord</p><p>✨ Chaînage de vos contrôles, ce qui signifie que la sortie d'un contrôle devient l'entrée du suivant</p><p>✨ De meilleures options de sélection comme la sélection « Tout » pour les variables</p><p>✨ Nouveaux types de contrôle (contrôle de type rechercher et variables pour vos sources de données)</p><p>✨ Et d'autres améliorations de l'expérience utilisateur que vous avez demandées, comme le pré-filtrage des contrôles normaux</p><p>Si vous avez des idées ou des commentaires, n'hésitez pas à nous en faire part.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-interactivity-variable-controls-overview</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-interactivity-variable-controls-overview</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[analytique]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltddeea5af6d4f9884/6a17ee7ddbb4ff3aa8fb5781/59aa3adffc8c759e42b961ef7d63719ce232893a-1348x830.png" length="0" type="image/png"/>
    <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Tableaux de bord alimentés par l'IA : D'une vision à Kibana]]></title>
    <description><![CDATA[Générer un tableau de bord en utilisant un LLM pour traiter une image et la transformer en tableau de bord Kibana.
]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/kibana/kibana-lens">Kibana Lens</a> simplifie le glisser-déposer des tableaux de bord, mais lorsque vous avez besoin de dizaines de panneaux, les clics s'accumulent. Et si vous pouviez dessiner un tableau de bord, en faire une capture d'écran et laisser un LLM terminer tout le processus à votre place ?</p><p>Dans cet article, nous allons y parvenir. Nous allons créer une application qui prend une image d'un tableau de bord, analyse nos mappings et génère un tableau de bord sans que nous ayons à toucher à Kibana !</p><p><strong>Les étapes</strong>:</p><ol><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#background-&amp;-application-workflow">Contexte &amp; flux de travail de l'application</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#prepare-data">Préparer les données</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#llm-configuration">Configuration LLM</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#application-functions">Fonctions d'application</a></p></li></ol><h2>Contexte &amp; flux de travail de l'application</h2><p>La première idée qui m'est venue à l'esprit a été de laisser le LLM générer l'ensemble des <a href="https://www.elastic.co/docs/explore-analyze/find-and-organize/saved-objects">objets sauvegardés au</a> format NDJSON dans Kibana, puis de les importer dans Kibana.</p><p>Nous avons essayé une poignée de modèles :</p><ul><li><p>Gemini 2.5 pro</p></li><li><p>GPT o3 / o4-mini-high / 4.1</p></li><li><p>Sonnet de Claude 4</p></li><li><p>Grok 3</p></li><li><p>Deepseek (Deepthink R1)</p></li></ul><p>En ce qui concerne les messages-guides, nous avons commencé par une phrase simple :</p>You are an Elasticsearch Saved-Object generator (Kibana 9.0).
INPUTS
=====
1. PNG screenshot of a 4-panel dashboard (attached).
2. Index mapping (below) – trimmed down to only the fields present in the screenshot.
3. Example NDJSON of *one* metric visualization (below) for reference.

TASK
====
Return **only** a valid NDJSON array that recreates the dashboard exactly:
* 2 metric panels (Visits, Unique Visitors)
* 1 pie chart (Most used OS)
* 1 vertical bar chart (State Geo Dest)
* Use index pattern `kibana_sample_data_logs`.
* Preserve roughly the same layout (2×2 grid).
* Use `panelIndex` values 1-4 and random `id` strings.
* Kibana version: 9.0<p>Bien que nous ayons parcouru des <a href="https://www.elastic.co/search-labs/blog/function-calling-with-elastic#:~:text=Few%2Dshot%20prompting%20involves%20providing%20examples%20of%20the%20types%20of%20queries%20you%20want%20it%20to%20return%2C%20which%20helps%20in%20increasing%20consistency.">exemples en quelques images</a> et des explications détaillées sur la manière de construire chaque visualisation, nous n'avons pas eu de chance. Si vous êtes intéressé par cette expérimentation, vous pouvez trouver des détails <a href="https://gist.github.com/TomasMurua/a78dc283e115624731beffc98984b70b">ici.</a></p><p>Le résultat de cette approche était l'apparition de ces messages lorsque l'on essayait de télécharger vers Kibana les fichiers produits par le LLM :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9ea005966a783057/6a1707d266c4f90e4ef8bf88/2b599443b5613c9f0fc3235581614add5b4b3900-891x98.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e5632d6d95b998c/6a1707d3a6c2b9441de79661/d87ccfc033bc00ee8188c5cae18043fbca22784c-741x233.png" alt="" /><p>Cela signifie que le JSON généré est invalide ou mal formaté. Les problèmes les plus fréquents étaient que le LLM produisait des NDJSON incomplets, des paramètres hallucinants ou retournait du JSON normal au lieu de NDJSON, même si nous essayions de faire en sorte qu'il en soit autrement.</p><p>Inspirés par <a href="https://www.elastic.co/search-labs/blog/llm-functions-elasticsearch-intelligent-query">cet article</a> - où les <a href="https://www.elastic.co/docs/solutions/search/search-templates">modèles de recherche</a> ont mieux fonctionné que le LLM freestyle - nous avons décidé de donner des modèles au LLM au lieu de demander de générer le fichier NDJSON complet et ensuite nous, dans le code, utilisons les paramètres donnés par le LLM pour créer les visualisations appropriées.</p><p>Le processus de candidature sera le suivant :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f7738a4c7ddd0cd/6a1707d52b835f0a25f4b166/52c587cf0cf3517fdd4ee7ab95581dd4f2bce030-725x668.png" alt="" /><p></p><p><em>Nous omettons une partie du code pour des raisons de simplicité, mais vous pouvez trouver le code de travail de l'application complète sur </em><a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/from-image-idea-to-kibana-dashboard-using-ai.ipynb"><em><strong>ce</strong></em></a><em> carnet.</em></p><h2>Produits requis</h2><p>Avant de commencer à développer, vous aurez besoin des éléments suivants :</p><ol><li><p>Python 3.8 ou supérieur</p></li><li><p>Un environnement <a href="https://docs.python.org/3/library/venv.html">Venv</a> Python</p></li><li><p>Une instance Elasticsearch en cours d'exécution, ainsi que son point d'accès et sa clé API</p></li><li><p>Une clé d'API OpenAI stockée dans la variable d'environnement OPENAI_API_KEY :</p></li></ol>export OPENAI_API_KEY="your-openai-api-key"<h2>Préparer les données</h2><p>Pour les données, nous resterons simples et utiliserons les journaux web de l'échantillon Elastic. Pour savoir comment importer ces données dans votre cluster <a href="https://www.elastic.co/docs/manage-data/ingest/sample-data#add-sample-data-sets">, cliquez ici.</a></p><p>Chaque document contient des informations sur l'hôte qui a envoyé des demandes à l'application, ainsi que des informations sur la demande elle-même et l'état de sa réponse. Vous trouverez ci-dessous un exemple de document :</p>{
    "agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24",
    "bytes": 8509,
    "clientip": "70.133.115.149",
    "extension": "css",
    "geo": {
        "srcdest": "US:IT",
        "src": "US",
        "dest": "IT",
        "coordinates": {
            "lat": 38.05134111,
            "lon": -103.5106908
        }
    },
    "host": "cdn.elastic-elastic-elastic.org",
    "index": "kibana_sample_data_logs",
    "ip": "70.133.115.149",
    "machine": {
        "ram": 5368709120,
        "os": "osx"
    },
    "memory": null,
    "message": "70.133.115.149 - - [2018-08-30T23:35:31.492Z] \"GET /styles/semantic-ui.css HTTP/1.1\" 200 8509 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"",
    "phpmemory": null,
    "referer": "http://twitter.com/error/john-phillips",
    "request": "/styles/semantic-ui.css",
    "response": 200,
    "tags": [
        "success",
        "info"
    ],
    "@timestamp": "2025-07-03T23:35:31.492Z",
    "url": "https://cdn.elastic-elastic-elastic.org/styles/semantic-ui.css",
    "utc_time": "2025-07-03T23:35:31.492Z",
    "event": {
        "dataset": "sample_web_logs"
    },
    "bytes_gauge": 8509,
    "bytes_counter": 51201128
}<p>Prenons maintenant les mappings de l'index que nous venons de charger, <code>kibana_sample_data_logs</code>:</p>INDEX_NAME = "kibana_sample_data_logs"

es_client = Elasticsearch(
    [os.getenv("ELASTICSEARCH_URL")],
    api_key=os.getenv("ELASTICSEARCH_API_KEY"),
)

result = es_client.indices.get_mapping(index=INDEX_NAME)
index_mappings = result[list(result.keys())[0]]["mappings"]["properties"]<p>Nous allons transmettre les mappings avec l'image que nous chargerons plus tard.</p><h2>Configuration LLM</h2><p>Configurons le LLM pour qu'il utilise la <a href="https://python.langchain.com/docs/concepts/structured_outputs/">sortie structurée</a> afin d'entrer une image et de recevoir un JSON contenant les informations que nous devons transmettre à notre fonction pour produire les objets JSON.</p><p>Nous installons les dépendances :</p>pip install elasticsearch pydantic langchain langchain-openai -q<p>Elasticsearch nous aidera à récupérer les <a href="https://www.elastic.co/docs/manage-data/data-store/mapping">mappages d'index</a>. Pydantic nous permet de définir des schémas en Python pour demander au LLM de les suivre, et <a href="https://www.elastic.co/search-labs/integrations/langchain">LangChain</a> est le cadre qui facilite l'appel aux LLM et aux outils d'IA.</p><p>Nous allons créer un schéma pydantique pour définir les résultats que nous voulons obtenir du LLM. Ce que nous devons savoir à partir de l'image, c'est le type de graphique, le champ, le titre de la visualisation et le titre du tableau de bord :</p>class Visualization(BaseModel):
    title: str = Field(description="The dashboard title")
    type: List[Literal["pie", "bar", "metric"]]
    field: str = Field(
        description="The field that this visualization use based on the provided mappings"
    )


class Dashboard(BaseModel):
    title: str = Field(description="The dashboard title")
    visualizations: List[Visualization]<p>Pour la saisie de l'image, nous enverrons un tableau de bord que je viens de dessiner :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7870f6421986d11d/6a1707d78b73cb3408189fa3/36441d7b5dc1f3ff2ac2a30710208d57ad41c716-1600x898.jpg" alt="" /><p>Nous déclarons maintenant l'appel au modèle LLM et le chargement de l'image. Cette fonction recevra les mappings de l'index Elasticsearch et une image du tableau de bord que nous voulons générer.</p><p>Avec <code>with_structured_output</code>, nous pouvons utiliser notre schéma Pydantic <code>Dashboard</code> comme objet de réponse que le LLM produira. Avec <a href="https://docs.pydantic.dev/latest/">Pydantic</a>, nous pouvons définir des modèles de données avec validation, ce qui garantit que la sortie LLM correspond à la structure attendue.</p><p>Pour convertir l'image en base64 et l'envoyer en entrée, vous pouvez utiliser un <a href="https://www.base64-image.de/">convertisseur en ligne</a> ou le faire <a href="https://www.geeksforgeeks.org/python-convert-image-to-string-and-vice-versa/">en code</a>.</p>prompt = f"""
    You are an expert in analyzing Kibana dashboards from images for the version 9.0.0 of Kibana.

    You will be given a dashboard image and an Elasticsearch index mapping.

    Below are the index mappings for the index that the dashboard is based on.
    Use this to help you understand the data and the fields that are available.

    Index Mappings:
    {index_mappings}

    Only include the fields that are relevant for each visualization, based on what is visible in the image.
    """

message = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": prompt},
            {
                "type": "image",
                "source_type": "base64",
                "data": image_base64,
                "mime_type": "image/png",
            },
        ],
    }
]


try:
    llm = init_chat_model("gpt-4.1-mini")
    llm = llm.with_structured_output(Dashboard)
    dashboard_values = llm.invoke(message)

    print("Dashboard values generated by the LLM successfully")
    print(dashboard_values)
except Exception as e:
    print(f"Failed to analyze image and match fields: {str(e)}")<p>Le LLM connaît déjà le contexte des tableaux de bord Kibana, nous n'avons donc pas besoin de tout expliquer dans l'invite, juste quelques détails pour s'assurer qu'il n'oublie pas qu'il travaille avec Elasticsearch et Kibana.</p><p>Décortiquons l'invitation :</p><p>Section</p><p>Raison</p><p>Vous êtes un expert en analyse de tableaux de bord Kibana à partir d'images pour la version 9.0.0 de Kibana.</p><p>En insistant sur le fait qu'il s'agit d'Elasticsearch et de la version d'Elasticsearch, nous réduisons la probabilité que le LLM hallucine des paramètres anciens/invalides.</p><p>Vous recevrez une image de tableau de bord et un mappage d'index Elasticsearch.</p><p>Nous expliquons que l'image concerne les tableaux de bord afin d'éviter toute interprétation erronée de la part du LLM.</p><p>Vous trouverez ci-dessous les correspondances d'index pour l'index sur lequel le tableau de bord est basé, ce qui vous aidera à comprendre les données et les champs disponibles. Mappages d'index : {index_mappings}</p><p>Il est essentiel de fournir les correspondances afin que le LLM puisse sélectionner les champs valides de manière dynamique. Sinon, nous pourrions coder en dur les correspondances ici, ce qui est trop rigide, ou compter sur le fait que l'image contienne les bons noms de champs, ce qui n'est pas fiable.</p><p>N'incluez que les champs pertinents pour chaque visualisation, en fonction de ce qui est visible dans l'image.</p><p>Nous avons dû ajouter ce renforcement parce qu'il arrive que l'on essaie d'ajouter des champs qui ne sont pas pertinents pour l'image.</p><p>Cela renvoie un objet contenant un tableau de visualisations à afficher :</p>"Dashboard values generated by the LLM successfully
title=""Client, Extension, OS, and Response Keyword Analysis""visualizations="[
   "Visualization(title=""Count of Client IP",
   "type="[
      "metric"
   ],
   "field=""clientip"")",
   "Visualization(title=""Extension Keyword Distribution",
   "type="[
      "pie"
   ],
   "field=""extension.keyword"")",
   "Visualization(title=""Most Used OS",
   "type="[
      "bar"
   ],
   "field=""machine.os.keyword"")",
   "Visualization(title=""Response Keyword Distribution",
   "type="[
      "bar"
   ],
   "field=""response.keyword"")"
]<h2>Traitement de la réponse au mécanisme d'apprentissage tout au long de la vie</h2><p>Nous avons créé un exemple de tableau de bord 2x2 panneaux à l'adresseet l'avons exporté en JSON à l'aide de l'<a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-get-dashboards-dashboard">API Get a dashboard</a>, puis nous avons stocké les panneaux en tant que modèles de visualisation (camembert, barre, métrique) dans lesquels nous pouvons remplacer certains paramètres pour créer de nouvelles visualisations avec différents champs en fonction de la question.</p><p>Vous pouvez consulter les fichiers JSON du modèle <a href="https://github.com/Delacrobix/elasticsearch-labs/tree/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/templates"><strong>ici.</strong></a> Notez que nous avons modifié les valeurs de l'objet que nous voulons remplacer plus tard par {<code>variable_name</code>}
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc55d69d84a08e668/6a1707d8a2929903acd00fb8/ec7e1ac0cd8b470df13e60940162b56778acb386-315x234.png" alt="" /><p>Grâce aux informations fournies par le mécanisme d'apprentissage tout au long de la vie, nous pouvons décider du modèle à utiliser et des valeurs à remplacer.</p><p><code>fill_template_with_analysis</code> recevra les paramètres pour un seul panneau, y compris le modèle JSON de la visualisation, un titre, un champ et les coordonnées de la visualisation sur la grille.</p><p>Ensuite, il remplacera les valeurs du modèle et renverra la visualisation JSON finale.</p>def fill_template_with_analysis(
    template: Dict[str, Any],
    visualization: Visualization,
    grid_data: Dict[str, Any],
):
    template_str = json.dumps(template)
    replacements = {
	 "{visualization_id}": str(uuid.uuid4()),
        "{title}": visualization.title,
        "{x}": grid_data["x"],
        "{y}": grid_data["y"],
    }

    if visualization.field:
        replacements["{field}"] = visualization.field

    for placeholder, value in replacements.items():
        template_str = template_str.replace(placeholder, str(value))

    return json.loads(template_str)<p>Pour faire simple, nous aurons des coordonnées statiques que nous assignerons aux panneaux que le LLM décidera de créer et nous produirons un tableau de bord à grille 2x2 comme l'image ci-dessus.</p># Filling templates fields
panels = []    
grid_data = [
    {"x": 0, "y": 0},
    {"x": 12, "y": 0},
    {"x": 0, "y": 12},
    {"x": 12, "y": 12},
]


i = 0

for vis in dashboard_values.visualizations:
    for vis_type in vis.type:
        template = templates.get(vis_type, templates.get("bar", {}))
        filled_panel = fill_template_with_analysis(template, vis, grid_data[i])
        panels.append(filled_panel)
        i += 1<p>En fonction du type de visualisation décidé par le LLM, nous choisirons un modèle de fichier JSON et remplacerons les informations pertinentes à l'aide de <code>fill_template_with_analysis</code> , puis nous ajouterons le nouveau panneau à un tableau que nous utiliserons ultérieurement pour créer le tableau de bord.</p><p>Lorsque le tableau de bord est prêt, nous utilisons l'<a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-dashboards-dashboard-id">API Create a dashboard</a> pour envoyer le nouveau fichier JSON à Kibana afin de générer le tableau de bord :
</p>try:
    dashboard_id = str(uuid.uuid4())

    # post request to create the dashboard endpoint
    url = f"{os.getenv('KIBANA_URL')}/api/dashboards/dashboard/{dashboard_id}"

    dashboard_config = {
        "attributes": {
            "title": dashboard_values.title,
            "description": "Generated by AI",
            "timeRestore": True,
            "panels": panels,  # Visualizations with the values generated by the LLM
            "timeFrom": "now-7d/d",
            "timeTo": "now",
        },
    }

    headers = {
        "Content-Type": "application/json",
        "kbn-xsrf": "true",
        "Authorization": f"ApiKey {os.getenv('ELASTICSEARCH_API_KEY')}",
    }

    requests.post(
        url,
        headers=headers,
        json=dashboard_config,
    )

    # Url to the generated dashboard
    dashboard_url = f"{os.getenv('KIBANA_URL')}/app/dashboards#/view/{dashboard_id}"

    print("Dashboard URL: ", dashboard_url)
    print("Dashboard ID: ", dashboard_id)

except Exception as e:
    print(f"Failed to create dashboard: {str(e)}")<p>Pour exécuter le script et générer le tableau de bord, exécutez la commande suivante dans la console :</p>python &lt;file_name&gt;.py<p>Le résultat final sera le suivant :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ceffed004153a4f/6a1707d9a929cf9147ae0901/e909afbf0e47d9a6e0f7bd07dfb2efcfa5cf06ac-921x715.png" alt="" /><h2>Conclusion</h2><p>Les LLM démontrent leurs fortes capacités visuelles lorsqu'ils transforment du texte en code ou des images en code. L'API des tableaux de bord permet également de transformer des fichiers JSON en tableaux de bord, et avec un LLM et un peu de code, nous pouvons transformer des images en tableau de bord Kibana.</p><p>L'étape suivante consiste à améliorer la flexibilité des visuels des tableaux de bord en utilisant différents paramètres de grille, différentes tailles de tableau de bord et différentes positions. De plus, la prise en charge de visualisations et de types de visualisation plus complexes serait un ajout utile à cette application.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-powered-dashboards</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-powered-dashboards</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[IA]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo,Tomás Murúa]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt41727cbee6155a68/6a1707dbb0367dd2fd72bc86/eb60ceb2fbc3941745b21ae3357cbb6ea8fab18c-1443x811.png" length="0" type="image/png"/>
    <pubDate>Wed, 16 Jul 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Spotify Wrapped partie 2 : Analyse et visualisation des données]]></title>
    <description><![CDATA[Nous allons plonger plus profondément que jamais dans vos données Spotify et explorer des connexions dont vous ne soupçonniez même pas l'existence.]]></description>
    <content:encoded><![CDATA[<p>Dans la <a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">première partie</a> de cette série, écrite par Iulia Feroli, nous avons expliqué comment obtenir vos données Spotify Wrapped et les visualiser dans Kibana. Dans la deuxième partie, nous approfondirons les données pour voir ce que nous pouvons découvrir d'autre. Pour ce faire, nous allons utiliser une approche un peu différente et utiliser <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify to Elasticsearch</a> pour indexer les données dans Elasticsearch. Cet outil est un peu plus avancé et nécessite un peu plus d'installation, mais il en vaut la peine. Les données sont plus structurées et nous pouvons poser des questions plus complexes.</p><h2>Différences par rapport à la première analyse Spotify Wrapped</h2><p>Dans le premier blog, nous avons utilisé l'export Spotify directement et n'avons effectué aucune tâche de normalisation ni aucun autre traitement de données. Cette fois-ci, nous utiliserons les mêmes données, mais nous les traiterons pour les rendre plus utilisables. Cela nous permettra de répondre à des questions beaucoup plus complexes, comme par exemple :</p><ul><li><p>Quelle est la durée moyenne d'une chanson dans mon top 100 ?</p></li><li><p>Quelle est la popularité moyenne d'une chanson dans mon top 100 ?</p></li><li><p>Quelle est la durée médiane d'écoute d'une chanson ?</p></li><li><p>Quelle est la piste que je saute le plus souvent ?</p></li><li><p>Quand est-ce que j'aime sauter des pistes ?</p></li><li><p>Suis-je plus attentif à une heure particulière de la journée qu'à d'autres ?</p></li><li><p>Est-ce que j'écoute plus un jour de la semaine que les autres ?</p></li><li><p>S'agit-il d'un mois particulièrement intéressant ?</p></li><li><p>Quel est l'artiste dont la durée d'écoute est la plus longue ?</p></li></ul><p>Spotify Wrapped est une expérience amusante chaque année, vous montrant ce que vous avez écouté cette année. Il n'indique pas les changements d'une année sur l'autre, et il se peut donc que vous passiez à côté d'artistes qui figuraient autrefois dans votre top 10, mais qui ont maintenant disparu.</p><h2>Traitement des données Spotify Wrapped pour analyse</h2><p>Il y a une grande différence dans la façon dont nous traitons les données dans le premier et le second message. Si vous souhaitez continuer à travailler avec les données du premier message, vous devrez tenir compte de certains changements de noms de champs et revenir à ES|QL pour effectuer certaines extractions comme <code>hour of day</code> à la volée.</p><p>Néanmoins, vous devriez tous être en mesure de suivre ce message. Le traitement des données est effectué dans le référentiel <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify to Elasticsearch</a> et consiste à demander à l'API Spotify la durée de la chanson, la popularité, ainsi qu'à renommer et à enrichir certains champs. Par exemple, le champ <code>artist</code> dans l'export Spotify n'est qu'une chaîne de caractères et ne représente pas les fonctionnalités ou les titres multi-artistes.</p><h2>Visualiser les données de Spotify Wrapped avec des tableaux de bord</h2><p>J'ai créé un tableau de bord dans Kibana pour visualiser les données. Le tableau de bord est disponible <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">ici</a> et vous pouvez l'importer dans votre instance Kibana. Le tableau de bord est très complet et répond à de nombreuses questions.</p><p>Examinons quelques-unes de ces questions et la manière d'y répondre ensemble !</p><h3>Quelle est la durée moyenne d'une chanson dans mon top 100 ?</h3><p>Pour répondre à cette question, nous pouvons utiliser Lens ou ES|QL. Explorons ces trois options. Formulons cette question correctement à la manière d'Elasticsearch. Nous voulons trouver les 100 chansons les plus populaires et calculer la durée moyenne de toutes ces chansons combinées. En termes d'Elasticsearch, il s'agit de deux agrégations :</p><ol><li><p>Déterminer les 100 chansons les plus populaires</p></li><li><p>Calculez la durée moyenne de ces 100 chansons.</p></li></ol><p><strong>Lens</strong></p><p>Dans Lens, c'est assez simple : créez un nouveau Lens, passez à une table et glissez-déposez le champ <code>title</code> dans la table. Cliquez ensuite sur le champ <code>title</code> et fixez la taille à 100, ainsi que le mode <code>accuracy</code>. Faites ensuite glisser le champ <code>duration</code> dans la table et utilisez <code>last value</code>, car nous n'avons besoin que de la dernière valeur de la durée de chaque chanson. Une même chanson n'aura qu'une seule durée. Au bas de cette agrégation <code>last value</code> se trouve un menu déroulant permettant d'obtenir une ligne de résumé. Sélectionnez <code>average</code> et vous obtiendrez le résumé.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="Utilisation de Lens pour les données enveloppées de Spotify" /><p><strong>ES|QL</strong></p><p>ES|QL est un langage assez récent par rapport aux agrégations DSL &amp;, mais il est très puissant et facile à utiliser. Pour répondre à la même question en ES|QL, vous devez écrire la requête suivante :</p><p>Laissez-moi vous guider pas à pas dans cette requête ES|QL :</p><ol><li><p><code>from spotify-history</code> - C'est le modèle d'index que nous utilisons.</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - Il s'agit de la première agrégation, nous calculons la durée maximale de chaque chanson et le nombre de chansons. Nous utilisons <code>max</code> au lieu de <code>last value</code> comme dans la lentille, parce que ES|QL n'a pas de prénom ni de nom de famille.</p></li><li><p><code>sort count desc</code> - Nous trions les chansons en fonction du nombre d'écoutes, de sorte que la chanson la plus écoutée se trouve en haut de la liste.</p></li><li><p><code>limit 100</code> - Nous limitons le résultat aux 100 premières chansons.</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - Nous calculons la durée moyenne des chansons.</p></li></ol><h3>Un mois présente-t-il un intérêt particulier pour moi ?</h3><p>Pour répondre à cette question, nous pouvons utiliser Lens avec l'aide du champ d'exécution et ES|QL. Nous remarquons tout de suite qu'il n'y a pas de champ dans les données qui indique directement <code>month</code>, mais que nous devons le calculer à partir du champ <code>@timestamp</code>. Il y a plusieurs façons de procéder :</p><ol><li><p>Utiliser un champ d'exécution pour alimenter la lentille</p></li><li><p>ES|QL</p></li></ol><p>Je pense personnellement que ES|QL est la solution la plus propre et la plus rapide.</p><p>C'est tout, il n'y a rien d'extraordinaire à faire, nous pouvons utiliser la fonction <code>DATE_EXTRACT</code> pour extraire le mois du champ <code>@timestamp</code> et ensuite l'agréger. En utilisant la visualisation ES|QL, nous pouvons l'intégrer au tableau de bord.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Visualisation de la répartition mensuelle de Spotify Wrapped" /><h3>Quelle est ma durée d'écoute par artiste et par an ?</h3><p>L'idée sous-jacente est de voir si un artiste n'est qu'un phénomène ponctuel ou s'il est récurrent. Si je me souviens bien, Spotify n'affiche que les 5 premiers artistes de l'année. Peut-être que votre artiste numéro 6 reste le même tout le temps, ou qu'il change fortement après la 10e position ?</p><p>L'une des représentations les plus simples est le diagramme à barres en pourcentage. Nous pouvons utiliser Lens à cette fin. Suivez les étapes :</p><p>Faites glisser et déposez le champ <code>listened_to_ms</code>. Ce champ représente la durée d'écoute d'une chanson en millisecondes. Par défaut, Lens crée une agrégation <code>median</code>, ce que nous ne voulons pas, mais plutôt <code>sum</code>. Dans la partie supérieure, sélectionnez <code>percentage</code> au lieu de <code>stacked</code> pour le type de diagramme à barres. Pour la répartition, sélectionnez <code>artist</code> et dites top 10. Dans la liste déroulante <code>Advanced</code>, n'oubliez pas de sélectionner <code>accuracy mode</code>. Désormais, chaque bloc de couleur représente le nombre de fois où vous avez écouté cet artiste. En fonction de votre marqueur temporel, les barres peuvent représenter des valeurs de jours, de semaines, de mois ou d'années. Si vous souhaitez un décompte hebdomadaire, sélectionnez le site <code>@timestamp</code> et réglez le site <code>mininum interval</code> sur <code>year</code>. Dans mon cas, on peut dire que <code>Fred Again..</code> est l'artiste que j'ai le plus écouté, près de 12% de mon temps d'écoute total ayant été consommé par <code>Fred Again..</code>. Nous constatons également que <code>Fred Again..</code> a légèrement diminué en 2024, mais que <code>Jamie XX</code> a largement progressé. Si l'on compare uniquement la taille des barres. Nous pouvons également constater que pendant que <code>Billie Eilish</code> est constamment joué dans 2024, le bar s'élargit. Cela signifie que j'ai écouté <code>Billie Eilish</code> plus en 2024 qu'en 2023.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="Visualisation de l'historique de Spotify Wrapped avec Kibana" /><h3>Qu'en est-il des meilleurs titres par artiste et par durée d'écoute par rapport à la durée d'écoute totale ?</h3><p>C'est une question qui a de la gueule. Permettez-moi d'essayer d'expliquer ce que je veux dire par là. Spotify vous informe sur la meilleure chanson d'un artiste, ou sur vos 5 meilleures chansons. C'est très intéressant, mais qu'en est-il de la décomposition d'un artiste ? Est-ce que tout mon temps est consommé par une seule chanson que je joue encore et encore, ou est-ce que ce temps est réparti de manière égale ?</p><p>Créez un nouvel objectif et sélectionnez <code>Treemap</code> comme type. Pour <code>metric</code>, même chose que précédemment : sélectionnez <code>sum</code> et utilisez <code>listened_to_ms</code> comme champ. Pour le site <code>group by</code>, nous avons besoin de deux valeurs. Le premier est <code>artist</code> et le second est <code>title</code>. Le résultat intermédiaire est le suivant :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="Visualisation de l'historique de Spotify Wrapped avec Kibana" /><p>Changeons cela pour le top 100 des artistes et désélectionnons le <code>other</code> dans le menu déroulant avancé, ainsi que l'activation du mode précision. Pour le titre, modifiez-le en top 10 et activez le mode précision. Le résultat final est le suivant :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="Visualisation de Spotify Wrapped avec Kibana" /><p>Qu'est-ce que cela nous apprend exactement ? Sans tenir compte de la durée, on peut dire que sur l'ensemble de mon historique d'écoute avec Spotify, j'ai passé 5,67% à écouter <code>Fred Again..</code>. En particulier, j'ai passé 1,21% de ce temps à écouter <code>Delilah (pull me out of this)</code>. Il est intéressant de voir s'il y a une seule chanson qui occupe un artiste, ou s'il y a aussi d'autres chansons. La carte arborescente elle-même est une forme agréable pour représenter de telles distributions de données.</p><h3>Est-ce que j'écoute à une heure et à un jour précis ?</h3><p>Nous pouvons répondre à cette question de manière très simple grâce à une visualisation de la lentille qui exploite le site <code>Heat Map</code>. Créez un nouvel objectif, sélectionnez <code>Heat Map</code>. Pour le champ <code>Horizontal Axis</code> select <code>dayOfWeek</code>, définissez <code>Top 7</code> au lieu de Top 3. Pour le <code>Vertical Axis</code>, sélectionnez le <code>hourOfDay</code> et pour le <code>Cell Value</code>, un simple <code>Count of records</code>. Cette opération permet d'obtenir ce panneau :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="Visualisation des habitudes d'écoute de Spotify Wrapped à l'aide de tableaux de bord" /><p>Il y a deux ou trois choses ennuyeuses autour de cette lentille, qui me dérangent lors de l'interprétation. Essayons d'y mettre un peu d'ordre. Tout d'abord, je ne me soucie pas trop de la légende, utilisez le symbole en haut avec le triangle, le carré, le cercle et désactivez-le.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Spotify visualisation enveloppée " /><p>La deuxième partie qui est gênante est le tri des jours. C'est lundi, mercredi, jeudi, ou autre chose, selon les valeurs que vous avez. Le site <code>hourOfDay</code> est correctement trié. La façon de trier les jours est une astuce amusante qui consiste à utiliser <code>Filters</code> au lieu de <code>Top Values</code>. Cliquez sur <code>dayOfWeek</code> et sélectionnez <code>Filters</code>, cela devrait ressembler à ceci :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="Visualisation de l'historique de Spotify Wrapped avec Kibana Dashboards" /><p>Il ne vous reste plus qu'à taper les jours. Un filtre par jour. <code>"dayOfWeek" : Monday</code> et lui attribuer le label <code>Monday</code>, puis rincer et répéter.</p><p>Un bémol cependant : Spotify fournit les données en UTC+0 sans aucune information sur le fuseau horaire. Bien sûr, ils fournissent également l'adresse IP et le pays où vous avez écouté et nous pourrions en déduire les informations relatives au fuseau horaire, mais cela peut s'avérer bancal et pour des pays comme les États-Unis qui ont plusieurs fuseaux horaires, cela peut s'avérer trop fastidieux. C'est important car Elasticsearch et Kibana prennent en charge les fuseaux horaires et en fournissant le bon fuseau horaire dans le champ <code>@timestamp</code>, Kibana ajustera automatiquement l'heure à celle de votre navigateur.</p><p>Il devrait ressembler à ceci lorsqu'il sera finalisé, et on peut dire que je suis un auditeur très actif pendant les heures de travail et moins le samedi et le dimanche.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="Visualisation de Spotify Wrapped avec Kibana Dashboards" /><h2>Conclusion</h2><p>Dans ce blog, nous avons approfondi les subtilités des données de Spotify. Nous avons montré quelques moyens simples et rapides de mettre en place des visualisations. Il est tout simplement incroyable d'avoir autant de contrôle sur son propre historique d'écoute. Consultez les autres parties de la série :</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">Partie 1 : Comment créer son propre Spotify Wrapped dans Kibana</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">Partie 3 : Emplois de la population pour la détection des anomalies</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">Partie 4 : Détecter les relations dans les données</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">Partie 5 : Trouver son meilleur ami musical avec les vecteurs</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[analytique]]></category>
    <dc:creator><![CDATA[Philipp Kahr]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f8cddbca1a54cd5/6a17e5efe9ea87717ba9c585/e04f85e87b5b4e69b6e2df9367840a56985b96a1-1792x1024.png" length="0" type="image/png"/>
    <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Tester DeepSeek R1 localement pour RAG avec Ollama et Kibana]]></title>
    <description><![CDATA[Apprenez à exécuter une instance locale de DeepSeek et à vous y connecter depuis Kibana.]]></description>
    <content:encoded><![CDATA[<p>Le nouveau grand modèle de langage DeepSeek R1, développé par le fonds d’investissement chinois High-Flyer, fait beaucoup parler de lui. On spécule beaucoup dans les médias sur les implications pour l’industrie depuis qu’ils ont présenté un grand modèle de langage capable de raisonnement par chaîne de pensée avec des poids ouverts. Si vous êtes curieux d’utiliser ce nouveau modèle avec la RAG et toutes les capacités de base de données vectorielle d’Elasticsearch, ce tutoriel rapide vous montrera comment commencer avec DeepSeek R1 en utilisant l’inférence locale. Au fil du processus, nous allons utiliser l’outil Playground d’Elastic. Nous découvrirons également les propriétés, bonnes ou mauvaises, de Deepseek R1 en matière de RAG.</p><p>Voici un diagramme de ce que nous allons configurer dans ce tutoriel :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3214cc505e3d4d06/6a17df98dbb4ff12bafb55da/8aafec9011e986cd85b10958544a4d77be81e518-739x419.png" alt="Configuration de Deepseek avec Elasticsearch et Ollama" /><h2>Configuration de l'inférence locale avec Ollama</h2><p><a href="https://ollama.com/">Ollama</a> est une excellente façon de tester rapidement un ensemble de modèles open source pour l’inférence locale. C'est un outil très apprécié des développeurs en IA.</p><h3>Lancer Ollama en natif</h3><p>Une <a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama">installation locale</a> sur Mac, Linux ou Windows est le moyen le plus facile d’utiliser les capacités GPU que vous pourriez avoir localement, en particulier pour ceux qui possèdent des puces Apple de la série M. Après avoir installé Ollama, vous pouvez télécharger et exécuter Deepseek R1 avec la commande ci-dessous.</p><p>Vous pourriez avoir besoin d’ajuster la taille des paramètres pour qu’elle corresponde à votre matériel. Vous trouverez les tailles disponibles <a href="https://ollama.com/library/deepseek-r1">ici</a>.</p>ollama run deepseek-r1:7b<p>Il est possible de discuter avec le modèle dans le terminal, mais il continue de fonctionner même lorsque vous quittez la commande avec CTRL+d ou que vous tapez « /bye ». Pour voir que le modèle continue de fonctionner, entrez :</p>ollama ps<h3>Exécution d'Ollama dans un conteneur</h3><p>Sinon, la façon la plus rapide de faire fonctionner Ollama est d’utiliser un moteur de conteneurs comme Docker. Si l’utilisation du GPU de votre machine locale n’est pas toujours simple, selon l’environnement, la mise en place d'une configuration de test rapide est simple tant que votre conteneur a assez de RAM et d’espace de stockage pour les modèles de plusieurs Go.</p><p>Pour faire fonctionner Ollama dans Docker, il suffit d'exécuter :</p>mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama
<p>Un répertoire « ollama » sera créé dans le dossier actuel, puis monté à l’intérieur du conteneur pour y conserver la configuration d’Ollama et les modèles. En fonction du nombre de paramètres employés, leur taille peut aller de quelques Go à plusieurs dizaines de Go, donc veillez à choisir un volume disposant d’un espace libre suffisant.</p><p>Remarque : si votre machine est équipée d'un GPU Nvidia, veillez à installer le <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation">kit d’outils de conteneur Nvidia</a> et à ajouter « --gpus=all » à la commande « docker run » ci-dessus.</p><p>Dès que le conteneur Ollama fonctionne sur votre machine, vous pouvez télécharger un modèle comme deepseek-r1 en utilisant :</p>docker exec -it ollama ollama pull deepseek-r1:7b<p>À l'instar de l'approche bare metal, il est possible que vous souhaitiez ajuster la taille des paramètres pour qu'elle corresponde à votre matériel. Les tailles disponibles sont indiquées sur le site <a href="https://ollama.com/library/deepseek-r1">https://ollama.com/library/deepseek-r1</a>.</p><p>Une fois que l'extraction du modèle est terminée, il vous suffit de taper « /bye » pour quitter le prompt. Pour vérifier que le modèle est toujours en cours d’exécution :</p>docker exec -it ollama ollama ps<h2>Tester notre inférence locale avec une commande curl</h2><p>Pour tester l'inférence locale avec curl, vous pouvez exécuter la commande suivante. Nous avons recours à stream:false pour faciliter la lecture de la réponse narrative au format JSON :</p>curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "prompt":"Why is Elastic so cool?"
}'<h2>Test d’Ollama compatible OpenAI et d’une invite de RAG</h2><p>Pour plus de commodité, Ollama offre également un point de terminaison REST qui imite l'interface d’OpenAI, ce qui le rend compatible avec un grand nombre d'outils, notamment Kibana.</p>curl http://localhost:11434/v1/chat/completions -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "messages": [
    { 
      "role": "system", 
      "content": "You are a helpful AI Assistant that uses the following context to answer questions only use the following context. \n\nContext:  The color of the sky today is purple. "},
    { "role": "user", 
      "content": "What does the sky look like today?" 
    }
  ]
}'<p>Le test de cette invite plus complexe produit un contenu qui comporte une partie dans laquelle le modèle a été entraîné pour trouver la solution au problème.</p>&lt;think&gt; 
Okay, so I need to figure out what the user is asking for here. They provided a context where the sky is described as purple today and then asked about how the sky looks. At first glance, it seems straightforward—maybe they just want confirmation or more details on why the sky is that color.
Wait, but maybe there's something deeper. Purple skies aren't something I encounter every day. It usually happens at certain times of the year, like during sunrise or sunset with the sun setting in pink or orange. Could this be a hint about the time of day? Or perhaps it's just an unusual natural phenomenon? 
I should consider if \"purple\" is a typo. Maybe they meant something else like blue or gray. But since they specifically said purple, I'll go with that. Purple skies can happen when there are atmospheric conditions that scatter light differently, maybe due to pollution or cloud cover affecting the sunset.

So, putting it all together, the user might be looking for an explanation of why today's sky is purple and what that implies about the weather or time of day. Alternatively, they could just want a simple statement confirming that the sky looks purple today.
&lt;/think&gt;

The color of the sky today is described as purple. This unusual shade can occur due to atmospheric conditions affecting light scattering, such as during sunrise/sunset with pollution or cloud cover influencing the sunset's hues.<h2>Connexion d'Ollama à Kibana</h2><p>Une excellente façon d’utiliser Elasticsearch est le script de développement « <a href="https://github.com/elastic/start-local?tab=readme-ov-file#-try-elasticsearch-and-kibana-locally">start-local</a> ».</p><p>Veillez à ce que votre Kibana et votre Elasticsearch soient en mesure d'atteindre votre Ollama sur le réseau. Si vous avez un environnement Elastic en conteneur local, vous devrez peut-être remplacer « localhost » par « host.docker.internal ». ou « host.conteneurs.internal » afin d’avoir un chemin réseau jusqu'à la machine hôte.</p><p>Dans Kibana, accédez à Stack Management &gt; Alertes et informations &gt; Connecteurs.</p><h3>Ce qu’il faut faire si cette alerte de configuration courante s'affiche</h3><p>Vous devrez vous assurer que xpack.encryptedSavedObjects.encryptionKey <a href="https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html">est correctement défini</a>. C'est une erreur courante lors de l'exécution d'une installation locale de Kibana sous Docker, c'est pourquoi je vais énumérer les étapes à suivre dans la syntaxe de Docker pour la corriger.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4f7b7be2e04afae/6a17df9a1d1b8391e293e393/b70b4b810bcac1d1599b07da90a98c5c744a38de-497x223.png" alt="" /><p>Pour que les modifications soient conservées à l’arrêt du conteneur, il faut que le répertoire kibana/config soit persistant. Mes volumes de conteneurs Kibana ressemblent à ceci dans docker-compose.yml :</p>services:
  kibana:
...
   volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
      - kibanaconfig:/usr/share/kibana/config
...
volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  kibanadata:
    driver: local
  kibanaconfig:
    driver: local<p>Vous pouvez à présent créer le keystore et y attribuer une valeur afin que les clés des connecteurs ne soient plus stockées en clair.</p>## generate some new keys for me and print them to the terminal
docker exec -it kibana_1 bin/kibana-encryption-keys generate

## create a new keystrore
docker exec -it kibana_1 bin/kibana-keystore create
docker exec -it kibana_1 bin/kibana-keystore add xpack.encryptedSavedObjects.encryptionKey

## You'll be prompted to paste in a value<p>Afin que les modifications soient appliquées, redémarrez l'ensemble de votre cluster.</p><h3>Création du connecteur</h3><p>Depuis l’écran de configuration du connecteur (dans Kibana, accédez à Stack Management &gt; Alertes et informations &gt; Connecteurs), créez un connecteur et sélectionnez le type « OpenAI ».</p><p>Configurez le connecteur avec les paramètres suivants</p><ul><li><p>Nom du connecteur : Deepseek (Ollama)</p></li><li><p>Sélectionnez un fournisseur OpenAI : autre (service compatible OpenAI)</p></li><li><p>URL : <a href="http://localhost:11434/v1/chat/completions">http://localhost:11434/v1/chat/completions</a></p><ul><li><p>Modifiez pour indiquer le bon chemin d'accès à votre ollama. Pensez à remplacer par host.docker.internal ou son équivalent si vous appelez depuis un conteneur.</p></li></ul></li><li><p>Modèle par défaut : deepseek-r1:7b</p></li><li><p>Clé API : inventez quelque chose, une entrée est nécessaire mais la valeur n'a pas d'importance</p></li></ul><p>Notez que le test d'un connecteur personnalisé à Ollama dans la configuration du connecteur est actuellement défectueux dans la version 8.17, mais a été corrigé dans la future version 8.18 de Kibana.</p><p>Notre connecteur ressemble à ceci :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774e0793eb110f9d/6a17df9c445de981014d004d/4ce214aa953b4090ed112fbde40b01c01fb8f5c7-786x836.png" alt="" /><h2>Intégration des données vectorielles dans Elasticsearch</h2><p>Si vous connaissez déjà Playground et que vous y avez des données, vous pouvez passer à l'étape Playground ci-dessous. En revanche, si vous avez besoin de données de test rapides, assurez-vous que nos API d'inférence sont configurées. Depuis la version 8.17, les allocations de machine learning sont dynamiques. Pour télécharger et activer le vecteur dense multilingue e5, il suffit d’exécuter la commande suivante dans les Outils de développement de Kibana.</p>GET /_inference


POST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{
   "input": "are internet memes about deepseek sound investment advice?"
}<p>Si ce n'est pas déjà fait, cette opération lancera le téléchargement du modèle e5 depuis les dépôts de modèles d'Elastic.</p><p>Chargeons à présent un livre du domaine public comme contexte pour notre RAG. Voici où télécharger « Alice au pays des merveilles » depuis le Projet Gutenberg : <a href="https://www.gutenberg.org/cache/epub/11/pg11.txt">lien</a>. Enregistrez-le sous la forme d’un fichier  .txt.</p><p>Accédez à Elasticsearch &gt; Accueil &gt; Télécharger un fichier</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c594487844ecb4/6a17df9dfaa9137edb93c786/649042271f34a5e66789b17c39bfe95971c7f4ce-1360x629.png" alt="" /><p>Sélectionnez ou glissez-déposez votre fichier texte, puis cliquez sur le bouton « Importer ».</p><p>Sur l'écran « Importer des données », sélectionnez l'onglet « Avancé », puis définissez le nom de l'index sur « book_alice ».</p><p>Sélectionnez l’option « Ajouter un champ supplémentaire », elle se trouve juste en dessous de « Champs créés automatiquement ». Sélectionnez « Ajouter un champ de texte sémantique » et changez le point de terminaison d’inférence en « .multilingual-e5-small-elasticsearch ». Sélectionnez Ajouter, puis Importer.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9c22ccdaee8590/6a17df9f3e03d731f94f2b8e/e58d5c9a2d406d8e62eb96cab9ac98ca89414346-507x602.png" alt="" /><p></p><p>Une fois le chargement et l’inférence terminés, nous pouvons nous rendre sur Playground.</p><h2>Test de RAG dans Playground</h2><p>Accédez à Elasticsearch &gt; Playground dans Kibana.</p><p>Sur l’écran du Playground, vous devriez voir une coche verte et le message « LLM Connected » (LLM connecté) qui indique qu’il existe un connecteur. Il s'agit du connecteur Ollama que nous venons de créer ci-dessus. Un guide plus complet pour Playground est accessible <a href="https://www.elastic.co/guide/en/kibana/current/playground.html">ici</a>.</p><p>Cliquez sur le bouton bleu « Ajouter des sources de données » et sélectionnez l'index book_alice que nous avions fait, ou un autre index que vous avez préalablement configuré qui utilise les API d'inférence pour les plongements.</p><p>Deepseek est un modèle de chaîne de pensée présentant de fortes caractéristiques d'alignement. C'est à la fois un avantage et un inconvénient du point de vue de la RAG. L'entraînement de type « chaîne de pensée » peut aider Deepseek à rationaliser des énoncés qui semblent contradictoires dans les citations, mais le fort alignement avec les connaissances acquises lors de l'entraînement peut lui faire préférer sa propre version des faits plutôt que notre contexte. Bien qu'il parte d'une bonne intention, ce fort alignement rend les LLM difficiles à guider quand on aborde des sujets où nos connaissances privées sont en contradiction avec les données d'entraînement, ou n'y sont pas bien représentées.</p><p>Dans la configuration de notre Playground, nous avons saisi l'invite système « Vous êtes un assistant pour les tâches de questions-réponses en utilisant les passages pertinents du livre Alice au pays des merveilles » et accepté les autres paramètres par défaut.</p><p>À la question « Qui était au goûter ? » nous obtenons la réponse : « Réponse : le lièvre de mars, le chapelier et le loir étaient au goûter. [Citation : positions 1 et 2] », ce qui est exact.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ce6a0facd972fdd/6a17dfa03e03d79aaa4f2b92/e8af3ff93a72e1f02de8e73f6c2606cbc19970e5-1296x813.png" alt="" /><p>Nous pouvons voir d'après les tags que Deepseek a clairement réfléchi au contenu des citations pour répondre aux questions.</p><h2>Test des limites d'alignement</h2><p>Pour tester Deepseek, créons un scénario qui soit un défi intellectuel. Nous allons créer un index de théories du complot que les données d'entraînement de Deepseek connaissent et qui ne sont pas vraies.</p><p>Dans les outils de développement de Kibana, créons l'index et les données suivants :</p>PUT /classic_conspiracies
{
   "mappings": {
       "properties": {
           "content": {
               "type": "text",
               "copy_to": "content_semantic"
           },
           "content_semantic": {
               "type": "semantic_text",
               "inference_id": ".multilingual-e5-small-elasticsearch"
           }
       }
   }
}




POST /classic_conspiracies/_doc/1
{
   "content": "birds aren't real, the government replaced them with drones a long time ago"
}
POST /classic_conspiracies/_doc/2
{
   "content": "tinfoil hats are necessary to prevent our brains from being read"
}
POST /classic_conspiracies/_doc/3
{
   "content": "ancient aliens influenced early human civilizations, this explains why things made out of stone are marginally similar on different continents"
}<p>
Ces théories du complot seront les données de base pour notre LLM. Même en utilisant une invite système agressive, Deepseek n’accepte pas notre version des faits. Si nos données privées étaient plus fiables, mieux ancrées ou mieux alignées sur les besoins de notre organisation, ce scénario ne serait pas acceptable</p><p>À la question test « Les oiseaux sont-ils réels ? » (explication : <a href="https://knowyourmeme.com/memes/birds-arent-real">know your meme</a>), nous obtenons la réponse suivante : « Dans le contexte fourni, les oiseaux ne sont pas considérés comme réels, mais en réalité, ce sont des animaux réels. » [Contexte : position 1]. Ce test prouve que DeepSeek R1 est puissant, même avec le niveau de paramètre 7B… mais ce n'est peut-être pas le meilleur choix pour la RAG, selon notre jeu de données.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e8dabf65ea200e1/6a17dfa2ec0f8982135a6541/67d5f6cdb97bfd3adb926cbd588c768f9d6730ae-1277x737.png" alt="" /><h2>Quels sont les enseignements à retenir ?</h2><p>En résumé :</p><ul><li><p>L'exécution de modèles en local à l'aide d'outils comme Ollama est une excellente option pour avoir un aperçu de leur comportement.</p></li><li><p>Le Deepseek R1 est un modèle de raisonnement qui comporte des avantages et des inconvénients pour les cas d'utilisation comme la RAG.</p></li><li><p>Playground est en mesure de se connecter à des infrastructures d'hébergement d'inférence comme Ollama par le biais d'une API REST de type OpenAI, qui devient de facto un standard en cette période de lancement de l'hébergement de l'IA.</p></li></ul><p>Globalement, nous sommes impressionnés par les progrès de la RAG locale, « air gapped ». Les outils d’Elasticsearch, de Kibana et des modèles de poids ouverts disponibles ont considérablement progressé depuis que nous avons écrit pour la première fois sur <a href="https://www.elastic.co/search-labs/blog/privacy-first-ai-search-langchain-elasticsearch">la recherche IA axée sur la confidentialité</a> en 2023.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</guid>
    <category><![CDATA[IA]]></category>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Dave Erickson,Jakob Reiter]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a4b2ae6bd97850b/6a17dfa4be6086558f00464c/1bd853bfdfa2710e44cc4c08dede6bd21b35c4b8-1542x860.png" length="0" type="image/png"/>
    <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Ingérer des données géospatiales dans Elasticsearch avec Kibana pour les utiliser dans ES|QL]]></title>
    <description><![CDATA[Comment utiliser Kibana et le processeur d'ingestion csv pour ingérer des données géospatiales dans Elasticsearch afin de les utiliser pour la recherche dans Elasticsearch Query Language (ES|QL). Elasticsearch possède de puissantes fonctionnalités de recherche géospatiale, qui sont désormais intégrées à ES|QL pour une facilité d'utilisation et une familiarité avec l'OGC considérablement améliorées. Mais pour utiliser ces fonctionnalités, nous avons besoin de données géospatiales.]]></description>
    <content:encoded><![CDATA[<p>Nous avons récemment publié un blog décrivant comment utiliser les nouvelles <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">fonctionnalités</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">de recherche géospatiale</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">dans ES|QL,</a> le nouveau et puissant <a href="https://www.elastic.co/search-labs/blog/esql-piped-query-language-goes-ga">langage de requête par pipeline</a> d' Elasticsearch. Pour utiliser ces fonctionnalités, vous devez disposer de données géospatiales dans Elasticsearch. Dans ce blog, nous allons donc vous montrer comment ingérer des données géospatiales et comment les utiliser dans des requêtes ES|QL.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" alt="Recherche géospatiale ESQL" /><h2>Importation de données géospatiales à l'aide de Kibana</h2><p>Les données que nous avons utilisées pour les exemples du blog précédent étaient basées sur les données que nous utilisons en interne pour les tests d'intégration. Pour vous faciliter la tâche, nous l'avons inclus ici sous la forme de quelques fichiers CSV qui peuvent être facilement importés à l'aide de Kibana. Les données sont un mélange d'aéroports, de villes et de limites de villes. Vous pouvez télécharger les données à partir de :</p><ul><li><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">aéroports.csv</a></p><ul><li><p>Il s'agit d'une fusion de trois ensembles de données :</p><ul><li><p>Aéroports (noms, emplacements et données connexes) de <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/">Natural Earth</a></p></li><li><p>Localisation des villes à partir de <a href="https://simplemaps.com/data/world-cities">SimpleMaps</a></p></li><li><p>Élévations des aéroports à partir de la <a href="https://www.partow.net/miscellaneous/airportdatabase/">base de données mondiale des aéroports</a></p></li></ul></li></ul></li><li><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airport_city_boundaries.csv">limites_de_la_ville_de_l'aeroport.csv</a></p><ul><li><p>Il s'agit d'une fusion des noms d'aéroports et de villes ci-dessus avec une nouvelle source :</p><ul><li><p>Limites de la ville d'après <a href="https://www.openstreetmap.org/">OpenStreetMap</a></p></li></ul></li></ul></li></ul><p>Comme vous pouvez le deviner, nous avons passé un certain temps à combiner ces sources de données dans les deux fichiers ci-dessus, dans le but de pouvoir tester les fonctionnalités géospatiales d'ES|QL. Il se peut que cela ne corresponde pas tout à fait à vos besoins spécifiques en matière de données, mais j'espère que cela vous donnera une idée de ce qui est possible. En particulier, nous voulons démontrer quelques points intéressants :</p><ul><li><p>Importation de données contenant des champs géospatiaux avec d'autres données indexables</p></li><li><p>Importer les données <code>geo_point</code> et <code>geo_shape</code> et les utiliser ensemble dans les requêtes</p></li><li><p>Importation de données dans deux index qui peuvent être reliés à l'aide d'une relation spatiale</p></li><li><p>Création d'un pipeline d'ingestion pour faciliter les importations futures (au-delà de Kibana)</p></li><li><p>Quelques exemples de processeurs d'acquisition, tels que <code>csv</code>, <code>convert</code> et <code>split</code></p></li></ul><p>Bien que nous parlions de travailler avec des données CSV dans ce blog, il est important de comprendre qu'il y a <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">plusieurs façons d</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">'</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">ajouter des données géographiques en utilisant</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">Kibana</a>. Dans l'application Carte, vous pouvez télécharger des données délimitées telles que CSV, GeoJSON et ESRI ShapeFiles et vous pouvez également dessiner des formes directement dans la carte. Pour ce blog, nous nous concentrerons sur l'importation de fichiers CSV à partir de la page d'accueil de Kibana.</p><h3>Importation des aéroports</h3><p>Le premier fichier, <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">airports.csv,</a> a quelques particularités intéressantes avec lesquelles nous devons composer. Tout d'abord, les colonnes sont séparées par des espaces blancs supplémentaires, ce qui n'est pas typique des fichiers CSV. Deuxièmement, le champ <code>type</code> est un champ à valeurs multiples, que nous devons diviser en champs distincts. Enfin, certains champs ne sont pas des chaînes de caractères et doivent être convertis dans le bon type. Tout cela peut être fait en utilisant la fonction d'importation CSV de Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt393bc416bf425301/6a16f707839dfa1e86dcfca9/b1afd8c95973bec32f229a9adfaef14680b09a8e-1944x478.png" alt="Kibana Upload - Aperçu" /><p>Commencez par la page d'accueil de Kibana. Une section intitulée "Get started by adding integrations" contient un lien intitulé "Upload a file":</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte12fc741edab20d3/6a16f709acf088600fbe98bf/996372bb3a52859cc840bd1d8f984a33a0e7ada3-1180x410.png" alt="Kibana Home - Télécharger un fichier" /><p>En cliquant sur ce lien, vous accéderez à la page "Upload file". Ici, vous pouvez faire glisser et déposer le fichier <code>airports.csv</code>, et Kibana analysera le fichier et vous présentera un aperçu des données. Il aurait dû détecter automatiquement que le délimiteur était une virgule et que la première ligne était la ligne d'en-tête. Cependant, il n'a probablement pas supprimé les espaces blancs supplémentaires entre les colonnes, ni déterminé les types de champs, en supposant que tous les champs sont soit <code>text</code>, soit <code>keyword</code>. Nous devons y remédier.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf65a09ec0c7a61ad/6a16f70ad7c0227aedde626f/1d9ffa6cdbc0d67a228be1a747ec1ebda6a63099-1800x538.png" alt="Kibana Upload - Aperçu" /><p>Cliquez sur <code>Override settings</code> et cochez les cases <code>Should trim fields</code> et <code>Apply</code> pour fermer les paramètres. Nous devons maintenant fixer les types de champs. Elle est disponible à la page suivante, alors cliquez sur <code>Import</code>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda9a5f85d8e693dc/6a16f70c60084b72f53c4348/a97aceffb1858eae26a213336913505ae9923b03-1800x526.png" alt="Kibana Upload - Importation" /><p>Choisissez d'abord un nom d'index, puis sélectionnez <code>Advanced</code> pour accéder à la page des mappages de champs et du processeur d'ingestion.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt56705083cdd9eb18/6a16f70d66c4f93350f8bdbb/058b0fb09da0b8d7f9c9b0a9c83b8b485ce43925-1440x629.png" alt="Kibana Upload - Correspondance des champs" /><p>Ici, nous devons apporter des modifications aux mappages de champs pour l'index, ainsi qu'au pipeline d'ingestion pour l'importation des données. Tout d'abord, alors que Kibana a probablement auto-détecté le champ <code>scalerank</code> comme étant <code>long</code>, il a perçu par erreur les champs <code>location</code> et <code>city_location</code> comme étant <code>keyword</code>. Modifiez-les à l'adresse <code>geo_point</code>, et vous obtiendrez des correspondances qui ressembleront à quelque chose de semblable :</p>{
  "properties": {
    "abbrev":        { "type": "keyword" },
    "city":          { "type": "keyword" },
    "city_location": { "type": "geo_point" },
    "country":       { "type": "keyword" },
    "elevation":     { "type": "double" },
    "location":      { "type": "geo_point" },
    "name":          { "type": "text" },
    "scalerank":     { "type": "long" },
    "type":          { "type": "keyword" }
  }
}<p>Vous disposez d'une certaine marge de manœuvre, mais sachez que le type de champ choisi aura une incidence sur la manière dont il sera indexé et sur le type de requêtes possibles. Par exemple, si vous laissez <code>location</code> comme <code>keyword</code>, vous ne pouvez pas effectuer de recherches géospatiales sur ce site. De même, si vous laissez <code>elevation</code> en tant que <code>text</code>, vous ne pouvez pas effectuer de requêtes sur les plages numériques.</p><p>Il est maintenant temps de réparer le pipeline d'ingestion. Si Kibana a détecté automatiquement <code>scalerank</code> comme <code>long</code> ci-dessus, il aura également ajouté un processeur pour convertir le champ en <code>long</code>. Nous devons ajouter un processeur similaire pour le champ <code>elevation</code>, en le convertissant cette fois en <code>double</code>. Modifiez le pipeline pour vous assurer que cette conversion est en place. Avant de l'enregistrer, nous souhaitons effectuer une autre conversion, afin de diviser le champ <code>type</code> en plusieurs champs. Ajouter un processeur <code>split</code> au pipeline, avec la configuration suivante :</p>{
  "split": {
    "field": "type",
    "separator": ":",
    "ignore_missing": true
  }
}<p>Le pipeline d'ingestion final devrait ressembler à ceci :</p>{
  "description": "Ingest pipeline created by text structure finder",
  "processors": [
    {
      "csv": {
        "field": "message",
        "target_fields": [
          "abbrev",
          "name",
          "scalerank",
          "type",
          "location",
          "country",
          "city",
          "city_location",
          "elevation"
        ],
        "ignore_missing": false,
        "trim": true
      }
    },
    {
      "convert": {
        "field": "scalerank",
        "type": "long",
        "ignore_missing": true
      }
    },
    {
      "convert": {
        "field": "elevation",
        "type": "double",
        "ignore_missing": true
      }
    },
    {
      "split": {
        "field": "type",
        "separator": ":",
        "ignore_missing": true
      }
    },
    {
      "remove": {
        "field": "message"
      }
    }
  ]
}<p>Notez que nous n'avons pas ajouté de processeur de conversion pour les champs <code>location</code> et <code>city_location</code>. Cela s'explique par le fait que le type <code>geo_point</code> dans la correspondance des champs comprend déjà le format WKT des données de ces champs. Le type <code>geo_point</code> peut comprendre une série de formats, notamment <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html">WKT, GeoJSON, etc</a>. Si nous avions, par exemple, deux colonnes dans le fichier CSV pour <code>latitude</code> et <code>longitude</code>, nous aurions dû ajouter un processeur <code>script</code> ou <code>set</code> pour les combiner en un seul champ <code>geo_point</code> (par exemple. <code>"set": {"field": "location", "value": "{{lat}},{{lon}}"}</code>).</p><p>Nous sommes maintenant prêts à importer le fichier. Cliquez sur <code>Import</code> et les données seront importées dans l'index avec les mappings et le pipeline d'ingestion que nous venons de définir. Si des erreurs surviennent lors de l'ingestion des données, Kibana les signale ici, afin que vous puissiez modifier les données sources ou le pipeline d'ingestion et réessayer.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte81621425c7289c5/6a16f70f839dfaf608dcfcad/55dde2940c7aba66ce8257d15007ef797b8a5107-1440x415.png" alt="Kibana Upload - Importation" /><p>Remarquez qu'une nouvelle ligne d'ingestion a été créée. Il peut être consulté en allant dans la section <code>Stack Management</code> de Kibana, et en sélectionnant <code>Ingest pipelines</code>. Ici, vous pouvez voir le pipeline que nous venons de créer et le modifier si nécessaire. En fait, la section <code>Ingest pipelines</code> peut être utilisée pour créer et tester des pipelines d'ingestion, une fonctionnalité très utile si vous prévoyez d'effectuer des ingérences encore plus complexes.</p><p>Si vous souhaitez explorer ces données immédiatement, passez aux sections suivantes, mais si vous souhaitez également importer les limites des villes, continuez à lire.</p><h3>Importation des limites de la ville</h3><p>Le fichier des limites des villes disponible à l'adresse <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airport_city_boundaries.csv">airport_city_boundaries.csv</a> est un peu plus simple à importer que l'exemple précédent. Il contient un champ <code>city_boundary</code> qui est une représentation WKT des limites de la ville sous forme de <code>POLYGON</code>, et un champ <code>city_location</code> qui est une représentation <code>geo_point</code> de l'emplacement de la ville. Nous pouvons importer ces données de la même manière que les données aéroportuaires, à quelques différences près :</p><ul><li><p>Nous avons dû sélectionner le paramètre d'annulation <code>Has header row</code> car il n'était pas détecté automatiquement.</p></li><li><p>Nous n'avons pas eu besoin de découper les champs, car les données étaient déjà exemptes d'espaces blancs supplémentaires.</p></li><li><p>Nous n'avons pas eu besoin de modifier le pipeline d'ingestion car tous les types étaient soit des chaînes de caractères, soit des types spatiaux.</p></li><li><p>Nous avons toutefois dû modifier les correspondances entre les champs afin de définir le champ <code>city_boundary</code> comme étant <code>geo_shape</code> et le champ <code>city_location</code> comme étant <code>geo_point</code></p></li></ul><p>Nos mappages de champs finaux se présentaient comme suit :</p>{
  "properties": {
    "abbrev":        { "type": "keyword" },
    "airport":       { "type": "keyword" },
    "city":          { "type": "keyword" },
    "city_boundary": { "type": "geo_shape" },
    "city_location": { "type": "geo_point" },
    "region":        { "type": "text" }
  }
}<p>Comme pour l'importation <code>airports.csv</code>, il suffit de cliquer sur <code>Import</code> pour importer les données dans l'index. Les données seront importées avec les mappings que nous avons édités et le pipeline d'ingestion défini par Kibana.</p><h3>Explorer les données géospatiales avec les outils de développement</h3><p>Dans Kibana, il est habituel d'explorer les données indexées avec "Discover". Cependant, si votre intention est d'écrire votre propre application en utilisant des requêtes ES|QL, il peut être plus intéressant d'essayer d'accéder à l'API Elasticsearch brute. Kibana dispose d'une console pratique pour expérimenter l'écriture de requêtes. Il s'agit de la console <code>Dev Tools</code>, qui se trouve dans la barre latérale de Kibana. Cette console communique directement avec le cluster Elasticsearch et peut être utilisée pour exécuter des requêtes, créer des index, etc.</p><p>Essayez ce qui suit :</p>POST /_query?error_trace=true&amp;format=txt
{
  "query": """
FROM airports
| EVAL distance = ST_DISTANCE(city_location, TO_GEOPOINT("POINT(12.565 55.673)"))
| WHERE distance &lt; 1000000 AND scalerank &lt; 6 AND distance &gt; 10000
| SORT distance ASC
| KEEP distance, abbrev, name, location, country, city, elevation
| LIMIT 10
  """
}<p>Cela devrait donner les résultats suivants :</p><p>distance</p><p>abbrev</p><p>nom</p><p>Lieu</p><p>pays</p><p>ville</p><p>élévation</p><p>273418.05776847183</p><p>HAM</p><p>Hambourg</p><p>POINT (10.005647830925 53.6320011640866)</p><p>Allemagne</p><p>Norderstedt</p><p>17.0</p><p>337534.653466062</p><p>TXL</p><p>Berlin-Tegel Int'l</p><p>POINT (13.2903090925074 52.5544287044101)</p><p>Allemagne</p><p>Hohen Neuendorf</p><p>38.0</p><p>483713.15032266214</p><p>OSL</p><p>Oslo Gardermoen</p><p>POINT (11.0991032762581 60.1935783171386)</p><p>Norvège</p><p>Oslo</p><p>208.0</p><p>522538.03148094116</p><p>BMA</p><p>Bromma</p><p>POINT (17.9456175406145 59.3555902065112)</p><p>Suède</p><p>Stockholm</p><p>15.0</p><p>522538.03148094116</p><p>ARN</p><p>Arlanda</p><p>POINT (17.9307299016916 59.6511203397372)</p><p>Suède</p><p>Stockholm</p><p>38.0</p><p>624274.8274399083</p><p>DHS</p><p>Düsseldorf Int'l</p><p>POINT (6.76494446612174 51.2781820420774)</p><p>Allemagne</p><p>Düsseldorf</p><p>45.0</p><p>633388.6966435644</p><p>PRG</p><p>Ruzyn</p><p>POINT (14.2674849854076 50.1076511703671)</p><p>Tchécoslovaquie</p><p>Prague</p><p>381.0</p><p>635911.1873311149</p><p>AMS</p><p>Schiphol</p><p>POINT (4.76437693232812 52.3089323889822)</p><p>Pays-Bas</p><p>Hoofddorp</p><p>-3.0</p><p>670864.137958866</p><p>FRA</p><p>Francfort Int'l</p><p>POINT (8.57182286907608 50.0506770895207)</p><p>Allemagne</p><p>Francfort</p><p>111.0</p><p>683239.2529970079</p><p>WAW</p><p>Okecie Int'l</p><p>POINT (20.9727263383587 52.171026749259)</p><p>Pologne</p><p>Piaseczno</p><p>111.0</p><h2>Visualiser des données géospatiales avec Kibana Maps</h2><p>Kibana Maps est un outil puissant de visualisation des données géospatiales. Il peut être utilisé pour créer des cartes avec plusieurs couches, chaque couche représentant un ensemble de données différent. Les données peuvent être filtrées, agrégées et stylisées de différentes manières. Dans cette section, nous allons vous montrer comment créer une carte dans Kibana Maps en utilisant les données que nous avons importées dans la section précédente.</p><p>Dans le menu Kibana, naviguez vers <code>Analytics</code>-&gt;<code>Maps</code> pour ouvrir une nouvelle vue de la carte. Cliquez sur <code>Add Layer</code> et sélectionnez <code>Documents</code>, choisissez la vue de données <code>airports</code> et modifiez le style de la couche pour colorer les marqueurs à l'aide du champ <code>elevation</code>, de sorte que nous puissions facilement voir à quelle hauteur se trouve chaque aéroport.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcc4736d88c1abc9/6a16f7102b835f7353f4afca/9e63726d7c059331e6e20e474f8abee53dc2cbb4-840x388.png" alt="Kibana Maps - Style de calque pour les aéroports" /><p>Cliquez sur "Conserver les modifications" pour enregistrer la carte :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ec3cc535b5c21d8/6a16f71375879ec091fe15dc/32ad1dadb5d341a2b66662c58638b781122fc22c-2852x1528.png" alt="Kibana Maps - Aéroports" /><p>Ajoutez maintenant une deuxième couche, en sélectionnant cette fois la vue de données <code>airport_city_boundaries</code>. Cette fois-ci, nous utiliserons le champ <code>city_boundary</code> pour styliser le calque et définir la couleur de remplissage sur un bleu clair. Les limites de la ville apparaissent alors sur la carte. Veillez à réorganiser les couches de manière à ce que les marqueurs d'aéroport soient placés en haut.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2932d7ff4a7206c9/6a16f7156f7f0409f09145c7/53dd65026f9a98c13f2cc4f9328a79242f0b70de-2854x1510.png" alt="Kibana Maps - Style de calque pour les limites des villes" /><h2>Jointures spatiales</h2><p>ES|QL ne prend pas en charge les commandes <code>JOIN</code>, mais vous pouvez réaliser un cas spécial de jointure à l'aide de la <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich">commande</a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich"><code>ENRICH</code></a>. Cette commande s'apparente à une "jointure gauche" en SQL, vous permettant d'enrichir les résultats d'un index avec des données d'un autre index sur la base d'une relation spatiale entre les deux ensembles de données.</p><p>Par exemple, enrichissons les résultats d'un tableau d'aéroports avec des informations supplémentaires sur la ville qu'ils desservent en trouvant la limite de la ville qui contient l'emplacement de l'aéroport, puis effectuons quelques statistiques sur les résultats :</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>Si vous exécutez cette requête sans avoir au préalable préparé l'index enrichi, vous obtiendrez un message d'erreur du type</p>cannot find enrich policy [city_boundaries]<p>En effet, comme nous l'avons déjà mentionné, ES|QL ne prend pas en charge les véritables commandes <code>JOIN</code>. L'une des raisons principales est qu'Elasticsearch est un système distribué et que les jointures sont des opérations coûteuses qu'il peut être difficile de faire évoluer. Cependant, la commande <code>ENRICH</code> peut être très efficace, car elle utilise des index enrichis spécialement préparés qui sont dupliqués sur l'ensemble du cluster, ce qui permet d'effectuer des jointures locales sur chaque nœud.</p><p>Pour mieux comprendre, concentrons-nous sur la commande <code>ENRICH</code> dans la requête ci-dessus :</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary<p>Cette commande demande à Elasticsearch d'enrichir les résultats extraits de l'index <code>airports</code> et d'effectuer une jointure <code>intersects</code> entre le champ <code>city_location</code> de l'index original et le champ <code>city_boundary</code> de l'index <code>airport_city_boundaries</code>, que nous avons utilisé dans quelques exemples plus tôt. Mais certaines de ces informations ne sont pas clairement visibles dans cette requête. Ce que nous voyons, c'est le nom d'une politique d'enrichissement <code>city_boundaries</code>, et l'information manquante est encapsulée dans cette définition de politique.</p>{
  "geo_match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>Ici, nous pouvons voir qu'il effectuera une requête <code>geo_match</code> (<code>intersects</code> est la valeur par défaut), que le champ à comparer est <code>city_boundary</code> et que les champs <code>enrich_fields</code> sont les champs que nous voulons ajouter au document d'origine. L'un de ces champs, le <code>region</code>, a été utilisé comme clé de regroupement pour la commande <code>STATS</code>, ce que nous n'aurions pas pu faire sans cette capacité de "jointure à gauche". Pour plus d'informations sur les politiques d'enrichissement, voir la <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/enrich-setup.html">documentation d'enrichissement</a>.</p><p>Les index et politiques d'enrichissement d'Elasticsearch ont été conçus à l'origine pour enrichir les données au moment de l'indexation, en utilisant les données d'un autre index d'enrichissement préparé. Dans ES|QL, cependant, la commande <code>ENRICH</code> fonctionne au moment de la requête et ne nécessite pas l'utilisation de pipelines d'ingestion. Cela le rend assez similaire à un SQL <code>LEFT JOIN</code>, sauf que vous ne pouvez pas joindre deux index, mais seulement un index normal à gauche avec un index enrichi spécialement préparé à droite.</p><p>Dans les deux cas, que ce soit pour les pipelines d'ingestion ou pour l'utilisation dans ES|QL, il est nécessaire d'effectuer quelques étapes préparatoires pour mettre en place l'index et la politique d'enrichissement. Nous avons déjà importé l'index <code>airport_city_boundaries</code> ci-dessus, mais il n'est pas directement utilisable comme index d'enrichissement dans la commande <code>ENRICH</code>. Nous devons d'abord effectuer deux démarches :</p><ul><li><p>Créez la politique d'enrichissement décrite ci-dessus pour définir l'index source, le champ de l'index source à comparer et les champs à renvoyer une fois la correspondance établie.</p></li><li><p>Exécutez cette politique pour créer l'index d'enrichissement. Cela permet de construire un index interne spécial, en lisant l'index source d'origine dans une structure de données plus efficace qui est copiée à travers le cluster.</p></li></ul><p>La politique d'enrichissement peut être créée à l'aide de la commande suivante :</p>PUT /_enrich/policy/city_boundaries
{
  "match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>La politique peut être exécutée à l'aide de la commande suivante :</p>POST /_enrich/policy/city_boundaries/_execute<p>Notez que si vous modifiez le contenu de l'index <code>airport_city_boundaries</code>, vous devrez réexécuter cette politique pour que les changements soient reflétés dans l'index enrichi. Exécutons à nouveau la requête ES|QL d'origine :</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>Cette méthode permet d'obtenir les 5 régions qui comptent le plus d'aéroports, ainsi que le centroïde de tous les aéroports qui ont des régions correspondantes et la longueur de la représentation WKT des limites des villes à l'intérieur de ces régions :</p><p>centroïde</p><p>Compte</p><p>région</p><p>POINT (-12.139086859300733 31.024386116624648)</p><p>126</p><p>nul</p><p>POINT (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Détroit</p><p>POINT (39.74537850357592 47.21613017376512)</p><p>3</p><p>городской округ Батайск</p><p>POINT (-156.80986787192523 20.476673701778054)</p><p>3</p><p>Hawaï</p><p>POINT (-73.94515332765877 40.70366442203522)</p><p>3</p><p>Ville de New York</p><p>POINT (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Détroit</p><p>POINT (-76.66873019188643 24.306286952923983)</p><p>2</p><p>New Providence</p><p>POINT (-3.0252167768776417 51.39245774131268)</p><p>2</p><p>Cardiff</p><p>POINT (-115.40993484668434 32.73126147687435)</p><p>2</p><p>Municipalité de Mexicali</p><p>POINT (41.790108773857355 50.302146775648)</p><p>2</p><p>Центральный район</p><p>POINT (-73.88902732171118 45.57078813901171)</p><p>2</p><p>Montréal</p><p>Vous pouvez également remarquer que la région la plus fréquemment trouvée est <code>null</code>. Qu'est-ce que cela peut signifier ? Rappelez-vous que j'ai comparé cette commande à une "jointure gauche" en SQL, ce qui signifie que si aucune limite de ville correspondante n'est trouvée pour un aéroport, l'aéroport est toujours renvoyé, mais avec les valeurs <code>null</code> pour les champs de l'index <code>airport_city_boundaries</code>. Il s'avère que 125 aéroports n'ont pas trouvé de correspondance avec <code>city_boundary</code>, et un aéroport avec une correspondance où le champ <code>region</code> était <code>null</code>. Cela a conduit à un décompte de 126 aéroports sans <code>region</code> dans les résultats. Si votre cas d'utilisation exige que tous les aéroports puissent être mis en correspondance avec les limites d'une ville, il faudra trouver des données supplémentaires pour combler les lacunes. Il serait nécessaire de déterminer deux choses :</p><ul><li><p>les enregistrements de l'index <code>airport_city_boundaries</code> qui n'ont pas de champs <code>city_boundary</code></p></li><li><p>les enregistrements de l'index <code>airports</code> qui ne correspondent pas à l'aide de la commande <code>ENRICH</code> (c'est-à-dire. ne se croisent pas)</p></li></ul><h2>Utilisation de ES|QL pour les données géospatiales dans Kibana Maps</h2><p>Kibana a ajouté la prise en charge de Spatial ES|QL dans l'application Maps. Cela signifie que vous pouvez désormais utiliser ES|QL pour rechercher des données géospatiales dans Elasticsearch et visualiser les résultats sur une carte.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91922eb4ef43d290/6a16f7161949f737bfe7a7b5/bd78470bd8a4bc60f0db7006bd804b8fe87e2fea-1440x683.png" alt="Couches Kibana ES|QL" /><p>Il existe une nouvelle option de couche dans le menu d'ajout de couches, appelée "ES|QL". Comme toutes les fonctions géospatiales décrites jusqu'à présent, il s'agit d'un aperçu technique "" . Cette option permet d'ajouter une couche à la carte en fonction des résultats d'une requête ES|QL. Par exemple, vous pouvez ajouter une couche à la carte qui montre tous les aéroports du monde.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5185ef7461d7e81d/6a16f718839dfa1559dcfcb1/1dd28d3d0509f92d26b0bb5320a2925f7a54c5d9-1440x736.png" alt="Kibana ES|QL - Aéroports" /><p>Vous pouvez également ajouter une couche qui montre les polygones de l'index <code>airport_city_boundaries</code> ou, mieux encore, la requête complexe <code>ENRICH</code> ci-dessus qui génère des statistiques sur le nombre d'aéroports dans chaque région.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt51ee3543bb811d98/6a16f71a8b73cbbe63189df1/679a0a401faa613c7cedddd07c64f614ac2b7144-1440x727.png" alt="Kibana ES|QL - Statistiques par région" /><h2>Et ensuite ?</h2><p>Le précédent blog sur <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">la recherche géospatiale</a> s'est concentré sur l'utilisation de fonctions telles que <code>ST_INTERSECTS</code> pour effectuer des recherches, disponibles dans Elasticsearch depuis la version 8.14. Ce blog vous montre comment importer les données que nous avons utilisées pour ces recherches. Cependant, Elasticsearch 8.15 a été doté d'une fonction particulièrement intéressante : <code>ST_DISTANCE</code> qui peut être utilisée pour effectuer des recherches de distance spatiale efficaces, et ce sera le sujet du prochain blog !</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Craig Taverner]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>