<?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/de/search-labs/blog/category/kibana</link>
    </image>
    <link>https://www.elastic.co/de/search-labs/blog/category/kibana</link>
    <atom:link href="https://www.elastic.co/de/search-labs/rss/category/kibana.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[de]]></language>
    <lastBuildDate>Wed, 23 Sep 2026 09:39:42 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Kibana Dashboards API: Ein stabiler Vertrag für jeden Panel-Typ, vor GA von über 50 Teams getestet]]></title>
    <description><![CDATA[Kibana-Dashboards als Code verwalten: Änderungen in Git einchecken, umgebungsübergreifend bereitstellen und Deployments mit der Kibana-API und Terraform automatisieren.]]></description>
    <content:encoded><![CDATA[<p>Die<a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards"> Kibana-Dashboard- und Visualisierungs-APIs</a> sind in Elastic 9.5 produktionsbereit, über alle Abonnementstufen hinweg verfügbar und mit vollständiger Abwärtskompatibilität. Definieren Sie Ihre Dashboards als JSON, übertragen Sie sie in Git und stellen Sie sie anschließend mithilfe von CI/CD-Pipelines (Continuous Integration und Continuous Deployment),<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard"> Terraform</a> oder anderen Tools, die Sie bereits einsetzen, in verschiedenen Umgebungen bereit. Über 50 Teams testeten die API während<a href="https://www.elastic.co/search-labs/blog/kibana-dashboards-as-code-terraform-api"> der technischen Vorschau in Version 9.4</a>, einige setzen sie bereits in der Produktion ein. In Version 9.5 werden außerdem neue Endpunkte (in der technischen Vorschau) für <a href="https://dashboardsapispec.kibana.dev/tags.html">Tags</a> hinzugefügt, wobei die Endpunkte für die Bedienfelder <a href="https://dashboardsapispec.kibana.dev/markdowns.html">Markdown</a> und <a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links">Links</a> bereits in Elastic Cloud Serverless verfügbar sind und in Version 9.6 eingeführt werden.</p><h2>Was Abwärtskompatibilität für die Kibana-Dashboards API bedeutet</h2><p>Während der technischen Vorschau kann sich die API-Struktur zwischen den Releases ändern.[1] Diese Zeiten sind vorbei. Allgemeine Verfügbarkeit (General Availability, GA) bedeutet:</p><ul><li><p><strong>Vollständige Abwärtskompatibilität.</strong> Im Laufe der Zeit werden neue Felder und Paneltypen hinzugefügt, aber bestehende Felder und Verhaltensweisen bleiben unverändert. Alle zukünftigen kompatibilitätsbrechenden Änderungen würden sehr sorgfältig geprüft und nur in einer neuen Haupt-Stack-Version eingeführt.</p></li><li><p><strong>Produktionsbereit mit voller Unterstützung.</strong> Die API bietet die vollständigen Support-Garantien von Elastic. Sie können es bedenkenlos in Produktionsumgebungen für automatisierte Deployments, Umgebungs-Promotion und programmatisches Dashboard-Management verwenden.</p></li></ul><h2>Neue Kibana-API-Endpoints für die Panels „Tags“, „Markdown“ und „Links“</h2><p>Elastic 9.5 führt außerdem einen neuen eigenständigen Endpoint für <a href="https://dashboardsapispec.kibana.dev/tags.html"><strong>Tags</strong></a> ein, der es ermöglicht, Dashboards zu kategorisieren und zu filtern. Sie können diese nun programmatisch über dedizierte CRUD-Endpoints verwalten, was die Organisation von Dashboards in großem Umfang über verschiedene Umgebungen hinweg vereinfacht.	</p><p>Neue Endpoints für die <a href="https://dashboardsapispec.kibana.dev/markdowns.html"><strong>Markdown</strong></a>- und <a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"><strong>Links</strong></a>-Bedienfelder sind ab sofort in Serverless verfügbar und werden in der nächsten Stack-Version (9.6) implementiert.</p><h2>Welche Panel-Typen unterstützt die Kibana-Dashboards-API?</h2><p>Die Dashboards-API unterstützt alle <em>By-Value</em>-Panels in Version 9.5 (d. h. diejenigen, die direkt in einem Dashboard definiert wurden, im Gegensatz zu Bibliotheks-Panels, die zur Wiederverwendung gespeichert wurden). Jeder unterstützte Paneltyp verfügt über ein typisiertes, validiertes Schema.</p><p><strong>Panel-Typ</strong></p><p><strong>Status</strong></p><p>XY-Diagramme</p><p>Ja</p><p>Metriken</p><p>Ja</p><p>Kreisdiagramm</p><p>Ja</p><p>Messgerät</p><p>Ja</p><p>Heatmap</p><p>Ja</p><p>Datentabellen</p><p>Ja</p><p>Treemap</p><p>Ja</p><p>Discover Sitzungen</p><p>Ja</p><p>Steuerungen</p><p>Ja</p><p>Markdown</p><p>Ja</p><p>Links</p><p>Ja</p><p>ML-Panels</p><p>Ja</p><p>Observability-Panels</p><p>Ja</p><p>Maps</p><p>Demnächst verfügbar</p><p>Vega</p><p>Demnächst verfügbar</p><h2>Wie man Kibana-Dashboards als Code verwaltet</h2><p>Die Dashboards-API ermöglicht einen vollständigen „Dashboards-as-Code“-Workflow: Exportieren Sie ein Dashboard als sauberes, vergleichbares JSON, übertragen Sie es als maßgebliche Quelle in Git, überprüfen Sie Änderungen in Pull-Anfragen und stellen Sie dieselbe Definition in den Umgebungen Entwicklung, Staging und Produktion bereit. Sobald ein Dashboard als Code verwaltet wird, ist Git als einzige Quelle der Wahrheit zu behandeln: Änderungen, die direkt in der Benutzeroberfläche vorgenommen werden, werden beim nächsten Bereitstellen überschrieben.</p><p>Die größte Herausforderung beim Verschieben eines Dashboards zwischen Bereichen, Clustern oder Phasen besteht darin, dass Dashboards auf Objekte wie Datenansichten und Bibliotheksvisualisierungen anhand ihrer ID verweisen. Da diese IDs automatisch generiert werden und sich je nach Umgebung unterscheiden, kann ein aus einer Umgebung exportiertes Dashboard auf Objekte verweisen, die in einer anderen Umgebung nicht vorhanden sind. Es gibt drei Möglichkeiten, dies zu handhaben, hier aufgelistet von der am stärksten automatisierten bis zur am wenigsten automatisierten:</p><ul><li><p><strong>Benutzen Sie Terraform.</strong> Der <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Elastic Stack Terraform Provider</a> verfolgt jede Ressource und ordnet IDs pro Umgebung automatisch zu, sodass die Referenzen konsistent bleiben, wenn Sie ein Dashboard von der Entwicklung bis zur Produktion überführen.</p></li><li><p><strong>Nach Wert definieren </strong><a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"><strong>Elasticsearch Abfragesprache (ES|QL)-Panels</strong></a><strong>.</strong> Die portabelste Methode zum Erstellen eines Panels besteht darin, dessen Visualisierung mit ES|QL direkt im Dashboard zu definieren. Eine <a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql-kibana">ES|QL</a>-Abfrage liest aus den von Ihnen genannten Indizes, sodass das Panel keine externen Referenzen auf Data view oder Bibliotheksobjekte enthält. Das Ergebnis ist ein vollständig autarkes, portables Dashboard.</p></li><li><p><strong>Weisen Sie passende IDs zu.</strong> Wenn Sie auf gespeicherte Objekte wie Data View oder Bibliotheksvisualisierungen verweisen, erstellen Sie diese mit einer ausgewählten ID mittels PUT (upsert) anstatt mit POST (das automatisch eine ID generiert). Verwenden Sie für Menschen lesbare IDs, wie beispielsweise „logs-prod“, damit diese in verschiedenen Umgebungen leicht wiederverwendet und erkannt werden können.</p></li></ul><p>Eine ausführliche Anleitung zu diesen Portabilitätsmustern und dem vollständigen Dashboards-as-Code-Workflow finden Sie in der Dokumentation <a href="https://www.elastic.co/docs/explore-analyze/dashboards/manage-dashboards-as-code#dashboards-as-code-portability">Dashboards als Code verwalten.</a></p><h3>Erstellen Sie ein Kibana-Dashboard mit der Dashboards-API mithilfe von PUT</h3><p>Hier ein kurzes Beispiel zur Erstellung eines Dashboards mit einem Metrikbereich. Dabei wird PUT anstelle von POST verwendet, um eine benutzerdefinierte ID anhand des Dashboard-Namens (service-health-overview) zuzuweisen. Dieselbe Logik funktioniert auch für die Erstellung eigenständiger Visualisierungen, die in der Bibliothek gespeichert werden.</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>Kibana Dashboards API-Roadmap: Maps, Vega und eigenständige Endpoints</h2><p>Wir erweitern aktiv die API-Schnittstelle. Als nächstes folgt die Unterstützung für Maps und Vega-Panels, wobei typisierte Schemas dafür hinzugefügt werden. Wir entwickeln außerdem eigenständige CRUD-Endpunkte für Discover-Sitzungen (zusätzlich zu ihrer bestehenden Unterstützung als Dashboard-Panels), Vega, Maps und Annotations, die vom Dashboard-Lebenszyklus entkoppelt sind.</p><p>Für die vollständigen Schema-Definitionen besuchen Sie die <a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">Dashboards API-Dokumentation</a>. Für Terraform-Nutzer unterstützt der <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Elastic Stack Terraform-Provider</a> die GA Dashboards API.</p><h2>Anmerkung</h2><ol><li><p>Die Kern-Endpoints sind gegenüber der technischen Vorschau unverändert. Wenn Sie Integrationen für 9.4 erstellt haben, funktionieren sie in 9.5. Die einzigen kompatibilitätsbrechenden Änderungen sind zwei geringfügige, die sich auf die Formate für Dashboard-Auflistungen und Dauereinheiten auswirken und <a href="https://www.elastic.co/docs/release-notes/kibana/breaking-changes">hier dokumentiert sind</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[Entwicklererfahrung]]></category>
    <category><![CDATA[Integrationen]]></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[Direkt zum Dashboard in unter einer Minute, fünfmal günstiger: KI-Dashboards und benutzerdefinierte Vega-Lite-Diagramme in Kibana]]></title>
    <description><![CDATA[Beschreiben Sie Ihre Kennzahlen in natürlicher Sprache, und der KI-Chat von Kibana generiert ES|QL-basierte Dashboards und Vega-Lite-Diagramme, von Streudiagrammen bis hin zu bedingter Formatierung und benutzerdefinierten Tooltips.]]></description>
    <content:encoded><![CDATA[<p>Der <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat">KI-Chat</a> von Kibana erstellt jetzt anhand eines natürlichsprachigen Prompts in weniger als einer Minute vollständige, auf der <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">Elasticsearch-Abfragesprache (ES|QL) basierende</a> Dashboards. Allgemein verfügbar (GA) wird dies in Elastic 9.5 (<a href="https://www.elastic.co/de/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana">technische Vorschau in Version 9.4</a>) mit einer Fehlerbehebung, die fehlgeschlagene Abfragen erneut versucht, fünfmal niedrigeren ES|QL-Generierungskosten durch gestuftes Modellrouting und interaktiven Filtersteuerungen. Diese Version ermöglicht außerdem die Erstellung von <a href="https://www.elastic.co/docs/explore-analyze/visualize/custom-visualizations-with-vega">Vega-Lite-Diagrammen</a> mithilfe natürlicher Sprache, mit Streudiagrammen, Boxplots, bedingter Formatierung und benutzerdefinierten Tooltips, die man normalerweise manuell in JSON programmieren müsste.</p><h2>Was ist neu bei der Erstellung von KI-Dashboards in Kibana?</h2><p><strong>Funktionalität</strong></p><p><strong>Technische Vorschau (9.4)</strong></p><p><strong>GA (9.5)</strong></p><p>Fehlerbehandlung</p><p>Kein Wiederholungsversuch bei fehlgeschlagenen ES|QL-Abfragen</p><p>Automatischer, bis zu dreimaliger erneuter Versuch mit Abfrageprüfung und Anpassung</p><p>ES|QL-Generierungskosten</p><p>Alle Abfragen werden über das primäre Modell weitergeleitet</p><p>Gestaffelte Modellrouten, bis zu fünfmal günstiger</p><p>Zeitbereich</p><p>Festgelegtes Standardfenster</p><p>Automatische Auswahl basierend auf der Daten-Zeit-Verteilung</p><p>Filtersteuerungen</p><p>Nein</p><p>Automatisch für die relevantesten Felder</p><p>Vega-Lite-Diagramme</p><p>Nein</p><p>Erstellung in natürlicher Sprache, mit Streudiagrammen, Boxplots, bedingter Formatierung und benutzerdefinierten Tooltips</p><p>Diagrammbearbeitung</p><p>Nein</p><p>Bestehende Vega-Lite-Panels können in natürlicher Sprache bearbeitet werden</p><h3>Automatische Fehlerbehebung bei der KI-Dashboard-Generierung</h3><p>In der technischen Vorschau wurden fehlgeschlagene ES|QL-Abfragen vom Agenten nicht wiederholt. In Version 9.5 werden Abfragefehler erkannt und die Abfrage bis zu dreimal wiederholt, wobei jeder Fehler untersucht und die Abfrage angepasst wird, bevor der Agent aufgibt. In der Praxis beseitigt dies die meisten Probleme mit leeren Panels und erzeugt Dashboards, die schon beim ersten Versuch korrekt gerendert werden.</p><h3>Warum ist die Erstellung von KI-Dashboards in Elastic 9.5 günstiger?</h3><p>Nicht jeder Schritt bei der Dashboard-Erstellung erfordert das gleiche Maß an Argumentation. In Version 9.5 erfolgt die ES|QL-Generierung standardmäßig über ein leichteres Modell und greift nur bei Bedarf auf das primäre Modell zurück. Wenn Ihr <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/connectors">Connector</a> Claude Opus 4.8 von Anthropic verwendet, bedeutet das fünfmal günstigere Kosten für die ES|QL-Generierung in allen Panels.</p><h3>Automatische Zeitbereichsauswahl auf der Grundlage Ihrer Daten</h3><p>Dashboards sind nur dann nützlich, wenn sie den richtigen Datenausschnitt anzeigen. Der Agent wendet nun eine verbesserte Logik an, um einen für die abgefragten Daten sinnvollen Zeitbereich auszuwählen, es sei denn, der Nutzer fragt nach einem bestimmten Zeitbereich. Er berücksichtigt die Zeitverteilung der Daten und passt sich entsprechend an, seien es die letzte Stunde für einen Live-Vorfall oder die letzten 90 Tage für eine Trendanalyse, anstatt standardmäßig auf ein festes Zeitfenster zurückzugreifen.</p><h3>Automatische Filtersteuerungen auf KI-generierten Dashboards</h3><p>Die Erstellung von Dashboards unterstützt nun Steuerelemente; das heißt interaktive Filter, mit denen die Betrachter ein Dashboard nach Feldwerten eingrenzen können, ohne die zugrunde liegenden Abfragen bearbeiten zu müssen. Beim Generieren eines Dashboards fügt der Agent am oberen Rand automatisch Steuerelemente für die relevantesten Filterfelder hinzu.</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>Vega-Lite-Diagramme aus natürlicher Sprache: Diagrammtypen und Formatierung jenseits der Standardeinstellungen</h2><p><a href="https://vega.github.io/vega/">Vega</a> und <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> unterstützen in Kibana eine breite Palette von Diagrammtypen und Anpassungen. Mit Version 9.5 können Sie sie aus einfacher Sprache erstellen und müssen den Code nicht selbst schreiben. </p><h3>Streudiagramme, Boxplots und weitere Diagrammtypen in Vega-Lite</h3><p>Streudiagramme, Boxplots, facettierte Small Multiples, Blasendiagramme und Kompositionsdiagramme (z. B. Histogramme, kombiniert mit Heatmaps) sowie viele andere werden von <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> unterstützt. Ein Prompt wie <em>Zeig mir ein Streudiagramm zu Reaktionszeit vs. Anfragegröße, farbig nach Dienstprogrammname</em> erzeugt ein Vega-Lite-Panel mit den richtigen Datenzuordnungen. Die Diagramme verwenden die Standardfarbpaletten von Kibana, um sich harmonisch in das restliche Dashboard einzufügen.</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>Bedingte Formatierung, benutzerdefinierte Tooltips und Beschriftungen auf Standarddiagrammen</h3><p>Selbst bei Diagrammtypen, die in einem Dashboard bereits systemeigen sind, zum Beispiel Balkendiagramme, Liniendiagramme oder Flächendiagramme, benötigen Sie manchmal mehr Kontrolle, als die Standardfunktionen bieten. Vega-Lite schließt diese Lücke über den Chat. Zu den Beispielen gehören:</p><ul><li><p><strong>Bedingte Farbformatierung:</strong> Datenpunkte oberhalb eines Schwellenwerts können farbig anders dargestellt werden; beispielsweise werden Datenpunkte in einem Liniendiagramm oder in Balkendiagrammen rot eingefärbt, wenn eine Kennzahl über das Service Level Objective (SLO) hinausgeht. Bitten Sie den Agenten etwa: <em>Färbe alle Punkte über 500 ms für mein Liniendiagramm rot ein.</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>Individuelle Markierungen und Beschriftungen:</strong> Fügen Sie Emojis, Symbole oder Inline-Textbeschriftungen zu Datenpunkten hinzu, um den Status auf einen Blick zu erkennen.</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>Individuelle Tooltips:</strong> Reichern Sie Hover-Zustände mit zusätzlichen Metriken, Kontext oder berechneten Werten an, die nicht Teil der Diagrammachsen sind. Formulieren Sie etwas wie <em>Füge einen Tooltip hinzu, der die Gesamtzahl der Datensätze und den Prozentsatz pro Balkendiagramm anzeigt.</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>Das funktioniert auch bei der Bearbeitung vorhandener Vega-Charts. Wenn Sie ein Vega-Lite-Panel haben, das eine Anpassung wie z. B. das Ändern einer Farbskala, das Anpassen einer Achse oder ein Umschalten des Markierungstyps benötigt, beschreiben Sie die Änderung im Chat, anstatt sich in den JSON-Code einzuarbeiten.</p><h2>So haben wir die Vega-Lite-Generierung in natürlicher Sprache in Kibana entwickelt</h2><p>Das Generieren eines Vega-Lite-Diagramms aus einem Satz heraus ist kein einmaliger Prompt à la <em>Bitte das Modell um JSON</em>. Wir haben eine kleine agentenbasierte Pipeline aufgebaut, die natürliche Sprachabsicht in ein validiertes, datenbasiertes Diagramm umsetzt.</p><p>Wenn eine Anfrage eingeht, prüft der Agent zunächst, ob Vega-Lite die richtige Lösung ist. Für Vega-Lite-Anfragen verankert er die Visualisierung in einer echten ES|QL-Abfrage bei Elasticsearch und verwendet dann ein Modell, um den Vega-Lite-Code zu generieren. Vor dem Rendern durchläuft das Ergebnis eine Normalisierungsschicht, die das Schema korrigiert und die kanonische Abfrage bindet. Er wendet außerdem rendersichere Umwandlungen an. </p><p>Einige wenige Designentscheidungen machen diesen Workflow zuverlässig:</p><ul><li><p><strong>Eingetippter Toolaufruf</strong>: Die Diagrammerstellung ist ein strukturierter Tool-Aufruf und kein Vega-Lite, das in die Konversation eingefügt wird.</p></li><li><p><strong>Beschränkte Generierung</strong>: Das Modell erzeugt Vega-Lite-Code innerhalb eines definierten Schemas, was die Ausgabe vorhersehbarer und leichter validierbar macht.</p></li><li><p><strong>Kuratierte Beispiele:</strong> Strukturelle Muster wie Facetten, geschichtete Markierungen und Heatmaps bieten Orientierung, ohne die zugrunde liegenden Daten zu kopieren.</p></li><li><p><strong>Ausführungs- und Verifikationsschleifen</strong>: Abfragen werden vor der Diagrammerstellung ausgeführt, und Validierungsfehler lösen Korrekturversuche für die ES|QL-Generierung aus.</p></li></ul><h2>Testen Sie die Erstellung von KI-Dashboards und Vega-Lite-Diagrammen in Kibana</h2><p>Um die Erstellung von Dashboards mit natürlicher Sprache und Vega-Lite-Diagramme auszuprobieren, aktualisieren Sie auf <strong>Elastic 9.5</strong> (oder <a href="https://cloud.elastic.co/registration">starten eine kostenlose Testversion</a>) und öffnen den <strong>Chat</strong> in Kibana. Bitten Sie das System anschließend, aus Ihren Daten ein Dashboard zu erstellen. Bei Vega-Lite können Sie versuchen, einen Diagrammtyp anzufordern, den Sie schon immer einmal erstellen wollten, zum Beispiel ein Streudiagramm oder ein Blasendiagramm. Wenn das Ergebnis nicht ganz stimmt, sagen Sie dem Agenten, was er ändern soll. Er wiederholt den Vorgang dann entsprechend.</p><p>Dafür ist eine Enterprise-Lizenz erforderlich. <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Erste Schritte</a>.</p><p><em>Die Entscheidung über die Veröffentlichung der in diesem Blogeintrag beschriebenen Leistungsmerkmale und Features sowie deren Zeitpunkt liegt allein bei Elastic. Es ist möglich, dass noch nicht verfügbare Leistungsmerkmale oder Features nicht rechtzeitig oder überhaupt nicht veröffentlicht werden.</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 Menschen, keine menschlichen Entscheidungen: agentische Katastrophenreaktion mit Elasticsearch]]></title>
    <description><![CDATA[Erfahren Sie, wie eine Kibana Erkennungsregel, ein Workflow und ein KI-Agent bei einem Hurrikan automatisch 137.000 Militäreinsatzkräfte über sieben Einrichtungen hinweg verlegten – ganz ohne Disponenten.]]></description>
    <content:encoded><![CDATA[<p>Elastic hat soeben die automatisierte Evakuierung von 137.000 Militäreinsatzkräften an sieben Standorten koordiniert – ganz ohne menschliches Eingreifen. Ein Hurrikan der Kategorie 4 trifft auf die Küste von Hampton Roads. Die Geodatenanreicherung von Elasticsearch identifiziert jede Einrichtung im betroffenen Gebiet bereits zur Indexzeit. Eine Kibana Erkennungsregel wird ausgelöst. Ein Workflow startet eine Konversation mit einem KI-Agenten. Der Agent analysiert Kapazität, Distanz und Zweigstellenkompatibilität durch logisches Denken und versendet dann 16 Evakuierungs- und Aufnahmebenachrichtigungen in einem einzigen Durchgang. Vom unverarbeiteten GDACS-Ereignis zur koordinierten Aktion, ganz automatisch.</p><p>Jedes Jahr zwingen Naturkatastrophen Notfallmanager, militärische Befehlshaber und Verantwortliche für die öffentliche Sicherheit dazu, unter hohem Zeitdruck weitreichende Entscheidungen zu treffen. Diese Entscheidungen basieren traditionell auf Telefonketten, Tabellen und institutionellem Wissen, das über Dutzende von Personen verteilt ist. Allein der Koordinationsaufwand kostet entscheidende Zeit.</p><p>Dieser Beitrag zeigt, wie Elastic ein reaktionsschnelles, agentisches Koordinationssystem für die Katastrophenreaktion antreiben kann, das eine Bedrohung erkennt, die Logistik durchdenkt und automatisch handelt. Um dies zu veranschaulichen, haben wir eine Simulation erstellt: Ein fiktiver Hurrikan der Kategorie 4, der die Küste von Hampton Roads bedroht, löst die automatische Verlegung von über 137.000 Einsatzkräften über sieben Militäreinrichtungen hinweg aus.</p><p><strong>Hinweis:</strong> <strong>Dies ist ein rein fiktives Szenario, das zu Demonstrationszwecken erstellt wurde. </strong>Den Hurrikan ELARA-26 gibt es nicht. Die Standorte der Einrichtungen basieren auf echten, öffentlich zugänglichen geografischen Daten (dem Datensatz „Military Installations, Ranges, and Training Areas [MIRTA]“ des US-Verteidigungsministeriums [DoD]), aber alle operativen Daten wie Personalzahlen, Unterbringungskapazitäten, Ressourcen, Kontakt-E-Mails und Missionsprofile sind frei erfunden. Nichts in dieser Demo spiegelt die tatsächliche militärische Einsatzbereitschaft, Fähigkeiten oder operative Abläufe wider.</p><h2>Warum eine automatisierte Katastrophenreaktion georäumliche und agentische Koordination erfordert</h2><p>Wenn eine Naturkatastrophe kritische Infrastrukturen bedroht, ist die Koordinationsherausforderung unmittelbar:</p><ul><li><p>Welche Einrichtungen befinden sich in der Gefahrenzone?</p></li><li><p>Wie viele Einsatzkräfte müssen versetzt werden?</p></li><li><p>Wohin können sie gehen und verfügen diese Einrichtungen über Kapazitäten?</p></li><li><p>Wer muss jetzt benachrichtigt werden?</p></li></ul><p>Diese Fragen können nicht warten. Und das sollten die Antworten auch nicht.</p><h2>Pipeline bereitstellen: Voraussetzungen und Einrichtung</h2><p>Befolgen Sie die Anweisungen <a href="https://github.com/tehbooom/elastic_natural_disaster/blob/main/README.md">hier im Beispiel-Repo</a>, um über <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> einen lokalen Elastic-Cluster mit Elastic Inference Service (EIS) bereitzustellen.</p><h2>Wie die agentische Katastrophenreaktions-Pipeline von Elasticsearch funktioniert</h2><p>Die Pipeline hat sieben Schichten, die durchgängig zusammenarbeiten:</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>Dateningestion:</strong> Katastrophenereignisse des Global Disaster Alert and Coordination System (GDACS) werden an Elasticsearch gesendet</p></li><li><p>I<strong>ngest-Pipeline</strong>: GeoJSON wird eingelesen und an das Elastic Common Schema (ECS) angepasst.</p></li><li><p><strong>Geodaten-Anreicherung:</strong> Das Polygon des betroffenen Bereichs des Ereignisses wird mit indexierten Grenzen von Militäreinrichtungen abgeglichen.</p></li><li><p><strong>Alerting:</strong> Eine Kibana-Erkennungsregel wird ausgelöst, wenn sich eine Katastrophe mit einer Installation überschneidet.</p></li><li><p><strong>Workflow-Automatisierung:</strong> Die Warnung löst einen Kibana-Workflow aus, der eine Unterhaltung mit einem KI-Agenten startet.</p></li><li><p><strong>KI-Argumentation:</strong> Der Agent analysiert die betroffenen Einrichtungen, deren Assets und die nächstgelegenen unterstützenden Einrichtungen, um die Verlagerung aller Ressourcen und des Personals zu bestimmen.</p></li><li><p><strong>E-Mail-Benachrichtigungen</strong>: Der Agent versendet E-Mails an alle Empfänger für ein- und ausgehendes Personal und/oder Assets.</p></li></ol><p>Sehen wir uns die einzelnen Schichten einmal an.</p><h2>Schritt 1: Indexieren von militärischen Einrichtungen mit Geo-Grenzen</h2><p>Die Grundlage bildet der DoD-MIRTA-Datensatz von <a href="https://source.coop/seerai/hifld/military-installations-ranges-and-training-areas-mirta-dod-sites---boundaries">source.coop/seerai/hifld</a>. Dieser Datensatz stellt für jede Installation eine geo_shape vom Typ Point bereit; es werden Zentroid-Koordinaten statt vollständiger Grenzpolygone verwendet.</p><p>Jedes Installationsdokument im Index „mitra-facilities“ wird mit operativen Profildaten (alle fiktiv) angereichert – über das hinaus, was MIRTA bereitstellt:</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>Dieser umfangreiche Index ermöglicht es dem KI-Agenten, intelligente Zuweisungsentscheidungen zu treffen; nicht nur „hier sind nahegelegene Stützpunkte“, sondern „hier sind Stützpunkte mit verfügbarer Unterbringungskapazität, kompatiblen Missionstypen und der Logistik, um eingehende Ressourcen aufzunehmen.“</p><h2>Schritt 2: Ingestieren und Normalisieren von GDACS-Ereignissen</h2><p>GDACS veröffentlicht Echtzeit-GeoJSON für Erdbeben, tropische Wirbelstürme, Überschwemmungen, Waldbrände, Vulkane und Dürren. Wir importieren diesen Feed in einen Datenstream (logs-gdacs.events-*) mithilfe einer benutzerdefinierten Ingest-Pipeline, die das rohe GeoJSON auf ECS-Felder normalisiert.</p><p>Die GDACS Ingest-Pipeline erledigt mehrere Dinge, die es zu beachten gilt:</p><p><strong>Geometrieextraktion:</strong> Der Zentroid wird für die Kartenanzeige als geo_point gespeichert und das Auswirkungspolygon wird als geo_shape in gdacs.affected_area gespeichert, bei dem es sich um das Feld handelt, das später für Schnittmengenabfragen verwendet wird.</p><p><strong>Normalisierung der Schweregrade:</strong> Jede Art von Katastrophe hat eine andere Schweregradskala. Ein tropischer Wirbelsturm wird anhand der Windgeschwindigkeit in km/h gemessen; ein Erdbeben anhand der Richter-Magnitude. Die Pipeline ordnet sie alle einem normalisierten Score von 0–100 zu:</p>// einfacher Code-Snippet aus der 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>Der normalisierte Schweregradwert wird dann einem severity_level-Label (low, medium, high, critical) zugeordnet, das für das Alert-Schweregrad-Mapping in der Erkennungsregel verwendet wird.</p><p><strong>ECS-Ausrichtung:</strong> event.kind: alert, event.category: Bedrohung, Zeitstempel auf event.start/event.end abgebildet, und eine stabile, fingerprintbasierte _id zur Deduplizierung.</p><h2>Schritt 3: Georäumliche Anreicherung: Ermitteln betroffener Einrichtungen zur Indexzeit</h2><p>Die geo_match-Anreicherungsrichtlinie von Elasticsearch gleicht das Katastrophenpolygon beim Indexieren mit jeder Installationsgrenze ab, ohne dass ein Join zum Abfragezeitpunkt erforderlich ist. Anstatt zum Suchzeitpunkt eine Abfrage durchzuführen, verwenden wir einen <strong>Anreicherungsprozessor</strong> in der Ingest-Pipeline, um das Auswirkungspolygon der Katastrophe <em>beim Indexieren des Dokuments</em> mit jeder Installationsgrenze abzugleichen.</p><p>Die Anreicherungsrichtlinie ist eine geo_match-Richtlinie:</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>Der Prozessor wird am Ende der Ingest-Pipeline ausgeführt:</p>{
  "enrich": {
    "policy_name": "facilities-geo",
    "field": "gdacs.affected_area",
    "target_field": "affected_facilities",
    "shape_relation": "INTERSECTS",
    "max_matches": 128
  }
}<p>INTERSECTS erfasst jede Anlage, deren Begrenzung das Katastrophenpolygon berührt oder überlappt, und sogar partielle Überschneidungen. Das Ergebnis ist, dass jedes GDACS-Ereignisdokument mit einem verschachtelten affected_facilities-Array gespeichert wird, das uns genau verrät, welche Anlagen sich in der betroffenen Zone befinden. Keine Join-Abfrage erforderlich.</p><h2>Schritt 4: Erkennungsregel: Alerting bei Auswirkungen auf Einrichtungen</h2><p>Eine Kibana-Erkennungsregel überwacht den logs-gdacs.events-* Datenstrom und wird ausgelöst, wenn ein GDACS-Ereignis mit mindestens einer betroffenen Einrichtung angereichert wurde:</p>Abfrage: affected_facilities: { entity_name: * }<p>Die Regel wird stündlich ausgeführt (deckt ein Zeitfenster von jetzt-1h bis jetzt ab) und verwendet dynamisches Schweregrad-Mapping; das gdacs.severity_level- Feld, das von der Ingest-Pipeline berechnet wird, steuert den Alert-Schweregrad automatisch.</p><p>Der Alert-Schweregrad bestimmt die Risikobewertung auch über das Feld-Mapping:</p>"risk_score_mapping": [
  {
    "field": "gdacs.normalized_severity",
    "operator": "equals",
    "value": ""
  }
]<p>Wenn die Regel ausgelöst wird, übergibt sie den vollständigen Alert-Kontext, einschließlich des angereicherten affected_facilities-Arrays mit Installationsnamen, -typen und -standorten, an einen nachgelagerten Kibana-Workflow.</p><h2>Schritt 5: Workflow-Automatisierung: Verbindung von Alarm und Agent</h2><p>Kibana-Workflows übernehmen die Übergabe von der Erkennung zur Reaktion. Der Workflow zur Reaktion auf Naturkatastrophen wird durch den Alarm ausgelöst:</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>Die gesamte Alert-Payload (Katastrophentyp, Schweregrad, betroffenes Gebiet und die Liste der betroffenen Installationen) wird als anfänglicher Kontext an den KI-Agenten weitergeleitet. Ab hier übernimmt der Agent.</p><h2>Schritt 6: Der KI-Agent: Von Daten zu koordinierter Aktion</h2><p>Der mitra.response-Agent übernimmt die vollständige Alert-Payload und bewertet in einer einzigen agentenbasierten Schleife den Umfang, ermittelt Aufnahmeeinrichtungen, weist Personal zu und versendet Evakuierungs- und Aufnahmebenachrichtigungen – alles ohne menschliches Eingreifen.</p><p>Dem Agenten stehen zwei Tools zur Verfügung:</p><ul><li><p><strong>mitra.nearest_facility</strong>fragt den Index „mitra-facilities“ mithilfe einer geo_shape-Abfrage ab, sortiert nach der Entfernung von einer angegebenen Koordinate, und gibt bis zu 50 aktive Installationen in der Nähe mit verfügbarer Kapazität zurück.</p></li><li><p><strong>mitra.send_email</strong> iteriert über ein JSON-Array von Einrichtungsobjekten und versendet formatierte Evakuierungs- oder Aufnahmebenachrichtigungen.</p></li></ul><p>Der Anweisungssatz des Agenten definiert einen klaren Workflow:</p><ol><li><p><strong>Bewerten der Situation.</strong> Parsen Sie den Alert, identifizieren Sie betroffene Einrichtungen und bestimmen Sie das Ausmaß der Katastrophe.</p></li><li><p><strong>Inventarisieren, was verschoben werden muss.</strong> Mitarbeiterzahlen, kritische Assets, Unterbringungsanforderungen pro Einrichtung.</p></li><li><p><strong>Zieleinrichtungen ermitteln.</strong> Rufen Sie mitra.nearest_facility für jede betroffene Installation auf, wobei Einrichtungen herausgefiltert werden, die sich noch in der Gefahrenzone befinden.</p></li><li><p><strong>Zuteilungsentscheidungen treffen.</strong> Wägen Sie Single- versus Multi-Facility-Lösungen, Zweigstellenkompatibilität, Unterbringungskapazität und Asset-Support ab.</p></li><li><p><strong>Koordinierungs-E-Mails senden.</strong> Evakuierungsanordnungen an Ausgangseinrichtungen und Aufnahmebenachrichtigungen an Aufnahmeeinrichtungen übermitteln.</p></li><li><p><strong>Einen zusammenfassenden Bericht erstellen. </strong>Erstellt eine kurze Zusammenfassung aller betroffenen Einrichtungen, des gesamten Personals, der verschobenen Assets, der Zieleinrichtungen und etwaiger Bedenken zur Überprüfung im Chat.</p></li></ol><p>Die Zuweisungslogik des Agenten folgt realen Einschränkungen: Unterbringungskapazitäten nicht überschreiten, wenn möglich Versetzungen innerhalb desselben Zweigs bevorzugen, gemeinsame Stützpunkte bei zweigübergreifendem Überlauf nutzen und die Entfernung priorisieren, um die Transitzeit zu minimieren.</p><h3>Das Tool für die nächstgelegene Einrichtung</h3><p>Die zugrunde liegende Workflow-Abfrage verwendet geo_shape mit einem circle-Filter und einer _geo_distance-Sortierung:</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>Die verfügbare Kapazität wird zum Abfragezeitpunkt über ein Skriptfeld berechnet, das die Unterbringungskapazität abzüglich des aktuellen Personalbestands ermittelt. Der Agent verwendet dies, um Personal auf Zielorte zu verteilen, ohne Grenzen zu überschreiten.</p><h2>Hurrikan ELARA-26: agentische Koordination von 137.000 Einsatzkräften, von Anfang bis Ende</h2><p>Hurrikan ELARA-26 ist ein Sturm der Kategorie 4 (maximale Windgeschwindigkeit von 213 km/h), der laut Vorhersage im Gebiet Hampton Roads in Virginia auf Land treffen wird. Wenn das GDACS-Ereignis aufgenommen wird, schneidet das Polygon des betroffenen Gebiets sieben wichtige Militäreinrichtungen in der Region. Die Erkennungsregel wird ausgelöst. Der Workflow startet eine Agentenkonversation.</p><p>Innerhalb einer einzelnen agentischen Schleife führt der Agent Folgendes aus:</p><ul><li><p>Sieben Einrichtungen in der Einschlagszone wurden identifiziert, mit insgesamt 137.372 Einsatzkräften.</p></li><li><p>mitra.nearest_facility wurde angerufen, um Empfangseinrichtungen außerhalb des Sturmpfads zu finden.</p></li><li><p>Einsatzkräfte wurden basierend auf der verfügbaren Unterbringungskapazität und Entfernung auf neun Aufnahmeeinrichtungen verteilt.</p></li><li><p>Evakuierungsanordnungen wurden für alle sieben betroffenen Anlagen erstellt und versandt.</p></li><li><p>Aufnahmebenachrichtigungen wurden erstellt und an alle neun empfangenden Einrichtungen versandt.</p></li><li><p>Eine vollständige Koordinationszusammenfassung wurde erstellt, ähnlich wie unten:</p></li></ul><p><strong>Evakuierte Einrichtungen:</strong></p><p>Einrichtung</p><p>Einsatzkräfte</p><p>Naval Station Norfolk</p><p>50.000</p><p>Joint Expeditionary Base Little Creek-Fort Story</p><p>18.000</p><p>Naval Air Station Oceana</p><p>15.355</p><p>Naval Air Station Oceana Dam Neck Annex</p><p>17.509</p><p>NG State Military Reservation Camp Pendleton</p><p>9.707</p><p>Joint Base Langley-Eustis</p><p>15.000</p><p>Naval Weapons Station Yorktown</p><p>11.801</p><p><strong>Aufnahmeeinrichtungen:</strong></p><p>Einrichtung</p><p>Distanz</p><p>Eingehende Einsatzkräfte</p><p>Fort Gregg-Adams</p><p>97 km</p><p>~40.000</p><p>Marine Corps Base Quantico</p><p>148 km</p><p>~30.000</p><p>Naval Support Facility Indian Head</p><p>151 km</p><p>~30.000</p><p>Joint Base Andrews</p><p>180 km</p><p>~30.000</p><p>Naval Air Station Patuxent River</p><p>141 km</p><p>~10.000</p><p>NG MTA Camp Butner</p><p>174 km</p><p>~5.000</p><p>NG Bethany Beach Training Site</p><p>209 km</p><p>~4.707</p><p>Rivanna Station</p><p>140 km</p><p>~7.500</p><p>Def Gen Supply Center</p><p>22 km</p><p>~6.000</p><p>Zu den verlegten Einsatzmitteln gehören Transportfahrzeuge, Hubschrauber, Patrouillenboote, medizinische Einheiten, Pionierfahrzeuge, Generatoren, Wassertankanhänger, Notunterkunfts-Sets und Kommunikationssysteme.</p><h3>Automatisierte E-Mail-Benachrichtigungen</h3><p>Sobald der Agent seinen Zuweisungsplan fertiggestellt hatte, rief er mitra.send_email auf und versandte in einem einzigen Durchlauf 16 E-Mails, nämlich Evakuierungsanordnungen an alle sieben betroffenen Einrichtungen und Aufnahmebenachrichtigungen an alle neun aufnehmenden Einrichtungen. Jede Nachricht enthielt die Zieleinrichtung, die Anzahl der eintreffenden Personen, die zu verlegenden Assets und einen Ansprechpartner für die Koordination. Was andernfalls Stunden an Telefonketten erfordert hätte, wurde automatisch erledigt, sobald der Agent seine Überlegungen abgeschlossen hatte.</p><h3>Erweiterung der agentischen Katastrophenreaktion mit RAG und Richtlinienverankerung</h3><p>Diese Demo basiert rein auf strukturierten Daten wie Kapazitätszahlen, Entfernungen und Betriebsstatus. Die Funktionen von Elastic für semantische Suche und Retrieval-Augmented Generation (RAG) können den Agenten durch zwei Ergänzungen deutlich intelligenter machen:</p><p><strong>Abruf historischer Reaktionen:</strong> Indexieren Sie frühere After-Action-Berichte, Vorfallszusammenfassungen der Federal Emergency Management Agency (FEMA) und Einträge zur Katastrophenreaktion als Vektoreinbettungen. Wenn ein neues Ereignis ausgelöst wird, kann der Agent semantisch abrufen, wie ähnliche Ereignisse gehandhabt wurden, und so Zuteilungsentscheidungen mit institutionellem Wissen statt reiner Kapazitätsberechnung fundieren.</p><p><strong>Verankerung in Richtlinien und Doktrin:</strong> Indexieren Sie DoD-Richtlinien für das Notfallmanagement, Pläne zur Aufrechterhaltung des Betriebs der Einrichtung und Anweisungen des Kommandeurs. Der Agent kann die tatsächlichen Richtlinien abrufen und zitieren, die eine Reaktion regeln, und so sicherstellen, dass jede Entscheidung in der Doktrin und nicht in Schlussfolgerungen verankert ist.</p><p>Beide folgen demselben Elastic-nativen Ansatz:; Eine Inferenz-Pipeline generiert Einbettungen beim Indexieren, und dem Agenten wird ein Tool für die semantische Suche bereitgestellt. Die Koordinierungs-Pipeline bleibt unverändert. Der Agent wird einfach intelligenter.</p><h2>Warum Elasticsearch die richtige Plattform für die agentische Reaktion im öffentlichen Sektor ist</h2><p>Das ist kein Chatbot. Es ist kein Dashboard. Es ist ein responsives agentisches Workflow-System – eines, das eine Bedrohung erkannt, ein komplexes Logistikproblem durchdacht und die Versetzung von 137.000 Menschen ohne menschliche Beteiligung koordiniert hat. Ein solches Ergebnis ist nur möglich, weil jede Funktion, auf die es angewiesen ist, auf einer einzigen, einheitlichen Plattform liegt.</p><p>Die Geodatenunterstützung von Elasticsearch (geo_point, geo_shape, Anreicherungsrichtlinien und entfernungsbasierte Sortierung) übernimmt das räumliche Denken, das Schnittpunkterkennung und die Standortsuche im großen Maßstab möglich macht. Semantische Suche und Vektor-Einbettungen verankern Agenten in der Realität und stellen sicher, dass KI-Schlussfolgerungen auf den tatsächlichen Inhalten Ihrer Daten basieren und nicht auf halluzinierten Annahmen. Die Erkennungs-Engine, Workflows, der Agent Builder und die Agent Builder-Tools von Kibana verbinden all dies zu einer Pipeline, die vom Rohereignis bis zur koordinierten Aktion reicht – ganz ohne externen Glue-Code.</p><p>Keine andere Plattform bringt dies so zusammen wie Elastic. Die Kombination aus Echtzeit-Indexieren, georäumlicher Präzision, semantischem Abrufen und agentischer Orchestrierung in einem einzigen Stack mit integrierter Sicherheit und Beobachtbarkeit auf Enterprise-Niveau unterscheidet Elastic von Tools, die eine dieser Aufgaben zwar gut bewältigen, bei denen Sie den Rest jedoch selbst zusammenfügen müssen.</p><h2>Agentische georäumliche Reaktion für Notfallmanagement, Feuerwehr, Strafverfolgung und öffentliche Gesundheit</h2><p>Dieselbe Architektur gilt überall dort, wo Menschen, Einrichtungen und Echtzeitereignisse aufeinandertreffen. Die spezifischen Daten ändern sich. Die Pipeline nicht.</p><p><strong>Katastrophenschutz:</strong> FEMA und die Katastrophenschutzbehörden der Bundesstaaten können Standorte von Notunterkünften, Bereitstellungsräume und gefährdete Bevölkerungsgruppen mit eingehenden Unwetter-Polygonen des National Weather Service (NWS) abgleichen und so die automatisierte Vorabpositionierung von Ressourcen auslösen, bevor ein Sturm das Festland erreicht.</p><p><strong>Feuerwehr und Rettungsdienste:</strong> Feuerwehren können die Standorte von Einheiten und Reaktionszonen mit Waldbrandgrenzen oder Gebäudebrand-Clustern überlagern und Anforderungen für überörtliche Hilfe automatisch an die nächstgelegenen verfügbaren Einheiten mit der passenden Ausrüstung weiterleiten.</p><p><strong>Strafverfolgung:</strong> Behörden können Standorte aktiver Vorfälle mit Schulzonen, kritischer Infrastruktur und den Positionen von Einsatzkräften korrelieren und so ohne Warten auf eine manuelle Triage standortbezogene Lockdown-Benachrichtigungen oder die Entsendung von Ressourcen auslösen.</p><p><strong>Sicherheit an öffentlichen Schulen:</strong> Schulbezirke können Bedrohungsfeeds in Echtzeit im Hinblick auf Campusgrenzen überwachen. Wenn eine Bedrohung die Grenzen eines Schulgeländes überschreitet, kann ein Agent sofort die Schulleitung benachrichtigen, die Lockdown-Kommunikation einleiten und die Reaktion der Strafverfolgungsbehörden koordinieren – noch bevor ein Disponent zum Telefon greift.</p><p><strong>Öffentliches Gesundheitswesen:</strong> Gesundheitsbehörden können Daten zur Krankheitsüberwachung oder Umweltgefahrenzonen mit Klinikstandorten, Ebenen zur Bevölkerungsdichte und Beständen in Versorgungsdepots abgleichen, um Ressourcen dorthin zu leiten, wo sie am dringendsten benötigt werden.</p><p>Sektor</p><p>Anwendungsfall</p><p>Fähigkeit von Elastic</p><p>Notfallmanagement</p><p>Standorte von Notunterkünften mit NWS-Unwetterpolygonen abgleichen</p><p>geo_shape-Anreicherung + Kibana-Workflows</p><p>Feuerwehr und Rettungsdienst</p><p>Einheitenstandorte mit Waldbrandperimetern überlagern</p><p>geodatenbasiertes Routing + Abfrage der nächstgelegenen Einrichtung</p><p>Strafverfolgung</p><p>Vorfälle mit Schulzonen und Positionen von Beamten korrelieren</p><p>standortbezogene Alert-Regeln + Agent-Dispatch</p><p>Sicherheit an öffentlichen Schulen</p><p>Überwachen von Bedrohungsfeeds im Hinblick auf Campus-Perimeter</p><p>Erkennungsregeln + automatische Benachrichtigung</p><p>Öffentliche Gesundheit</p><p>Gefahrenzonen mit Klinikstandorten und Versorgungslagern abgleichen</p><p>semantische Suche + geodatenbasierte Anreicherung</p><p>Die Daten sind in jedem Szenario unterschiedlich. Das zugrunde liegende Muster aus Ingest, Datenanreicherung zur Indexzeit, Erkennung von Schnittmengen, Auslösen einer agentischen Reaktion und Handeln ist immer dasselbe. Elastic bietet Organisationen im öffentlichen Sektor die Platform, es einmal zu entwickeln und überall anzupassen.</p><p><em>Die Entscheidung über die Veröffentlichung der in diesem Blogeintrag beschriebenen Leistungsmerkmale und Features sowie deren Zeitpunkt liegt allein bei Elastic. Es ist möglich, dass noch nicht verfügbare Leistungsmerkmale oder Features nicht rechtzeitig oder überhaupt nicht veröffentlicht werden.</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[Agentische KI]]></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 in Kibana rendert jetzt nativ Dashboards]]></title>
    <description><![CDATA[Der Elastic AI Chat in Kibana erstellt jetzt Dashboards aus natürlicher Sprache, wobei Ihre Visualisierungen und Analysen in einem Thread beibehalten werden und Sie diese als wiederverwendbare Kibana-Objekte speichern können.]]></description>
    <content:encoded><![CDATA[<p>Der <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Elastic AI Chat</a> in Kibana wandelt jetzt Fragen in einfacher Sprache in <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>-gestützte <strong>Visualisierungen</strong> oder ein vollständiges <strong>Dashboard</strong> um – direkt innerhalb Ihrer <strong>Konversation</strong>. Beschreiben Sie die Metriken, die Sie benötigen, verfeinern Sie diese im Laufe des Prozesses und speichern Sie, wenn die Geschichte feststeht. Alles <strong>bleibt in der Konversation</strong>, bis Sie bereit sind, es zu <strong>speichern</strong>, dann wird es zu einem erstklassigen Kibana-Objekt, das Ihr Team öffnen, bearbeiten und wiederverwenden kann. Als technische Vorschau in Elastic 9.4 verfügbar</p><p>Der Agent erstellt Dashboards von Grund auf, arbeitet aber auch damit, was Sie bereits haben. Öffnen Sie die AI Chat-Seitenleiste, während Sie ein Dashboard aufrufen, dann wird es <strong>automatisch</strong> <strong>angehängt</strong>. Fragen Sie nach den Gründen für den plötzlichen Anstieg einer Kennzahl, analysieren Sie die Ergebnisse nach Regionen oder fügen Sie ein Vergleichspanel hinzu. Ihr bestehendes Dashboard wird zum <strong>Ausgangspunkt</strong>, nicht nur zum Endprodukt.</p><h2>Hinter den Kulissen: So erstellen wir Dashboards im AI Chat</h2><p>Wir vermitteln den Agenten spezifische Aufgaben durch <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-skills">Fertigkeiten</a> – strukturierte Beschreibungen, wie man ein bestimmtes Problem angeht. Aber eine Dashboard-Fähigkeit aufzubauen bedeutete, einem LLM beizubringen, gültige Kibana-Dashboards zu generieren, und die alte Saved Object-API gestaltete dies schwierig: Umständlich verschachteltes JSON, subtile Änderungen von Version zu Version, ungenaue Referenzen. Wir brauchten einen anderen Ansatz</p><h3>Eine speziell entwickelte API für programmatische Dashboards</h3><p>Die neue <a href="https://dashboardsapispec.kibana.dev/dashboards.html">Dashboards-API</a> wurde genau für dieses Szenario entwickelt. Statt den internen Rohzustand offenzulegen, bietet es typisierte, validierte Schemata für jeden Paneltyp. Die API übernimmt die Übersetzung zwischen sauberen externen Strukturen und den internen Darstellungen von Kibana, sodass sich der Agent auf den Inhalt des Dashboards konzentrieren kann, anstatt auf dessen Formatierung.</p><h3>Eine Fähigkeit, ein Tool, viele Einsatzmöglichkeiten</h3><p>Der <code>dashboard-management</code> Skill stellt ein einzelnes <code>manage_dashboard</code> Tool zur Verfügung, das eine geordnete Reihe von <strong>Abläufen</strong> akzeptiert. Jeder Ablauf zählt als einzelne Aktion: Metadaten festlegen, ein Markdown-Panel hinzufügen, ES|QL-basierte Visualisierungen aus natürlicher Sprache erstellen, vorhandene Panels bearbeiten, Panels in ausklappbare Abschnitte gruppieren oder Elemente im Raster neu positionieren.</p><p>Der Agent kann in einem einzigen Aufruf ein komplettes Dashboard beschreiben: Titel, Beschreibung, Abschnitte und jedes darin enthaltene Panel:</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>Die Abläufe werden der Reihe nach ausgeführt, sodass spätere Schritte auf frühere verweisen und darauf aufbauen können. Dieses Design lenkt den Fokus der Konversation auf die Absicht und nicht auf Details der Umsetzung.</p><h3>Die Visualisierungspipeline: Natürliche Sprache zu ES|QL zu Visualisierungen</h3><p></p><p>Wenn Sie nach einem Dashboard fragen, untersucht der Agent Ihre Daten – Indizes, Feld-Mappings, Typen – plant dann die Visualisierungen und ruft manage_dashboard auf.</p><p>Jedes Panel durchläuft seine eigene Pipeline: Auswahl des Diagrammtyps, ES|QL-Generierung, Visualisierungskonfiguration und Validierung. Wir haben dies vom Haupt-Agent-Thread isoliert – die Erstellung der Visualisierung erfordert mehrere Modellaufrufe pro Panel, und die Einbindung in den Hauptkontext würde das Fenster aufblähen und die Argumentation schwächen.</p><p>Im manage_dashboard werden alle Panels gleichzeitig erstellt und dann in der richtigen Reihenfolge neu zusammengesetzt. Das Ergebnis ist ein vollständiges Dashboard mit eingebetteten Panels – keine verwaisten Visualisierungen, keine Synchronisierungsprobleme.</p><h3>Warum wir die Erstellung von Visualisierungen in das Dashboard-Tool verlagert haben</h3><p>Bei unserem ersten Ansatz haben wir ein separates create_visualization Tool verwendet – ein Aufruf pro Panel, um dann jeden Anhang an das Dashboard-Tool zu übergeben. Es funktionierte, aber jede Visualisierung brauchte ihren eigenen Tool-Aufruf, ihren eigenen Lebenszyklus und eine explizite Übergabe. Schlimmer noch, die Bearbeitung einer Visualisierung in der Konversation aktualisierte das Dashboard-Panel nicht, was die Nutzer verwirrte.</p><p>Wir haben die Erstellung von Visualisierungen direkt in manage_dashboard integriert. Es werden die gleichen parallelen Workflows ausgeführt, Panels jedoch ohne Zwischenanhänge zur Dashboard-Struktur zusammengesetzt. Weniger Aufrufe, keine Synchronisierungsprobleme, ein Lebenszyklus.</p><p>Einzelne Visualisierungen funktionieren weiterhin – Sie können bestehende Diagramme über Anhangsreferenzen in ein Dashboard einfügen – aber für die Erstellung von Grund auf ist die Inline-Erstellung der bessere Weg.</p><h2>Für Sicherheitsteams</h2><p>SOC-Analysten und Detection Engineers können es sich nicht leisten, mitten in einer Untersuchung zum Dashboard-Editor zurückzukehren. Mit dem AI Chat können Sie das Alarmvolumen nach Regeltyp, Host oder MITRE-Taktik abfragen und es in etwa einer Minute in Ihrem Thread sehen. Während die Suche fortschreitet, fügen Sie Panels hinzu – Anomalien bei der Prozessausführung, Netzwerkverbindungen, Zeitachsenvergleiche – ohne den Kontext zu unterbrechen.</p><p>Speichern Sie, wenn Sie fertig sind. Das Dashboard dient als Referenz für die Überprüfung nach Vorfällen, als Ausgangspunkt für den nächsten Analysten oder als wöchentliches Briefing zu Bedrohungen – eine erneute Erklärung ist nicht erforderlich.</p><p>Erfahren Sie in diesem <a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">Blogbeitrag</a> mehr darüber, wie Sicherheitsteams Dashboard-Erstellungen und andere kürzlich eingeführte AI Chat-Funktionen nutzen können.</p><h2>Für Observability- und Site Reliability Engineers (SREs)</h2><p>Wenn ein Dienst um 2:00 Uhr nachts ausfällt, haben Sie keine Zeit, Dashboards von Grund auf neu zu erstellen. Mit dem AI Chat kann ein SRE die benötigten Kennzahlen beschreiben (P99-Latenz nach Dienst, Fehlerquote bei Deployment-Ereignissen, Pod-Neustarts in der letzten Stunde) und in etwa einer Minute ein vollständiges Dashboard im Untersuchungs-Thread erhalten. Der Agent kann die Darstellung schrittweise verfeinern, sobald sich das Bild klärt: Ein Panel hinzufügen, das Zeitfenster ändern, nach Regionen aufschlüsseln.</p><p>Speichern Sie das Dashboard, dann ist es sofort für alle im Lagezentrum verfügbar (gleiche Panels, gleiches Framing), die der Incident Bridge beitreten. Nach dem Vorfall wird es zur Grundlage für die Nachbesprechung.</p><h2>Was kommt als Nächstes?</h2><p>Wir arbeiten an der Token-Optimierung, reichhaltigeren Vollbild-Interaktionen, breiterer Panel-Unterstützung und kontinuierlichen Qualitätsverbesserungen. Die technische Vorschau ist der richtige Zeitpunkt, um Prioritäten zu setzen – falls etwas fehlt, teilen Sie uns dies über das Symbol „<strong>Feedback einreichen</strong>“ im oberen Menü mit.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6783ac3a6540ba5b/6a17dd804b055d813e4320e0/1bb71a01a12641961134f2231778344a6249e8f4-1490x634.png" alt="Die Dashboard-Verwaltungsseite zeigt eine Liste mit einem Eintrag mit dem Titel „[OTel] Host Details – Überblick“, Filter, eine Suchleiste, eine Schaltfläche „Dashboard erstellen“ und die Möglichkeit, Feedback zu senden." /><h2>Ausprobieren</h2><p>Führen Sie ein Upgrade auf <strong>Elastic 9.4</strong> durch (oder starten Sie eine Testversion), öffnen Sie den <strong>AI Chat </strong>im Vollbildmodus und probieren Sie ihn bei einer echten Untersuchung aus. Bitten Sie den Agenten, die von Ihnen betrachteten Kennzahlen grafisch darzustellen, und um die nächste Aufschlüsselung. Wenn die Geschichte stimmt, speichern und teilen Sie sie – gleiche Panels, gleiches Framing, keine erneute Erklärung nötig. Erfordert eine Unternehmenslizenz (<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Jetzt loslegen</a>).
<em>Die Entscheidung über die Veröffentlichung der in diesem Blogbeitrag beschriebenen Leistungsmerkmale und Features sowie deren Zeitpunkt liegt allein bei Elastic. Es ist möglich, dass noch nicht verfügbare Leistungsmerkmale oder Features nicht rechtzeitig oder überhaupt nicht veröffentlicht werden.</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]]></dc:creator>
    <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Kibana reduziert die Dashboard-Ladezeit um bis zu 25 % – hier ist die Polling-Strategie dahinter]]></title>
    <description><![CDATA[Erfahren Sie, wie Kibana durch kontinuierliches Polling und browserseitige HTTP/2-Erkennung die Ladezeiten des Dashboards um bis zu 25 % verkürzt und dabei automatisch auf HTTP/1 zurückgreift.]]></description>
    <content:encoded><![CDATA[<p>Dank kontinuierlichem Polling laden Kibana-Dashboards und Discover jetzt bis zu 25 % schneller. Anstatt zwischen periodischen Prüfungen zu schlafen, hält Kibana jetzt HTTP-Verbindungen offen und liefert Elasticsearch-Abfrageergebnisse, sobald sie bereit sind. Bei HTTP/2+ (dem Kibana-Standard seit Version 9.0) wird dies automatisch aktiviert, ohne dass eine Konfiguration erforderlich ist. Bei HTTP/1 greift Kibana auf das traditionelle Polling zurück, um eine Erschöpfung des Verbindungspools zu verhindern.</p><h2>Wie Kibana Daten beim Laden eines Dashboards abruft</h2><p>Wenn ein Dashboard geöffnet wird, starten die meisten Panels (intern nennen wir diese <em>Embeddables</em>) eine oder mehrere Elasticsearch-Abfragen. Statt des einfachen Ruf-und-Antwort-Spiels einer synchronen (Sync-)Suche nutzen wir jedoch die Kraft der asynchronen (Async-)Suche (<a href="https://www.elastic.co/docs/solutions/search/async-search-api">docs</a>).</p><p>Bei asynchroner Suche werden Abfrageergebnisse in Elasticsearch außerhalb einer bestimmten HTTP-Anfrage verfügbar gehalten. Das ist wichtig, weil es</p><ul><li><p>das Laden von Daten widerstandsfähig gegen Netzwerkturbulenzen macht</p></li><li><p>betreibt unser <a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">Hintergrundsuch-Feature</a>, das es den Nutzern ermöglicht, an anderen Dingen in Kibana zu arbeiten, während sie auf ein länger laufendes Dashboard oder eine Discover-Sitzung warten</p></li></ul><p>Nachdem die erste Abfrage abgeschickt wurde, überwacht Kibana die Suche, um festzustellen, wann sie abgeschlossen ist, und ruft dann das Ergebnis-Set ab.</p><h3>Wie sich traditionelle Umfragen auf die Ladezeiten des Kibana-Dashboards auswirken</h3><p>Im traditionellen Polling reicht Kibana eine Abfrage ein, schließt die Anfangsverbindung und überprüft dann regelmäßig Elasticsearch auf Abschluss.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Diagramm, das die traditionelle Abfrage in Kibana zeigt. Die Kibana-Timeline zeigt eine kurze Verbindungsaufbauphase nach der Abfrageeinreichung, gefolgt von einer langen Leerlaufphase, dann einer kurzen Statusabfrage und schließlich der Ergebnislieferung. Die Elasticsearch-Zeitachse führt eine Abfrage aus, die mitten in Kibanas Leerlaufphase abgeschlossen wird, was die Koordinationslücke veranschaulicht, die zu Zeitverlusten führt." /><p>Wir geben Elasticsearch nach dem Absenden der Abfrage eine kurze Zeitspanne, um die Suche abzuschließen und die Ergebnisse zu präsentieren. Wenn die Suche so schnell abgeschlossen ist, entspricht dies einem einfachen Aufruf und einer Reaktion. Bei längeren Suchen wird jedoch die erste Verbindung geschlossen und Kibana beginnt, die Suche regelmäßig auf Abschluss zu überprüfen. Das nennt man <em>Polling</em>.</p><h4>Leistungsnachteile traditioneller Abfragen</h4><p>Wenn Sie sich die obige Abbildung ansehen, erkennen Sie vielleicht bereits den Leistungsnachteil dieses Ansatzes: Die Suche wird höchstwahrscheinlich während eines der Ruheintervalle von Kibana abgeschlossen, was zu Zeitverlusten führt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="Zeitstrahldiagramm zur Veranschaulichung der Leistungskosten traditioneller Abfragen. Die Kibana-Zeitleiste zeigt einen Verbindungs-offen-Zeitraum, einen langen Ruhezeitraum, eine Statusabfrage und dann die gelieferten Ergebnisse. Die Elasticsearch-Zeitleiste zeigt, dass die Abfrage mitten im Ruhezustand von Kibana abgeschlossen wurde, gefolgt von einem roten Zeitverlustsegment – der verschwendeten Zeitspanne, bevor Kibana aufwacht und die Ergebnisse abruft." /><p>Im schlimmsten Fall (wenn eine Suche zu Beginn einer Schlafphase abgeschlossen ist) wird die gesamte Dauer des Abfrageintervalls verschwendet.</p><h4>Die Auswirkungen einer Backoff-Strategie</h4><p>Bei Umfragen ist es üblich, eine Backoff-Strategie anzuwenden. Das bedeutet, je länger die Dauer der Suche, desto seltener fragen wir ab.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="Horizontales Balkendiagramm, das den Backoff-Zeitplan von Kibana für das Abfrageintervall nach Abfragedauer zeigt. Abfragen unter 1,5 Sekunden verwenden ein Intervall von etwa 0,5 Sekunden; 1,5–5-Sekunden-Abfragen verwenden 1 Sekunde; 5–20-Sekunden-Abfragen verwenden etwa 2,5 Sekunden; Abfragen über 20 Sekunden verwenden ein 5-sekündiges Abfrageintervall." /><p>Jedoch bedeutet dies auch, dass die potenzielle verlorene Zeit mit der Dauer der Suche skaliert.</p><h4>Wie Abfrageintervalle sägezahnförmige Latenzmuster erzeugen</h4><p>Wenn wir diese Faktoren zusammenfügen, wird unsere verlorene Zeit zu einer schrittweisen Sägezahnfunktion.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="Liniendiagramm, das verlorene Zeit in Sekunden versus Abfrageabschlusszeit in Sekunden zeigt und ein Sägezahnmuster bildet, bei dem verlorene Zeit ansteigt und dann wiederholt auf null sinkt, mit Spitzen, die von unter 1 Sekunde auf 5 Sekunden wachsen, da die Abfragedauer von 0 auf 30 Sekunden steigt." /><p>Hier sind die Spitzenwerte, die Worst-Case-Szenarien, und die Tiefstwerte, die Best-Case-Szenarien, darstellen. Dies zeigt, dass traditionelle Umfragen uns je nach Suchdauer (und Netzwerkbedingungen) zwischen nichts und der gesamten Dauer des Umfrageintervalls kosten.</p><h2>Kontinuierliche Umfragen: Wie Kibana Wartezeiten eliminiert</h2><p>Das Problem bei traditionellem Polling ist ein grundlegender Mangel an Koordination zwischen Kibana und Elasticsearch. Idealerweise weiß Kibana sofort, wenn Ergebnisse verfügbar sind. Was wäre also, wenn wir das Polling-Muster so umkehren würden, dass fast die gesamte Zeit mit der Überprüfung von Elasticsearch verbracht wird und keine Zeit mit Leerlauf?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="Zeitstrahldiagramm zeigt kontinuierliche Abfragen in Kibana. Die Kibana-Zeitleiste ist vollständig blau – die Verbindung bleibt von der Abfrageübermittlung über zwei Verbindungsaktualisierungen bis zur Ergebnislieferung ohne Ruhephasen offen. Die Elasticsearch-Zeitleiste zeigt, dass die Abfrage abgeschlossen ist und die Ergebnisse sofort geliefert werden. Die Legende zeigt „Verlorene Zeit“ durchgestrichen an, was darauf hinweist, dass sie eliminiert wurde." /><p>Durch diese Kombination aus langer Abfragezeit und dem Wegfall von Schlafphasen werden die Ergebnisse geliefert, sobald sie vorliegen.</p><h3>HTTP/1-Verschlechterung</h3><p>Die Theorie ist solide. Warum sieht dieses Kibana Deployment dann so schlecht aus, wenn wir die kontinuierliche Abfrage aktivieren?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="Animierte Bildschirmaufnahme eines Kibana-Dashboards, das den Sample Logs Data-Datensatz lädt und mehrere Panels in der Reihenfolge zeigt, darunter eine Antwortcode-Zeitreihe, eine US-Karte der Gesamtanfragen, die Anzahl der einzigartigen Besucher, HTTP-Fehlerquotenmetriken und ein Sankey-Diagramm der Betriebssystem- und Zieldaten der Maschinen." /><p>Der Schlüssel ist, dass diese Deployment über HTTP/1 läuft. Bei HTTP/1 werden HTTP-Anfragen 1:1 auf TCP-Verbindungen abgebildet. Also beanspruchen mehrere langlebige Polling-Anfragen den begrenzten Verbindungspool des Browsers und führen dazu, dass andere Anfragen in die Warteschlange gestellt werden.</p><p>Bei HTTP/2+ hingegen können Netzwerkanfragen TCP-Verbindungen per Multiplexing teilen, sodass wir dieses Problem vermeiden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Diagramm zum Vergleich von HTTP/1 und HTTP/2 für kontinuierliches Polling in Kibana. HTTP/1 erfordert eine TCP-Verbindung pro Anfrage, wodurch der Verbindungspool des Browsers mit sechs Verbindungen erschöpft wird. HTTP/2 multiplexiert mehrere Polling-Anfragen über eine einzelne TCP-Verbindung, vermeidet Pool-Erschöpfung und erhält die Leistung." /><p>Bei HTTP/2+ ist kontinuierliches Polling also ein Vorteil, bei HTTP/1 hingegen ein Nachteil.</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>TCP-Verbindungen</p><p>Eine pro HTTP-Anfrage</p><p>Multiplexed (viele Anfragen teilen sich Verbindungen)</p><p>Kontinuierliches Abfrageverhalten</p><p>Verschlechtert die Leistung (Erschöpfung des Verbindungspools)</p><p>Voller Nutzen (Ergebnisse sofort verfügbar)</p><h4>Wie Kibana das HTTP-Protokoll für optimales Polling erkennt</h4><p>HTTP/2 ist das empfohlene Protokoll und seit Kibana 9.0 der Standard, daher wäre es schade, diese Leistungsverbesserung nicht auszuliefern. Andererseits ist die Benutzerfreundlichkeit von HTTP/1 so schlecht, dass es nicht vertretbar ist, dieses Risiko bei On-Prem-Deployments einzugehen, die ihr Protokoll noch nicht aktualisiert haben. Die Antwort ist klar: Wir müssen erkennen, welches Protokoll verwendet wird, und die optimale Polling-Strategie anwenden.</p><p>Es ist durchaus möglich, dass der Kibana-Server weiß, welches Protokoll er spricht. Aber es gibt einen Haken: der limitierende Faktor ist der Verbindungspool des Browsers. Das bedeutet, dass es wirklich darauf ankommt, was der <em>Browser</em> spricht.</p><p>Aufgrund von Proxies sind diese nicht immer identisch.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="Architekturdiagramm zeigt drei Komponenten in einer horizontalen Kette: Kibana Server links, einen optionalen Proxy in der Mitte und Kibana Client rechts. Der Server-zu-Proxy-Hop wird mit kibana.yml server.protocol gekennzeichnet und gibt das bekannte Protokoll an. Der Proxy-zu-Client-Hop ist mit drei Fragezeichen gekennzeichnet, was darauf hinweist, dass das Protokoll auf diesem letzten Hop unbekannt ist und abweichen kann." /><p>Wenn wir unsere Optimierung auf das Serverprotokoll stützen würden, könnten wir Dinge auf eine von zwei Arten falsch machen.</p><ol><li><p>Wenden Sie kontinuierliches Polling an, wenn wir es nicht sollten, und verschlechtern Sie die Erfahrung.</p></li><li><p>Wenn Sie die kontinuierliche Abfrage nicht anwenden, verpassen Sie die Optimierung.</p></li></ol><p>Glücklicherweise bieten moderne Browser eine Möglichkeit, das Protokoll des letzten Netzwerk-Hops einer abgeschlossenen Anfrage mithilfe von <code>PerformanceObserver</code> zu ermitteln. Also beobachten wir das Protokoll der ersten Abfrage und optimieren darauf basierend.</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>Laborergebnisse: kontinuierliches Polling vs. traditionelles Polling in Kibana</h2><p>Um kontinuierliche Abfragen zu validieren, erstellten wir Dashboards mit Abfrageverzögerungen von 1–23 Sekunden und maßen Ladezeiten mit und ohne aktivierte Optimierung. Wir luden dann die Dashboards mit und ohne kontinuierliches Polling, um die Gewinne zu messen (wir hatten viel Spaß mit <a href="https://github.com/kertal/race-for-the-prize">race-for-the-prize</a>).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba4af840d8324923/6a1710ceb339d52fe076a0b6/5f19fb45c5307a7491037fe1ad1a302728793203-1200x742.png" alt="Balkendiagramm mit Labortestergebnissen für das kontinuierliche Polling von Kibana: Zeitersparnis gegenüber dem herkömmlichen Polling bei Abfragedauern von 1 bis 23 Sekunden. Die Einsparungen variieren zwischen nahezu null und 4,9 Sekunden, je nachdem, wann die Abfragen im Verhältnis zu den Grenzen des Abfrageintervalls abgeschlossen werden, was das vom Backoff-Plan vorhergesagte sägezahnförmige Latenzmuster bestätigt." /><p>Das Muster ähnelt unserem ursprünglichen Sägezahndiagramm. Für einige Abfragedauern sind die Gewinne gering, während sie bei anderen mehrere Sekunden betragen.</p><h2>Fazit</h2><p>Durch diese Optimierung wird die bei herkömmlichen Abfrageverfahren übliche Latenz erfolgreich durch eine effizientere, kontinuierliche Abfragestrategie ersetzt. Die primäre Herausforderung bestand darin, diese Optimierung unter bestimmten Bedingungen umzusetzen, um eine Leistungsverschlechterung bei HTTP/1-Deployments zu verhindern. Wir lösten es mithilfe des <code>PerformanceObserver</code> des Browsers, um das verwendete Protokoll für den letzten Netzwerkhop zuverlässig zu erkennen.</p><p>Labortests bestätigen die Theorie und zeigen, dass kontinuierliche Abfragen Ergebnisse liefern, sobald diese verfügbar sind. Im Durchschnitt führt dies zu einer deutlichen Verbesserung des Nutzererlebnisses, wodurch das Laden von Daten um bis zu 25 % beschleunigt wird.</p><p>Diese Arbeit ist der jüngste Schritt in unserem Bestreben, die Zeit bis zum Einblick für unsere Nutzer zu verkürzen. Indem wir Kibana zu einem transparenteren Proxy für Elasticsearch-Daten machen, erweitern wir die Leistungsgrenzen innerhalb unseres Einflussbereichs. Fortsetzung folgt!</p><p>(Im Jahr 2025 gab Thomas Neirynk einen <a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">ausgezeichneten Überblick</a> über die Methoden und die Motivation hinter der Verbesserung der Kibana-Dashboard-Leistung. Dies ist ein Update zu dieser 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[Beschreiben statt zeichnen: KI-native Kibana-Dashboards über MCP und ES|QL]]></title>
    <description><![CDATA[Vom Prompt zum Dashboard. Erfahren Sie, wie Sie Kibana-Dashboards in natürlicher Sprache mit example-mcp-dashbuilder erstellen: eine Open-Source-MCP-Anwendung, die ES|QL-Abfragen schreibt, interaktive Diagramme erstellt und voll funktionsfähige Dashboards direkt in Kibana exportiert.]]></description>
    <content:encoded><![CDATA[<p>example-mcp-dashbuilder ist eine Open-Source-MCP-Anwendung, die einen Prompt in einfachem Englisch in ein interaktives Kibana-Dashboard verwandelt – und das alles direkt im Chatfenster Ihres Editors. Beschreiben Sie das gewünschte Dashboard, und die KI ermittelt Ihre Indexstruktur, schreibt korrekte ES|QL-Aggregationen für jede Visualisierung und rendert währenddessen eine Inline-Vorschau. Wenn Sie fertig sind, exportiert ein Befehl ein voll funktionsfähiges Kibana-Dashboard: echte Lens-Visualisierungen, Ihr exaktes Rasterlayout und benutzerdefinierte Farben werden beibehalten. Aktuell werden sechs Diagrammtypen unterstützt, wobei die vollständige Kibana Lens geplant ist.</p><h2>Was ist ein Kibana-Dashboard-Builder?</h2><p>Wie wäre es, wenn Sie das gewünschte Dashboard in einfachem Englisch beschreiben könnten und es dann mit interaktiven Diagrammen, einem Drag-and-Drop-Layout und einem Export nach Kibana mit einem Klick erscheinen würde?</p><p>Genau das macht <a href="https://github.com/elastic/example-mcp-dashbuilder.git"><strong>example-mcp-dashbuilder</strong></a>. Es handelt sich um eine Open-Source-Anwendung (Modellkontextprotokoll (MCP)), die KI-Assistenten mit Elasticsearch verbindet und es Ihnen ermöglicht, vollständige Kibana-Dashboards durch Konversation zu erstellen. Kein Durchklicken durch Menüs. Kein manuelles Schreiben von Visualisierungskonfigurationen. Beschreiben Sie einfach, was Sie benötigen, und die KI untersucht Ihre Daten, schreibt die ES|QL-Abfragen (Elasticsearch Query Language), erstellt die Diagramme und liefert ein lebendiges, interaktives Dashboard – alles im Chatfenster Ihres Editors.</p><h2><strong>Vom Prompt zum Dashboard in Sekunden</strong></h2><p>So sieht das in der Praxis aus. Sie geben beispielsweise Folgendes ein:</p><p>„Erstellen Sie mir ein Web-Traffic-Dashboard aus logstash-* mit Gesamtanfragen, übertragenen Bytes im Laufe der Zeit, wichtigen geografischen Quellen und einer Aufschlüsselung der Antwortcodes.“</p><p>Die KI daraufhin:</p><ol><li><p><strong>Erkennt Ihre Daten:</strong> Listet Indizes auf, inspiziert Feldzuordnungen.</p></li><li><p><strong>Schreibt ES|QL-Abfragen:</strong> Angepasst an Ihr Schema, mit den richtigen Aggregationen.</p></li><li><p><strong>Erstellt Visualisierungen:</strong> Balkendiagramme, Liniendiagramme, Metriken mit Sparklines, Heatmaps, Kreisdiagramme.</p></li><li><p><strong>Organisiert alles:</strong> Zusammenklappbare Abschnitte, aussagekräftige Titel, ordentliches Layout.</p></li><li><p><strong>Rendert eine interaktive Vorschau:</strong> Direkt im Chat, mit Tooltips, einem Zeitwähler und Drag-and-Drop.</p></li></ol><p>Jedes Diagramm wird bei der Erstellung inline angezeigt, sodass Sie den Fortschritt in Echtzeit verfolgen können. Dann zeigt <code>view_dashboard</code> das vollständige Dashboard mit allen Panels, die im 48-spaltigen Raster von Kibana angeordnet sind.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75af5d9042d141b5/6a17e99dbe608675a4004792/dcbf47c4f17bf1a184fb0167408ebeb861ef6c9d-1404x1568.png" alt="Zwei Diagramme, die in der example-mcp-dashbuilder Schnittstelle angezeigt werden. Das erste ist ein vertikales Balkendiagramm mit dem Titel „Wichtige geografische Quellen“, das die Anzahl der Anfragen nach Ländercode zeigt. Das zweite ist ein Kreisdiagramm mit dem Titel „Aufschlüsselung der HTTP-Reaktionscodes“ und zeigt Segmente für 200, 404 und 503 Reaktionen." /><p><em>Einzelne Inline-Diagrammvorschau.</em></p><h2><strong>Bereitgestellt von ES|QL</strong></h2><p>Alle Datenabrufe verwenden <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>, die Pipe-basierte Abfragesprache von Elasticsearch. Die KI verarbeitet nicht nur rohe Abfragen, sondern nutzt auch integrierte ES|QL-Syntax zusammen mit Informationen zur Struktur Ihrer Daten, um korrekte, effiziente Abfragen für jeden Visualisierungstyp zu schreiben.</p><p>Der Server enthält eine umfassende ES|QL-Referenz als MCP-Ressource. Bevor eine Abfrage geschrieben wird, liest die KI diese Referenz, um die verfügbaren Befehle, Funktionen und Muster zu verstehen. In Kombination mit einem Dataviz-Best-Practices-Leitfaden (der auch als Ressource diente) weiß die KI nicht nur, <em>wie</em> sie Abfragen gestaltet, sondern auch, <em>was</em> eine gute Visualisierung ausmacht:</p><ul><li><p>Verwenden Sie <code>BUCKET(@timestamp, 1 day)</code> für Zeitreihen; gruppieren Sie immer <code>SORT</code> nach dem Zeitfeld.</p></li><li><p>Beschränken Sie Kreisdiagramme mit <code>| SORT value DESC | LIMIT 6</code> auf sechs Abschnitte.</p></li><li><p>Wählen Sie Balkendiagramme für Kategorienvergleiche, Liniendiagramme für Trends und Kennzahlen für Leistungsindikatoren (KPI).</p></li></ul><h2><strong>KI-gestützte Datenexploration mit ergebnisoffener Analyse</strong></h2><p>Ein Dashboard zu erstellen, das Sie bereits in Ihrem Kopf entworfen haben, ist das eine. Die Frage lautet: „Was ist an diesem Index interessant?“ und eine brauchbare Antwort zu bekommen, ist das andere. Dafür muss die KI wissen, wie man <em>erkundet</em>, nicht nur, wie man zeichnet.</p><p>example-mcp-dashbuilder versendet eine <code>analysis://guidelines</code>-Ressource, die einen strukturierten Explorationsablauf definiert: Daten profilieren, gezielte Aggregationen ausführen, Muster aufzeigen, die es wert sind, untersucht zu werden, Diagramme für die interessantesten Ergebnisse erstellen und Drilldown-Abfragen vorschlagen, die der Nutzer als Nächstes haben könnte. Triggerphrasen wie „Analysiere meine Logs“ oder „Finde Muster in diesem Index“ veranlassen die KI, das Playbook zu lesen, bevor sie irgendetwas anderes tut. So entsteht durch einen offenen Prompt eine zusammenhängende Untersuchung und nicht ein zufälliger Haufen von Diagrammen.</p><p>Das Ergebnis: Sie können der KI einen unbekannten Index übergeben und erhalten einen Ausgangspunkt zurück: ein Dashboard sowie eine kurze Liste von Prompts, wie „Das mir aufgefallen, soll ich mir das genauer ansehen?“.</p><h2><strong>Kibana-Dashboard Export und Import: Ein vollständiger Rundgang</strong></h2><p>Der Export-/Import-Rundgang ist der Punkt, an dem example-mcp-dashbuilder für Teams, die bereits mit Kibana arbeiten, wirklich nützlich wird. example-mcp-dashbuilder ist etwas Eigenständiges, eine dialogorientierte Dashboard-Oberfläche, die in Ihren Editor integriert ist, aber Ihre Arbeit nicht dort einschließt. Hier erstellte Dashboards können bei Bedarf in Kibana übertragen werden, und bestehende Kibana-Dashboards können umgekehrt zur KI-gestützten Bearbeitung importiert werden.</p><h3><strong>Nach Kibana exportieren</strong></h3><p>Wenn Sie mit Ihrem Dashboard zufrieden sind, exportieren Sie es mit einem Befehl:</p><p>„Dieses Dashboard nach Kibana exportieren“</p><p>Jedes Panel wird als echte Kibana Lens-Visualisierung dargestellt. Die Übersetzung bewahrt:</p><ul><li><p><strong>ES|QL-Abfragen:</strong> Direkt übertragen als Lens ES|QL-Datenquellen.</p></li><li><p><strong>Rasterpositionen:</strong> Das gleiche 48-Spalten-System, das Kibana verwendet, Ihr Layout sieht also identisch aus.</p></li><li><p><strong>Benutzerdefinierte Farben:</strong> Serienpaletten, metrische Hintergründe, Heatmap-Farbrampen.</p></li></ul><p>Das Ergebnis ist ein voll funktionsfähiges Kibana-Dashboard. Kein Screenshot. Keine Einbettung. Ein echtes Dashboard, das Sie teilen und in Kibana weiter bearbeiten können.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1921c74c2833cabe/6a17e99f6864a4a712b687da/5e27777bc0a82cafb373943f65298bdb21d66176-1999x902.png" alt="Zwei Dashboards werden nebeneinander angezeigt. Das linke Dashboard mit dem Titel „Web-Traffic bearbeiten – Logstash (Dashbuilder)“ zeigt aktuelle Traffic-Metriken, ein Traffic-Volumen-Panel, ein geografisches Balkendiagramm und ein Kreisdiagramm mit Antwortcodes an. Das rechte Dashboard zeigt ein ähnliches Layout mit höheren Gesamtwerten und beinhaltet ein Traffic-Volumen-Panel, ein geografisches Balkendiagramm und ein Kreisdiagramm mit Antwortcodes." /><p><em>Kibana-Dashboard und Dashboard im Cursor-Chat nebeneinander.</em></p><h3><strong>Aus Kibana importieren</strong></h3><p>Der Rundgang funktioniert auch in die andere Richtung:</p><p>„Importieren Sie das Kibana-Dashboard mit der ID abc-123“</p><p>Hierbei wird ein bestehendes Kibana-Dashboard abgerufen, dessen Lens-Visualisierungen in bearbeitbare Diagrammkonfigurationen übersetzt, das Rasterlayout und die Abschnitte beibehalten und alles in example-mcp-dashbuilder geladen. Von dort aus können Sie es mit natürlicher Sprache ändern und erneut exportieren.</p><p>Dadurch wird die KI zu einem Mitarbeiter in Ihrem bestehenden Kibana-Workflow, nicht zu einem Ersatz.</p><h2><strong>Benutzerdefinierte Themen und Farben</strong></h2><p>Sie wünschen sich ein Dashboard mit Ihrem Branding? Stellen Sie einfach folgende Frage:</p><p>„Erstellen Sie ein Dashboard im pinken Design mit benutzerdefinierten Farben"</p><p>Jeder Visualisierungstyp unterstützt eine benutzerdefinierte Farbkonfiguration:</p><ul><li><p><strong>Diagramme:</strong> <code>palette</code> akzeptiert ein Array von Hex-Farben für Serien und Segmente.</p></li><li><p><strong>Metriken:</strong> <code>color</code> legt die Hintergrundfarbe fest.</p></li><li><p><strong>Heatmaps:</strong> <code>colorRamp</code> definiert den Verlauf von niedrigen zu hohen Werten.</p></li></ul><p>Die KI erkennt Themenwünsche auf natürliche Weise. Sagen Sie „maritimes Design“ und es wählt Blau- und Türkistöne aus. Sagen Sie „Unsere Markenfarben verwenden“ und geben Sie Hexadezimalwerte an, diese werden beim Export in Kibana übernommen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2bc7cddbdef81354/6a17e9a1ec0f89ee155a665e/4aceba013ac9cbb4a541109efd6acddf8a6ec47d-1562x1568.png" alt="Ein thematisches E-Commerce-Dashboard mit benutzerdefinierten pinken Farben. Das Layout zeigt oben die Umsatz- und Auftrags-KPIs, darunter einen eingeklappten Trendabschnitt und zwei kategorienbasierte Diagramme: ein Balkendiagramm für den Umsatz nach Kategorie und ein Kreisdiagramm für die Bestellungen nach Kategorie." /><p><em>Ein thematisches Dashboard mit benutzerdefinierten Farben.</em></p><p><strong>Funktionsweise von example-mcp-dashbuilder: MCP-Architektur</strong></p><p>example-mcp-dashbuilder basiert auf <a href="https://modelcontextprotocol.io/">MCP</a>, dem offenen Standard zur Verbindung von KI-Assistenten mit externen Werkzeugen und Daten. Hier die Architektur im Überblick:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c0cd879646e9947/6a17e9a36864a4c408b687df/cbfeabe151ec1ee2b0655f4d17468c9bb358df7e-1024x559.png" alt="Ein Architekturdiagramm, das den mit dem MCP-Server verbundenen MCP-Host zeigt, der Tools, Ressourcen und Anweisungen enthält. Darunter befindet sich eine MCP-App-Box mit Elastic Charts und dem Rasterlayout von Kibana. Elasticsearch und Kibana werden unten angezeigt, wobei Pfeile sie mit der MCP-App verbinden." /><p>Der <strong>MCP-Server</strong> stellt 25 Tools bereit, die die KI direkt aufrufen kann, vom Ausführen von ES|QL-Abfragen, dem Exportieren von Dashboards sowie einige interne „App-only“-Tools, die die Inline-Vorschau nutzt, um Daten abzurufen, Layoutänderungen zu speichern und Zeitfelder zu erkennen. Er dient als Ressource für drei Bereiche: Als Leitfaden mit Best Practices für die Datenvisualisierung, als ES|QL-Referenz und als Playbook für die Tiefenanalyse, das bei offenen Prompts („Analysiere meine Logs“, „Was ist in diesem Index interessant?“) zum Einsatz kommt. Er wird entweder über stdio oder HTTP ausgeführt, der HTTP-Transport unterstützt streamfähige Antworten und Sitzungsmanagement, sodass mehrere Clients mit einem Server verbunden werden können.</p><p>Die <strong>MCP-App</strong> dient als interaktive Vorschau. Sie basiert auf React, <a href="https://elastic.github.io/elastic-charts">Elastic Charts</a> und <a href="https://eui.elastic.co/">Elastic UI</a>, gebündelt in einer einzigen, eigenständigen HTML-Datei. Wenn die KI <code>view_dashboard</code> aufruft oder ein Diagramm erstellt, rendert der Host dieses HTML in einem Sandbox-iframe. Die App kommuniziert vollständig über das <a href="https://modelcontextprotocol.io/extensions/apps/overview">MCP Apps-Protokoll</a> mit dem Server und nutzt <code>callServerTool()</code> über postMessage, um Daten abzurufen, Layouts zu speichern und Zeitfelder zu erkennen. Es gibt keinen lokalen Server, keinen Port zum Konfigurieren, keine externe Netzwerkabhängigkeit.</p><p>Das bedeutet, dass es mit jedem MCP-kompatiblen Client funktioniert: Cursor, Claude Desktop, Claude.ai, VS Code mit Copilot und mehr.</p><h2><strong>Welche Diagrammtypen unterstützt example-mcp-dashbuilder?</strong></h2><p>Zum Zeitpunkt der Erstellung dieses Artikels werden sechs Diagrammtypen unterstützt, die die gängigsten Dashboard-Szenarien abdecken:</p><p>Typ</p><p>Am besten für</p><p>Beispiel</p><p>Balkendiagramm</p><p>Kategorien vergleichen</p><p>Anfragen nach geografischer Quelle</p><p>Liniendiagramm</p><p>Trends im Laufe der Zeit</p><p>Pro Stunde übertragene Bytes</p><p>Bereich</p><p>Volumen im Laufe der Zeit</p><p>Volumen der Anfrage im Laufe der Zeit</p><p>Kreisdiagramm</p><p>Teil des Ganzen (maximal sechs Stücke)</p><p>Verteilung von Antwortcodes</p><p>Metrik</p><p>Einzelner KPI mit Sparkline</p><p>Gesamtzahl der Anfragen mit stündlichem Trend</p><p>Heatmap</p><p>Muster in zwei Dimensionen</p><p>Anfragen nach Wochentag und Stunde</p><p>Die Dashboards unterstützen ausklappbare Abschnitte zur besseren Übersicht, eine Zeitauswahl mit automatischer Zeitfelderkennung sowie die Möglichkeit, mehrere Dashboards zu speichern und zwischen ihnen zu wechseln. Parallele Chat-Sitzungen bleiben durch einen <code>dashboardId</code>-Thread, der bei jedem Tool-Aufruf durchlaufen wird, voneinander isoliert.</p><h2><strong>Installation und Ausführung von example-mcp-dashbuilder</strong></h2><p>example-mcp-dashbuilder ist Open-Source und sofort einsatzbereit. Sie benötigen Node.js 22+, eine Elasticsearch-Instanz (lokal oder Elastic Cloud) und einen MCP-kompatiblen Client.</p><p><strong>Claude Desktop:</strong> Laden Sie die neueste <code>.mcpb</code> von <a href="https://github.com/elastic/example-mcp-dashbuilder/releases">GitHub Releases</a> herunter und klicken Sie doppelt darauf. Claude Desktop fordert Sie zur Eingabe Ihrer Elasticsearch-Zugangsdaten auf.</p><p><strong>Cursor / Claude Code / VS Code Copilot:</strong> Richten Sie Ihre MCP-Konfiguration auf den veröffentlichten Tarball – kein Klon, kein <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>Legen Sie <code>ES_NODE, ES_API_KEY</code> (oder <code>ES_USERNAME / ES_PASSWORD</code>) und <code>KIBANA_URL</code> als Umgebungsvariablen fest. Wenn Sie lieber von der Quelle aus arbeiten möchten, klonen Sie das Repository und führen Sie <code>npm run setup</code> als interaktiven Assistenten aus, der Elasticsearch lokal sowie Elastic Cloud (Cloud ID + API-Schlüssel) verwaltet.</p><p>Beginnen Sie mit der Entwicklung:</p><p>„Erkunden Sie den Log-Index und erstellen Sie mir ein möglichst aussagekräftiges Dashboard.“</p><p>Die KI übernimmt dann den Rest. 😉</p><h2><strong>Roadmap: Die Zukunft von example-mcp-dashbuilder</strong></h2><p>Dies ist eine frühe Version, die wir aktiv weiter entwickeln. Dies sind einige Bereiche, auf die wir uns konzentrieren:</p><ul><li><p><strong>Weitere Diagrammtypen:</strong> Gauge, Donut, Treemap, Datentabelle und Tag Cloud, passend zu den vollständigen Funktionen von Lens.</p></li><li><p><strong>Dashboards auf Git pushen: </strong>Schreiben Sie Dashboard-Konfigurationen in ein Repository für Versionskontrolle und Code-Review-Workflows.</p></li><li><p><strong>Verbesserte Fehlerbehandlung: </strong>Detaillierteres Feedback, wenn ES|QL-Abfragen fehlschlagen, mit Vorschlägen für allgemeine Problemlösungen.</p></li><li><p><strong>Effektivere Analyseströme: </strong>Erweiterung des Deep-Analysis-Playbooks, um mehr Datenformen (Logs, Metriken, Traces) abzudecken.</p></li></ul><p>Wir würden uns freuen zu erfahren, was Sie damit entwickeln. Probieren Sie es aus, melden Sie Probleme und lassen Sie uns wissen, welche Visualisierungen und Workflows für Ihr Team am nützlichsten wären.</p><p><a href="https://github.com/elastic/example-mcp-dashbuilder">GitHub: elastic/example-mcp-dashbuilder</a></p><h3>Danksagungen</h3><p>Vielen Dank an <a href="mailto:walter.rafelsberger@elastic.co">Walter Rafelsberger</a> und <a href="mailto:tim.schnell@elastic.co">Tim Schnell</a> für ihren Beitrag zur Umsetzung.</p><h3>FAQ</h3><p><strong>Was ist example-mcp-dashbuilder?</strong> example-mcp-dashbuilder ist eine Open-Source-MCP (Model Context Protocol) Anwendung, die KI-Assistenten mit Elasticsearch verbindet. Es ermöglicht Ihnen, ein Kibana-Dashboard in einfachem Englisch zu beschreiben und generiert automatisch ES|QL-Abfragen, erstellt Visualisierungen und liefert ein interaktives Live-Dashboard direkt im Chatfenster Ihres Editors.</p><p><strong>Welche Abfragesprache verwendet example-mcp-dashbuilder, um Daten abzurufen?</strong> Alle Datenabrufe verwenden ES|QL, die Pipe-basierte Abfragesprache von Elasticsearch. Der MCP-Server enthält eine integrierte ES|QL-Referenz, die die KI vor dem Schreiben einer Abfrage liest, um eine korrekte Syntax und effiziente Aggregationen für jeden Visualisierungstyp zu gewährleisten.</p><p><strong>Kann ich mit example-mcp-dashbuilder erstellte Dashboards nach Kibana exportieren?</strong> Ja. Mithilfe von „Dieses Dashboard nach Kibana exportieren“ wird jedes Panel in eine echte Kibana Lens-Visualisierung übersetzt, wobei ES|QL-Abfragen, das 48-spaltige Rasterlayout, benutzerdefinierte Farben und Serienpaletten erhalten bleiben. Das Ergebnis ist ein voll funktionsfähiges Kibana-Dashboard, kein Screenshot oder Einbettung.</p><p><strong>Kann ich ein bestehendes Kibana-Dashboard in example-mcp-dashbuilder importieren, um eine KI-unterstützte Bearbeitung durchzuführen?</strong> Ja. Durch Angabe einer Kibana-Dashboard-ID wird das vorhandene Dashboard abgerufen, dessen Lens-Visualisierungen in bearbeitbare Diagrammkonfigurationen übersetzt und in example-mcp-dashbuilder geladen. Anschließend können Sie das Dashboard mithilfe natürlicher Sprache modifizieren und wieder nach Kibana exportieren.</p><p><strong>Welche MCP-Clients sind mit example-mcp-dashbuilder kompatibel?</strong> example-mcp-dashbuilder funktioniert mit jedem MCP-kompatiblen Client, einschließlich Cursor, Claude Desktop, Claude.ai und VS Code mit Copilot. Es unterstützt sowohl stdio- als auch HTTP-Transport, ohne dass eine lokale Server- oder Portkonfiguration erforderlich ist.</p><p><strong>Welche Diagrammtypen werden von example-mcp-dashbuilder unterstützt?</strong> Die aktuelle Version unterstützt sechs Diagrammtypen: Balkendiagramm, Liniendiagramm, Flächendiagramm, Kreisdiagramm, Metrik (mit Sparkline) und Heatmap. Geplante Ergänzungen umfassen Gauge, Donut, Treemap, Datentabelle und Tag Cloud, um den vollen Funktionsumfang von Kibana Lens zu erreichen.</p><p><strong>Was benötige ich, um example-mcp-dashbuilder auszuführen?</strong> Sie benötigen Node.js 22 oder höher, eine Elasticsearch-Instanz (lokal oder Elastic Cloud) und einen MCP-kompatiblen Client. Legen Sie die Umgebungsvariablen ES_NODE, ES_API_KEY (oder ES_USERNAME/ES_PASSWORD) und KIBANA_URL fest. Für Claude Desktop laden Sie die .mcpb- Datei von GitHub Releases herunter und installieren sie per Doppelklick.</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[KI]]></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[Verbesserung der Interaktivität des Kibana-Dashboards mit Steuerelementen für Variablen]]></title>
    <description><![CDATA[Entdecken Sie, wie Sie mit Steuerelementen für Variablen in Kibana 8.18+ einzelne Visualisierungen filtern, Zeitintervalle anpassen und nach verschiedenen Feldern in Kibana-Dashboards gruppieren können.]]></description>
    <content:encoded><![CDATA[<p>Wir freuen uns, Ihnen mitteilen zu können, dass <strong>Steuerelemente für Variablen ab Version 8.18 und in allen Versionen der Serie 9.x in Kibana-Dashboards verfügbar sind</strong>! Diese Funktion war eine der am häufigsten nachgefragten Ergänzungen von Dashboard-Benutzern – und nun ist sie endlich da 🎉 In den letzten Monaten haben wir die <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#add-variable-control">Steuerelemente für Variablen</a> weiter ausgebaut und optimiert, sodass es nun an der Zeit ist, ihnen einen eigenen Blogbeitrag zu widmen.</p><h2>Was sind Steuerelemente für Variablen?</h2><p>Wenn Sie bereits mit Kibana-Dashboards gearbeitet haben, kennen Sie wahrscheinlich unsere klassischen Dashboard-Steuerelemente – diese praktischen Dropdown-Menüs, die Werte aus Ihren Daten anzeigen, sodass Sie mit wenigen Klicks Filter setzen können.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7405fbff7584b1b/6a17ee5cfbc5f8aea1491b5d/b82c1b25a0b38661e5ce4552f763be487d5074aa-1600x701.png" alt="" /><p>Variable Bedienelemente sehen auf der Oberfläche ähnlich aus, haben aber eine clevere Wendung: Anstatt automatisch jedes Panel auf deinem Dashboard zu filtern, können sie direkt an <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">ES|QL-Abfragen innerhalb einzelner Visualisierungen</a> angeschlossen werden.</p><p>Das bedeutet, <em>Sie</em> können entscheiden, wo jedes Steuerelement angewendet wird. Noch besser: Sie können sie für alle möglichen kreativen Tricks verwenden – beispielsweise zum Anpassen von Zeitintervallen, zum Wechseln von Aufschlüsselungsfeldern oder zum spontanen Ändern von Visualisierungsparametern. Im Grunde genommen sorgen sie für ein wahrhaft interaktives Erlebnis auf Ihren Dashboards, sodass Sie schneller und einfacher zu Ihren Erkenntnissen gelangen.</p><h2>Anwendungsfälle für Steuerelemente für Variablen</h2><p>Steuerelemente für Variablen sind zwar nützlich, aber was kann man damit eigentlich machen? Hier sind einige Beispiele dafür, wie sie Ihre Dashboards verbessern:</p><h3>Ausgewählte Visualisierungen filtern</h3><p>Möchten Sie <em>einige</em> Visualisierungen filtern, aber andere unberührt lassen? Steuerelemente für Variablen ermöglichen Ihnen genau das. Wählen Sie die Panels aus, auf die Sie reagieren möchten, und verknüpfen Sie sie in den ES|QL-Abfragen hinter Ihren Visualisierungen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd014bba50a3a61e/6a17ee5e14d90c006d79b69a/efa367363830b03bc67028aceafe78c4b44e578f-1440x562.gif" alt="" /><h3>Wählen Sie unterschiedliche Zeitintervalle aus</h3><p>Geben Sie Ihren Nutzern die Möglichkeit, zwischen „5 Minuten“, „1 Stunde“, „1 Tag“ oder anderen sinnvollen Buckets zu wechseln. Erstellen Sie ein Steuerelement für Variablen mit vordefinierten Intervallen und verbinden Sie diese mit Ihrer Zeitreihenabfrage.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt237797ddea95ce08/6a17ee602f4a5cfd65fa8996/62aa9f4e728036f8c70213b76b1cf131f36f5b4d-1440x606.gif" alt="" /><h3>Funktionen ändern</h3><p>Anstatt mehrere Diagramme für jeden Vorgang zu erstellen, können die Nutzer des Dashboards wählen, ob sie den Maximalwert, den Durchschnittswert, verschiedene Perzentile oder einen anderen Aggregator sehen möchten.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4c856460132fb604/6a17ee627b54f920838b3991/f6a2b4c73dc35efe462c2924a153d7b3fa3a7922-1436x606.gif" alt="" /><h3>Nach verschiedenen Feldern gruppieren</h3><p>Mitunter müssen Sie die Daten während einer Untersuchung nach verschiedenen Dimensionen aufschlüsseln. Mit Steuerelementen für Variablen können Sie mehrere „Gruppieren nach“-Felder festlegen und Dashboard-Nutzer so das Feld auswählen lassen, das sie bei der Gewinnung ihrer Erkenntnisse unterstützt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbf1a24038dde55b8/6a17ee646864a413b6b6884c/fe8745a6fddccadba0666686b8ebc67fdaf64158-1438x606.gif" alt="" /><h2>Wie kann man sie erstellen?</h2><p>Die einfachste (und wahrscheinlich angenehmste) Methode zur Erstellung eines Steuerelements für Variablen ist direkt über den <strong>ES|QL-Abfrage-Editor</strong> in Ihrer Visualisierung. Beginnen Sie einfach mit der Eingabe Ihrer Suchanfrage, nutzen Sie das Autovervollständigungsmenü und Kibana unterstützt Sie bei der Erstellung Ihres Steuerelements.</p><p>Wenn Sie jedoch lieber mit der Variablen selbst beginnen möchten, können Sie auch zu <strong>Panel hinzufügen → Steuerelemente → Steuerelement für Variablen</strong> gehen und die Variable nach dem Erstellen des Steuerelements zu Ihren Visualisierungen hinzufügen.</p><h3>Beispiel 1: Filter-Steuerelement mit Auswahl mehrerer Werte</h3><p>1. Wählen Sie eine Visualisierung aus, die auf einer ES|QL-Abfrage basiert, und klicken Sie innerhalb der WHERE-Klausel auf „Steuerelement erstellen“</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1356c9ac1ffce732/6a17ee661d1b83104a93e4f3/46cb6f2a6775aee152d42eb5ee85170f1bdf26cb-1600x668.png" alt="" /><p>2. Sie werden automatisch zum Flyout für die Erstellung von Variablen weitergeleitet, wo der Typ „Werte aus einer Abfrage“ für Sie ausgewählt ist und der Name der Variablen bereits vorausgefüllt ist. Beachten Sie, dass der Name eines Steuerelements immer mit „?...” beginnen muss, damit er in der Visualisierungsabfrage funktioniert.</p><p>In der Regel benötigen Sie eine Abfrage wie diese, um die Werte eines Feldes abzurufen und sie entsprechend dem im Dashboard ausgewählten Zeitraum zu aktualisieren:</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. Beim Speichern des Steuerelements erscheint sie oben im Dashboard, und Ihre Visualisierungsabfrage wird mit dem Namen des Steuerelements für Variablen aktualisiert.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte03c74e0c60bdb42/6a17ee6a0b0bed13cddd3636/5fc434c8951889e9769652b675191711d126a685-1600x653.png" alt="" /><p>4. Wenn Sie <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#esql-multi-values-controls">Mehrfachauswahl</a> zum Steuerelement hinzufügen möchten, verwenden Sie die Funktion <code>MV_CONTAINS</code> in der Abfrage und wählen Sie bei der Erstellung des Steuerelements in Schritt 2 (verfügbar ab 9.3) die Option „Mehrfachauswahl zulassen“ aus.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt218a166f7a1dc52c/6a17ee6ca2929979a9d02d27/1f237cea0a37cb25a7917a2a683707a269adae8e-1600x670.png" alt="" /><h3>Beispiel 2: Zeitintervallsteuerung</h3><p>Bei der Erstellung einer Zeitreihe können Sie ganz einfach ein Steuerelement für Variablen für Ihr Datums-Histogramm-Intervall hinzufügen:</p><p>1. Klicken Sie beim Schreiben einer ES|QL-Abfrage für Ihre Zeitreihe auf „Steuerelement erstellen“. Bei der Erstellung einer Variablen für Intervalle ist es besser, <code>TBUCKET</code> anstelle von <code>BUCKET</code> zu verwenden, damit besser lesbare Intervalle wie „1 Stunde“, „1 Tag“ usw. akzeptiert werden. In Kürze steht auch eine automatische Option für <code>TBUCKET</code> zur Verfügung, sodass sich das System automatisch an Zeitbereiche anpassen kann.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta6f32acf5ed19697/6a17ee6e6864a4a32fb68850/b0ad53d790ff9bdd42db5e77477318319f423534-1600x664.png" alt="" /><p>2. Legen Sie die Intervalle zum Ausfüllen der Optionen im Dropdown-Menü fest.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf08d6a75afe87314/6a17ee6f25daab58fe08a2fa/f3bd83f530cfa4698c1a3b1ae60d08d0414043b5-1600x757.png" alt="" /><p>3. Wählen Sie im Dropdown-Menü verschiedene Intervalle aus und sehen Sie, wie sich Ihre Visualisierung verändert.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ecd5f376b096063/6a17ee7196142a0f77eb1b9b/0f928d9c70929f64926e065059188d140cd48943-1600x671.png" alt="" /><h3>Beispiel 3: Variablen für Funktionen</h3><ol><li><p>Erstellen Sie eine Variable mithilfe des Kontrolltyps „Statische Werte“ und fügen Sie Funktionsnamen zu Ihren Dropdown-Werten hinzu. Es ist wichtig, für Ihre Variable einen Namen zu verwenden, der mit „??…“ beginnt, um Funktionen zu ersetzen.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6bdc0c817465f3f0/6a17ee73505ac3268cad8bea/531444237b7e152d3c8a6f3ca7e464f954f9e856-1600x663.png" alt="" /><p>2. Fügen Sie den Variablennamen in Ihre ES|QL-Abfrage ein.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd631ad49bbb93c3e/6a17ee75e9ea87708ea9c6aa/9858442abb26d8d266d464852871b139fde63b89-1600x665.png" alt="" /><h3>Beispiel 4: Variablen für Felder</h3><ol><li><p>Sie können den Kontrolltyp „Statische Werte“ verwenden und die Namen der gewünschten Felder eingeben. Es ist wichtig, einen Variablennamen zu verwenden, der mit „??...“ beginnt, damit er für Felder funktioniert.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29079f2b85c7239c/6a17ee77b1e113328f79f30b/33534c3df2fae024b25c28b4aed5d742e54202a2-1600x710.png" alt="" /><p>2. Verweisen Sie in der Visualisierungsabfrage auf die gewünschte Variable.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ca73c08dfa27319/6a17ee780b0bed31e8dd363a/71cdf3e9df72c59d957628a3aa6e4aa9bd60d6d5-1600x676.png" alt="" /><h2>Steuerelemente für Variablen in Discover</h2><p>Steuerelemente für Variablen sind nicht nur eine Dashboard-Funktion, sondern auch direkt im ES|QL-Editor in Discover verfügbar. Sie können Steuerelemente für eine schnellere Datenexploration in Discover erstellen, diese in das Dashboard übertragen und umgekehrt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40c9ce5eed7ded45/6a17ee7b420229747b29f684/fdddeec902d0bc746caed9276d01d7d48793dd85-1600x709.png" alt="" /><h2>Technische Details</h2><p>Mittlerweile haben Sie wahrscheinlich bemerkt, dass Steuerelemente für Variablen einigen Regeln unterliegen – beispielsweise, auf welche Teile einer Abfrage sie verweisen können und welche Namenspräfixe Sie verwenden müssen („?...” für Werte und „??...” für Felder oder Funktionen). Das liegt daran, dass Variablen nicht nur einfache Zeichenfolgenersetzungen sind, die auf dem Client stattfinden. Es handelt sich dabei um erstklassige Elemente der Abfragesprache selbst (bekannt als <a href="https://www.elastic.co/docs/solutions/search/agent-builder/tools/esql-tools#parameter-types">Parameter in ES|QL</a>).</p><p></p><p>Dieses Design bietet einige große Vorteile. Zum einen kann Kibana den Kontext jeder Variablen verstehen, wodurch wir die Konfiguration automatisch für Sie generieren und vorausfüllen können. Außerdem ist es viel sicherer: Da die Sprache Variableneingaben streng validiert, verhindert sie böswillige Injektionen und gibt bei Unstimmigkeiten eine Fehlermeldung aus. Darüber hinaus werden Leistung und Stabilität verbessert, indem komplexe Validierungen und Fehlerbehandlungen vom Client auf den Server verlagert werden. Ein Hinweis zur Leistung: Eine bewährte Vorgehensweise besteht in der Erstellung von Variablen, die schnelle Abfragen enthalten, da diese vor dem Dashboard geladen werden. Langsame Abfragen können sich daher auf die gesamte Dashboard-Leistung auswirken.</p><p>Natürlich bringt diese Architektur vorerst auch einige <a href="https://www.elastic.co/docs/solutions/search/agent-builder/limitations-known-issues#esql-limitations">Einschränkungen</a> mit sich. Variablen unterstützen noch keine „Alle“-Option für das Filtern und können derzeit nicht mit bestimmten Operatoren wie <code>LIKE</code>oder <code>FROM</code> (zum Wechseln der Datenquellen) verwendet werden. Die gute Nachricht? Wir arbeiten aktiv an der Erweiterung um diese Funktionen.</p><h2>Was die Zukunft für Bedienelemente bereithält</h2><p>Wir machen hier noch lange nicht Schluss! Zu den geplanten Verbesserungen gehören unter anderem:</p><p>✨ Die Möglichkeit zur beliebigen Platzierung von Steuerelementen auf dem Dashboard</p><p>✨ Verkettung Ihrer Steuerelemente – das bedeutet, der Ausgang eines Steuerelements wird zum Eingang für das nächste Steuerelement</p><p>✨ Verbesserte Auswahlmöglichkeiten wie die Option „Alle“ für Variablen</p><p>✨ Neue Kontrolltypen (Suchtyp-Steuerelement und Variablen für Ihre Datenquellen)</p><p>✨ Und weitere Verbesserungen der von Ihnen Benutzerfreundlichkeit, wie beispielsweise die Vorfilterung normaler Steuerelemente</p><p>Wir freuen uns über Ihre Ideen und Ihr Feedback.</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[Analysen]]></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[KI-gestützte Dashboards: Von der Vision zu Kibana]]></title>
    <description><![CDATA[Generieren Sie ein Dashboard mithilfe eines LLM, um ein Bild zu verarbeiten und in ein Kibana-Dashboard umzuwandeln.
]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/kibana/kibana-lens">Kibana Lens</a> macht das Erstellen von Dashboards per Drag &amp; Drop sehr einfach, aber wenn man Dutzende von Panels benötigt, summieren sich die Klicks. Was wäre, wenn Sie ein Dashboard skizzieren, einen Screenshot davon machen und einen LLM den gesamten Prozess für Sie abschließen lassen könnten?</p><p>In diesem Artikel werden wir genau das tun. Wir werden eine Anwendung erstellen, die ein Bild eines Dashboards aufnimmt, unsere Mappings analysiert und anschließend ein Dashboard generiert, ohne dass wir Kibana überhaupt berühren müssen!</p><p><strong>Schritte</strong>:</p><ol><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#background-&amp;-application-workflow">Hintergrund und Anwendungsablauf</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#prepare-data">Daten vorbereiten</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#llm-configuration">LLM-Konfiguration</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#application-functions">Anwendungsfunktionen</a></p></li></ol><h2>Hintergrund und Anwendungsablauf</h2><p>Mein erster Gedanke war, den LLM das gesamte NDJSON-Format der in Kibana <a href="https://www.elastic.co/docs/explore-analyze/find-and-organize/saved-objects">gespeicherten Objekte</a> generieren zu lassen und sie dann in Kibana zu importieren.</p><p>Wir haben eine Handvoll Modelle ausprobiert:</p><ul><li><p>Gemini 2.5 Pro</p></li><li><p>GPT o3 / o4-mini-hoch / 4.1</p></li><li><p>Claude 4 Sonett</p></li><li><p>Grok 3</p></li><li><p>Deepseek (Deepthink R1)</p></li></ul><p>Und als Anregungen begannen wir mit ganz einfachen Dingen:</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>Trotz der Durchsicht <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.">einiger weniger Beispiele</a> und detaillierter Erklärungen zum Aufbau der einzelnen Visualisierungen hatten wir keinen Erfolg. Wenn Sie an diesem Experiment interessiert sind, finden Sie <a href="https://gist.github.com/TomasMurua/a78dc283e115624731beffc98984b70b">hier</a> weitere Informationen.</p><p>Das Ergebnis dieser Vorgehensweise war, dass beim Versuch, die vom LLM erzeugten Dateien in Kibana hochzuladen, diese Meldungen angezeigt wurden:</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>Das bedeutet, dass das generierte JSON ungültig oder schlecht formatiert ist. Die häufigsten Probleme waren, dass der LLM unvollständiges NDJSON erzeugte, Parameter falsch interpretierte oder normales JSON anstelle von NDJSON zurückgab, egal wie sehr wir uns bemühten, das Gegenteil zu erzwingen.</p><p>Inspiriert von <a href="https://www.elastic.co/search-labs/blog/llm-functions-elasticsearch-intelligent-query">diesem Artikel</a> – in dem <a href="https://www.elastic.co/docs/solutions/search/search-templates">Suchvorlagen</a> besser funktionierten als LLM Freestyle – entschieden wir uns, dem LLM Vorlagen zu übergeben, anstatt die vollständige NDJSON-Datei generieren zu lassen und anschließend im Code die vom LLM bereitgestellten Parameter zur Erstellung der Visualisierungen zu verwenden. Dieser Ansatz hat sich bewährt und ist vorhersehbar und erweiterbar, da nun der Code und nicht mehr das LLM die Hauptarbeit übernimmt.</p><p>Der Bewerbungsprozess wird wie folgt ablaufen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f7738a4c7ddd0cd/6a1707d52b835f0a25f4b166/52c587cf0cf3517fdd4ee7ab95581dd4f2bce030-725x668.png" alt="" /><p></p><p><em>Der Einfachheit halber lassen wir einige Codeabschnitte weg, aber den vollständigen, lauffähigen Code der Anwendung finden Sie in </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>diesem</strong></em></a><em> Notebook.</em></p><h2>Voraussetzungen</h2><p>Bevor Sie mit der Entwicklung beginnen, benötigen Sie Folgendes:</p><ol><li><p>Python 3.8 oder höher</p></li><li><p>Eine <a href="https://docs.python.org/3/library/venv.html">Venv</a> Python-Umgebung</p></li><li><p>Eine laufende Elasticsearch-Instanz, zusammen mit ihrem Endpunkt und API-Schlüssel</p></li><li><p>Ein OpenAI-API-Schlüssel, der unter dem Umgebungsvariablennamen OPENAI_API_KEY gespeichert ist:</p></li></ol>export OPENAI_API_KEY="your-openai-api-key"<h2>Daten vorbereiten</h2><p>Für die Daten halten wir es einfach und verwenden Elastic-Beispiel-Weblogs. <a href="https://www.elastic.co/docs/manage-data/ingest/sample-data#add-sample-data-sets">Hier</a> erfahren Sie, wie Sie diese Daten in Ihren Cluster importieren.</p><p>Jedes Dokument enthält Angaben zum Host, der die Anfragen an die Anwendung gestellt hat, sowie Informationen zur Anfrage selbst und deren Antwortstatus. Nachfolgend finden Sie ein Beispieldokument:</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>Nun holen wir uns die Zuordnungen des soeben geladenen Index, <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>Wir werden die Zuordnungen zusammen mit dem Bild übergeben, das wir später laden werden.</p><h2>LLM-Konfiguration</h2><p>Konfigurieren wir das LLM so, dass es <a href="https://python.langchain.com/docs/concepts/structured_outputs/">strukturierte Ausgabe</a> verwendet, um ein Bild einzugeben und ein JSON mit den Informationen zu erhalten, die wir an unsere Funktion übergeben müssen, um die JSON-Objekte zu erzeugen.</p><p>Wir installieren die Abhängigkeiten:</p>pip install elasticsearch pydantic langchain langchain-openai -q<p>Elasticsearch wird uns dabei helfen, die <a href="https://www.elastic.co/docs/manage-data/data-store/mapping">Indexzuordnungen</a> abzurufen. Pydantic ermöglicht es uns, Schemata in Python zu definieren, denen der LLM dann folgen soll, und <a href="https://www.elastic.co/search-labs/integrations/langchain">LangChain</a> ist das Framework, das den Aufruf von LLMs und KI-Tools vereinfacht.</p><p>Wir werden ein Pydantic-Schema erstellen, um die gewünschte Ausgabe des LLM zu definieren. Aus dem Bild müssen wir den Diagrammtyp, das Feld, den Visualisierungstitel und den Dashboard-Titel ablesen:</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>Als Bildeingabe senden wir ein Dashboard, das ich gerade gezeichnet habe:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7870f6421986d11d/6a1707d78b73cb3408189fa3/36441d7b5dc1f3ff2ac2a30710208d57ad41c716-1600x898.jpg" alt="" /><p>Nun deklarieren wir den LLM-Modellaufruf und das Laden des Bildes. Diese Funktion erhält die Zuordnungen des Elasticsearch-Index und ein Bild des Dashboards, das wir generieren möchten.</p><p>Mit <code>with_structured_output</code> können wir unser Pydantic <code>Dashboard</code> Schema als Antwortobjekt verwenden, das der LLM erzeugen wird. Mit <a href="https://docs.pydantic.dev/latest/">Pydantic</a> können wir Datenmodelle mit Validierung definieren, wodurch sichergestellt wird, dass die LLM-Ausgabe der erwarteten Struktur entspricht.</p><p>Um das Bild in Base64 zu konvertieren und als Eingabe zu senden, können Sie einen <a href="https://www.base64-image.de/">Online-Konverter</a> verwenden oder dies <a href="https://www.geeksforgeeks.org/python-convert-image-to-string-and-vice-versa/">im Code</a> erledigen.</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>Der LLM verfügt bereits über Kontextinformationen zu Kibana-Dashboards, daher müssen wir nicht alles in der Eingabeaufforderung erklären, sondern nur einige Details, um sicherzustellen, dass er nicht vergisst, dass er mit Elasticsearch und Kibana arbeitet.</p><p>Lassen Sie uns die Aufgabenstellung aufschlüsseln:</p><p>Abschnitt</p><p>Grund</p><p>Sie sind Experte in der Analyse von Kibana-Dashboards anhand von Images für die Version 9.0.0 von Kibana.</p><p>Durch die Verstärkung dieser Funktion wird Elasticsearch und die Verwendung der Elasticsearch-Version unterstützt, wodurch die Wahrscheinlichkeit verringert wird, dass das LLM alte/ungültige Parameter fälschlicherweise annimmt.</p><p>Sie erhalten ein Dashboard-Bild und eine Elasticsearch-Indexzuordnung.</p><p>Wir erklären, dass es sich bei dem Bild um Dashboards handelt, um Fehlinterpretationen seitens des LLM zu vermeiden.</p><p>Nachfolgend finden Sie die Indexzuordnungen für den Index, auf dem das Dashboard basiert. Nutzen Sie diese, um die Daten und die verfügbaren Felder besser zu verstehen. Indexzuordnungen: {index_mappings}</p><p>Es ist entscheidend, die Zuordnungen bereitzustellen, damit das LLM dynamisch gültige Felder auswählen kann. Andernfalls könnten wir die Zuordnungen hier fest codieren, was zu starr wäre, oder uns darauf verlassen, dass das Bild die richtigen Feldnamen enthält, was nicht zuverlässig ist.</p><p>Beschränken Sie sich auf die Felder, die für die jeweilige Visualisierung relevant sind, basierend auf dem, was im Bild sichtbar ist.</p><p>Wir mussten diese Verstärkung hinzufügen, weil manchmal versucht wird, Felder hinzuzufügen, die nicht zum Bild gehören.</p><p>Dies gibt ein Objekt mit einem Array von anzuzeigenden Visualisierungen zurück:</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>Verarbeitung der LLM-Antwort</h2><p>WirWir haben ein Beispiel-Dashboard mit 2x2-Panels erstellt und es dann mithilfe der <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-get-dashboards-dashboard">Get a dashboard API</a> im JSON-Format exportiert. Anschließend haben wir die Panels als Visualisierungsvorlagen (Kreisdiagramm, Balkendiagramm, Metrikdiagramm) gespeichert, in denen wir einige der Parameter ersetzen können, um je nach Fragestellung neue Visualisierungen mit anderen Feldern zu erstellen.</p><p>Die JSON-Vorlagedateien können Sie <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>hier</strong></a> einsehen. Beachten Sie, wie wir die Objektwerte, die wir später ersetzen möchten, durch {<code>variable_name</code>}ersetzt haben.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc55d69d84a08e668/6a1707d8a2929903acd00fb8/ec7e1ac0cd8b470df13e60940162b56778acb386-315x234.png" alt="" /><p>Anhand der von LLM bereitgestellten Informationen können wir entscheiden, welche Vorlage wir verwenden und welche Werte wir ersetzen.</p><p><code>fill_template_with_analysis</code> empfängt die Parameter für ein einzelnes Panel, einschließlich der JSON-Vorlage der Visualisierung, eines Titels, eines Feldes und der Koordinaten der Visualisierung im Raster.</p><p>Anschließend werden die Werte der Vorlage ersetzt und die endgültige JSON-Visualisierung zurückgegeben.</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>Um es einfach zu halten, verwenden wir statische Koordinaten, die wir den vom LLM erstellten Panels zuweisen, und erzeugen so ein 2x2-Raster-Dashboard wie in der obigen Abbildung dargestellt.</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>Je nach dem vom LLM festgelegten Visualisierungstyp wählen wir eine JSON-Dateivorlage aus und ersetzen die relevanten Informationen durch <code>fill_template_with_analysis</code> . Anschließend fügen wir das neue Panel einem Array hinzu, das wir später zum Erstellen des Dashboards verwenden.</p><p>Sobald das Dashboard fertig ist, verwenden wir die <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-dashboards-dashboard-id">„Create a dashboard“-API</a> , um die neue JSON-Datei an Kibana zu übertragen und das Dashboard zu generieren:
</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>Um das Skript auszuführen und das Dashboard zu generieren, führen Sie folgenden Befehl in der Konsole aus:</p>python &lt;file_name&gt;.py<p>Das Endergebnis wird folgendermaßen aussehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ceffed004153a4f/6a1707d9a929cf9147ae0901/e909afbf0e47d9a6e0f7bd07dfb2efcfa5cf06ac-921x715.png" alt="" /><h2>Fazit</h2><p>LLMs zeigen ihre ausgeprägten visuellen Fähigkeiten bei der Umwandlung von Text in Code oder der Umwandlung von Bildern in Code. Die Dashboards-API ermöglicht es auch, JSON-Dateien in Dashboards umzuwandeln, und mit einem LLM und etwas Code können wir Bilder in ein Kibana-Dashboard umwandeln.</p><p>Der nächste Schritt besteht darin, die Flexibilität der Dashboard-Visualisierungen durch die Verwendung unterschiedlicher Rastereinstellungen, Dashboard-Größen und -Positionen zu verbessern. Darüber hinaus wäre die Unterstützung komplexerer Visualisierungen und Visualisierungstypen eine sinnvolle Ergänzung dieser Anwendung.</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[KI]]></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 Teil 2: Datenanalyse und Visualisierung]]></title>
    <description><![CDATA[Wir werden tiefer als je zuvor in Ihre Spotify-Daten eintauchen und Zusammenhänge aufdecken, von denen Sie bisher nichts wussten.]]></description>
    <content:encoded><![CDATA[<p>Im <a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">ersten Teil</a> dieser Serie, verfasst von Iulia Feroli, haben wir darüber gesprochen, wie man seine Spotify Wrapped-Daten erhält und in Kibana visualisiert. Im zweiten Teil tauchen wir tiefer in die Daten ein, um zu sehen, was wir sonst noch herausfinden können. Hierfür werden wir einen etwas anderen Ansatz wählen und <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify to Elasticsearch</a> verwenden, um die Daten in Elasticsearch zu indizieren. Dieses Tool ist etwas fortgeschrittener und erfordert etwas mehr Aufwand bei der Einrichtung, aber es lohnt sich. Die Daten sind strukturierter, und wir können komplexere Fragen stellen.</p><h2>Unterschiede zur ersten Spotify Wrapped-Analyse</h2><p>Im ersten Blogbeitrag haben wir den Spotify-Export direkt verwendet und keine Normalisierungsaufgaben oder sonstige Datenverarbeitungsschritte durchgeführt. Dieses Mal verwenden wir dieselben Daten, werden sie aber aufbereiten, um sie besser nutzbar zu machen. Dies wird es uns ermöglichen, wesentlich komplexere Fragen zu beantworten, wie zum Beispiel:</p><ul><li><p>Wie lang ist ein Song in meinen Top 100 im Durchschnitt?</p></li><li><p>Wie hoch ist die durchschnittliche Beliebtheit eines Songs in meinen Top 100?</p></li><li><p>Wie lange wird ein Lied im Durchschnitt angehört?</p></li><li><p>Welcher Song wird bei mir am häufigsten übersprungen?</p></li><li><p>Wann überspringe ich gerne Musiktitel?</p></li><li><p>Höre ich zu einer bestimmten Tageszeit mehr Musik als zu anderen?</p></li><li><p>Höre ich an einem bestimmten Wochentag mehr Musik als an anderen?</p></li><li><p>Ist es ein Monat von besonderem Interesse?</p></li><li><p>Welcher Künstler hat die längste Hörerschaftszeit?</p></li></ul><p>Spotify Wrapped ist jedes Jahr ein tolles Erlebnis, das dir zeigt, was du dieses Jahr gehört hast. Es werden keine Veränderungen im Jahresvergleich angezeigt, sodass Ihnen möglicherweise einige Künstler entgehen, die einst zu Ihren Top 10 gehörten, aber nun verschwunden sind.</p><h2>Verarbeitung von Spotify Wrapped-Daten zur Analyse</h2><p>Es gibt einen großen Unterschied in der Art und Weise, wie wir die Daten im ersten und im zweiten Beitrag verarbeiten. Wenn Sie weiterhin mit den Daten aus dem ersten Beitrag arbeiten möchten, müssen Sie einige Änderungen der Feldnamen berücksichtigen und auf ES|QL zurückgreifen, um bestimmte Extraktionen wie <code>hour of day</code> dynamisch durchzuführen.</p><p>Dennoch solltet ihr alle in der Lage sein, diesem Beitrag zu folgen. Die Datenverarbeitung im <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify-zu-Elasticsearch-</a> Repository beinhaltet das Abfragen der Spotify-API nach der Dauer des Songs, der Popularität sowie das Umbenennen und Erweitern einiger Felder. Das Feld <code>artist</code> im Spotify-Export ist beispielsweise lediglich ein String und repräsentiert weder Features noch Tracks mit mehreren Künstlern.</p><h2>Visualisierung von Spotify Wrapped-Daten mit Dashboards</h2><p>Ich habe in Kibana ein Dashboard erstellt, um die Daten zu visualisieren. Das Dashboard ist <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">hier</a> verfügbar und kann in Ihre Kibana-Instanz importiert werden. Das Dashboard ist sehr umfangreich und beantwortet viele der oben genannten Fragen.</p><p>Lasst uns einige der Fragen betrachten und gemeinsam überlegen, wie wir sie beantworten können!</p><h3>Wie lang ist ein Song in meinen Top 100 im Durchschnitt?</h3><p>Um diese Frage zu beantworten, können wir Lens oder ES|QL verwenden. Lasst uns alle drei Optionen genauer betrachten. Formulieren wir diese Frage einmal korrekt im Elasticsearch-Stil. Wir möchten die 100 beliebtesten Lieder finden und dann die durchschnittliche Dauer aller dieser Lieder zusammen berechnen. In Elasticsearch-Begriffen wären das zwei Aggregationen:</p><ol><li><p>Finde die Top 100 Songs heraus</p></li><li><p>Berechne die durchschnittliche Dauer dieser 100 Lieder.</p></li></ol><p><strong>Lens</strong></p><p>In Lens ist das ganz einfach: Man erstellt eine neue Lens, wechselt zu einer Tabelle und zieht das Feld <code>title</code> per Drag &amp; Drop in die Tabelle. Klicken Sie anschließend auf das Feld <code>title</code> und stellen Sie die Größe auf 100 ein. Stellen Sie außerdem den Modus <code>accuracy</code> ein. Ziehen Sie dann das Feld <code>duration</code> per Drag &amp; Drop in die Tabelle und verwenden Sie <code>last value</code>, da wir eigentlich nur den letzten Wert der Dauer jedes Liedes benötigen. Dasselbe Lied hat nur eine einzige Dauer. Am Ende dieser <code>last value</code> -Aggregation befindet sich ein Dropdown-Menü für eine Zusammenfassungszeile. Wählen Sie <code>average</code> aus, um sie anzuzeigen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="Verwendung von Lens für Spotify Wrapped-Daten" /><p><strong>ES|QL</strong></p><p>ES|QL ist im Vergleich zu DSL und Aggregationen eine recht neue Sprache, aber sie ist sehr leistungsstark und einfach zu bedienen. Um dieselbe Frage in ES|QL zu beantworten, würden Sie die folgende Abfrage schreiben:</p><p>Ich führe Sie Schritt für Schritt durch diese ES|QL-Abfrage:</p><ol><li><p><code>from spotify-history</code> - Dies ist das Indexmuster, das wir verwenden.</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - Dies ist die erste Aggregation; wir berechnen die maximale Dauer jedes Liedes und die Anzahl der Lieder. Wir verwenden <code>max</code> anstelle von <code>last value</code> , wie es in der Lens verwendet wird, da ES|QL derzeit kein erstes oder letztes Element hat.</p></li><li><p><code>sort count desc</code> - Wir sortieren die Lieder nach der Anzahl der Aufrufe jedes Liedes, sodass das meistgehörte Lied ganz oben steht.</p></li><li><p><code>limit 100</code> - Wir beschränken das Ergebnis auf die Top 100 Songs.</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - Wir berechnen die durchschnittliche Dauer der Lieder.</p></li></ol><h3>Ist ein bestimmter Monat für mich von besonderem Interesse?</h3><p>Um diese Frage zu beantworten, können wir Lens mithilfe von Laufzeitfeldern und ES|QL verwenden. Was uns sofort auffällt: Es gibt kein Feld in den Daten, das die <code>month</code> direkt angibt; stattdessen müssen wir sie aus dem Feld <code>@timestamp</code> berechnen. Dafür gibt es mehrere Möglichkeiten:</p><ol><li><p>Verwenden Sie ein Laufzeitfeld, um die Linse mit Strom zu versorgen.</p></li><li><p>ES|QL</p></li></ol><p>Ich persönlich halte ES|QL für die elegantere und schnellere Lösung.</p><p>Das ist alles, nichts Kompliziertes ist nötig. Wir können die <code>DATE_EXTRACT</code> -Funktion nutzen, um den Monat aus dem <code>@timestamp</code> -Feld zu extrahieren und können dann darüber aggregieren. Mithilfe der ES|QL-Visualisierung können wir das auf dem Dashboard einbinden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Spotify Wrapped monatliche Aufschlüsselungsvisualisierung" /><h3>Wie lange höre ich im Durchschnitt pro Künstler und Jahr?</h3><p>Die Idee dahinter ist, herauszufinden, ob ein Künstler nur eine einmalige Erscheinung ist oder ob es zu einer Wiederholung kommt. Wenn ich mich richtig erinnere, zeigt Spotify nur die Top 5 Künstler im Jahresrückblick an. Vielleicht bleibt dein Künstler auf Platz 6 immer derselbe, oder er wechselt ab Platz 10 stark?</p><p>Eine der einfachsten Darstellungsformen hierfür ist ein prozentuales Balkendiagramm. Wir können dafür Lens verwenden. Folgen Sie den folgenden Schritten:</p><p>Ziehen Sie das Feld <code>listened_to_ms</code> per Drag &amp; Drop an die gewünschte Stelle. Dieses Feld gibt an, wie lange Sie ein Lied in Millisekunden angehört haben. Standardmäßig erstellt Lens eine <code>median</code> -Aggregation. Das wollen wir nicht, ändern wir das in eine <code>sum</code>. Wählen Sie oben für den Balkendiagrammtyp <code>percentage</code> anstelle von <code>stacked</code> aus. Für die Aufschlüsselung wählen Sie <code>artist</code> und geben Sie „Top 10“ ein. Vergessen Sie nicht, im Dropdown-Menü <code>Advanced</code> die <code>accuracy mode</code> auszuwählen. Jeder Farbblock repräsentiert nun, wie oft Sie diesen einzelnen Künstler gehört haben. Je nach gewähltem Zeitauswahlfeld können die Balken Werte von Tagen über Wochen und Monate bis hin zu Jahren darstellen. Wenn Sie eine wöchentliche Aufschlüsselung wünschen, wählen Sie <code>@timestamp</code> aus und stellen Sie <code>mininum interval</code> auf <code>year</code> ein. Was wir in meinem Fall nun sagen können, ist, dass <code>Fred Again..</code> der Künstler ist, den ich am häufigsten gehört habe; fast 12 % meiner gesamten Hörzeit entfielen auf <code>Fred Again..</code>. Wir sehen auch, dass <code>Fred Again..</code> im Jahr 2024 etwas zurückging, <code>Jamie XX</code> aber stark zunahm. Wenn wir nur die Größe der Balken vergleichen. Wir können auch feststellen, dass während <code>Billie Eilish</code> im Jahr 2024 ständig gespielt wird, der Balken sich verbreitert. Das bedeutet, dass ich <code>Billie Eilish</code> im Jahr 2024 häufiger gehört habe als im Jahr 2023.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="Spotify Wrapped Verlaufsvisualisierung mit Kibana" /><h3>Wie sieht es mit den Top-Titeln pro Künstler pro Hörzeit im Vergleich zur gesamten Hörzeit aus?</h3><p>Das ist eine ganz schön komplizierte Frage. Ich möchte versuchen, das zu erklären, was ich damit sagen möchte. Spotify informiert dich über den Top-Song eines einzelnen Künstlers oder über deine insgesamt 5 Top-Songs. Das ist auf jeden Fall interessant, aber wie sieht es mit dem Zusammenbruch eines Künstlers aus? Verbringe ich meine gesamte Zeit nur mit einem einzigen Lied, das ich immer und immer wieder höre, oder ist meine Zeit gleichmäßig verteilt?</p><p>Erstellen Sie eine neue Linse und wählen Sie <code>Treemap</code> als Typ aus. Für <code>metric</code> gilt dasselbe wie zuvor: Wählen Sie <code>sum</code> aus und verwenden Sie <code>listened_to_ms</code> als Feld. Für die <code>group by</code> benötigen wir zwei Werte. Das erste ist <code>artist</code> und dann füge ein zweites mit <code>title</code> hinzu. Das Zwischenergebnis sieht folgendermaßen aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="Spotify Wrapped Verlaufsvisualisierung mit Kibana" /><p>Ändern wir das in Top 100 Künstler und deaktivieren wir die <code>other</code> im erweiterten Dropdown-Menü sowie aktivieren wir den Genauigkeitsmodus. Ändern Sie den Titel in „Top 10“ und aktivieren Sie den Genauigkeitsmodus. Das Endergebnis sieht folgendermaßen aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="Spotify Wrapped-Visualisierung mit Kibana" /><p>Was genau sagt uns das nun? Ohne die Zeitkomponente zu berücksichtigen, können wir sagen, dass ich in meiner gesamten Hörhistorie bei Spotify 5,67 % mit dem Hören von <code>Fred Again..</code> verbracht habe. Insbesondere habe ich 1,21 % dieser Zeit mit dem Hören von <code>Delilah (pull me out of this)</code> verbracht. Es ist interessant zu sehen, ob es ein einzelnes Lied gibt, das einen Künstler beschäftigt, oder ob es auch andere Lieder gibt. Die Baumkarte selbst ist eine gute Darstellungsform für solche Datenverteilungen.</p><h3>Höre ich zu einer bestimmten Uhrzeit und an einem bestimmten Tag?</h3><p>Nun, das können wir ganz einfach mit einer Lens-Visualisierung beantworten, die die <code>Heat Map</code> nutzt. Erstellen Sie eine neue Linse, wählen Sie <code>Heat Map</code> aus. Wählen Sie für <code>Horizontal Axis</code> das Feld <code>dayOfWeek</code> aus und stellen Sie es auf <code>Top 7</code> anstatt auf Top 3 ein. Für <code>Vertical Axis</code> wähle <code>hourOfDay</code> und für <code>Cell Value</code> einfach <code>Count of records</code>. Dadurch wird folgendes Panel erzeugt:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="Visualisierung der Hörgewohnheiten von Spotify Wrapped mithilfe von Dashboards" /><p>Es gibt ein paar ärgerliche Dinge an diesem Objektiv, die mich beim Interpretieren einfach stören. Lasst uns versuchen, es ein wenig aufzuräumen. Zunächst einmal ist mir die Legende nicht so wichtig, verwenden Sie das Symbol oben mit dem Dreieck, Quadrat und Kreis und deaktivieren Sie sie.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Spotify Wrapped-Visualisierung " /><p>Der zweite ärgerliche Punkt ist nun die Sortierung der Tage. Es ist Montag, Mittwoch, Donnerstag oder irgendein anderer Tag, je nachdem, welche Werte Sie haben. Die <code>hourOfDay</code> ist korrekt sortiert. Die Art und Weise, wie die Tage sortiert werden, ist ein witziger Trick, nämlich die Verwendung von <code>Filters</code> anstelle von <code>Top Values</code>. Klicken Sie auf <code>dayOfWeek</code> und wählen Sie <code>Filters</code> aus. Es sollte nun so aussehen:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="Spotify Wrapped Verlaufsvisualisierung mit Kibana Dashboards" /><p>Jetzt fangen Sie einfach an, die Tage einzugeben. Ein Filter pro Tag. <code>"dayOfWeek" : Monday</code> und gib ihm die Bezeichnung <code>Monday</code> und wiederhole den Vorgang.</p><p>Allerdings gibt es dabei einen Haken: Spotify stellt die Daten in UTC+0 ohne Zeitzoneninformationen bereit. Natürlich liefern sie auch die IP-Adresse und das Land, in dem Sie zugehört haben, und wir könnten daraus die Zeitzoneninformationen ableiten, aber das kann ungenau sein, und für Länder wie die USA, die mehrere Zeitzonen haben, kann es zu umständlich sein. Dies ist wichtig, da Elasticsearch und Kibana Zeitzonen unterstützen. Durch die Angabe der korrekten Zeitzone im Feld <code>@timestamp</code> passt Kibana die Zeit automatisch an die Zeit Ihres Browsers an.</p><p>So sollte es nach der Fertigstellung aussehen, und man kann erkennen, dass ich während der Arbeitszeit sehr aktiv zuhöre, samstags und sonntags hingegen weniger.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="Spotify Wrapped-Visualisierung mit Kibana Dashboards" /><h2>Fazit</h2><p>In diesem Blogbeitrag sind wir etwas tiefer in die Feinheiten der Spotify-Daten eingetaucht. Wir haben einige einfache und schnelle Wege aufgezeigt, wie man Visualisierungen erstellen und ausführen kann. Es ist einfach fantastisch, so viel Kontrolle über den eigenen Hörverlauf zu haben. Schaut euch auch die anderen Teile der Serie an:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">Teil 1: So erstellen Sie Ihr eigenes Spotify Wrapped in Kibana</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">Teil 3: Populationsjobs zur Anomalieerkennung</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">Teil 4: Beziehungen in Daten erkennen</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">Teil 5: Finde deinen besten Musikfreund mit Vektoren</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[Analysen]]></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[Lokales Testen von DeepSeek R1 für RAG mit Ollama und Kibana]]></title>
    <description><![CDATA[Erfahren Sie, wie Sie eine lokale Instanz von DeepSeek ausführen und sich von Kibana aus damit verbinden.]]></description>
    <content:encoded><![CDATA[<p>Alle reden über DeepSeek R1, das neue große Sprachmodell des chinesischen Hedgefonds High-Flyer. Die Nachrichten sind voll von Spekulationen darüber, was es für die Branche bedeutet, dass sie nun ein fähiges, mit offenen Gewichtungen arbeitendes LLM mit Kettenlogik eingeführt haben. Für alle, die neugierig sind und dieses neue Modell mit RAG und den intelligenten Funktionen der Vektordatenbank von Elasticsearch ausprobieren möchten, gibt es hier ein kurzes Tutorial, das Ihnen den Einstieg in die Verwendung von DeepSeek R1 mit lokaler Inferenz erleichtert. Dabei verwenden wir die Playground-Funktion von Elastic und entdecken sogar einige gute und schlechte Eigenschaften von DeepSeek R1 für RAG.</p><p>Hier ist ein Diagramm, das zeigt, was wir in diesem Tutorial konfigurieren werden:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3214cc505e3d4d06/6a17df98dbb4ff12bafb55da/8aafec9011e986cd85b10958544a4d77be81e518-739x419.png" alt="DeepSeek-Konfiguration mit Elasticsearch und Ollama" /><h2>Einrichten der lokalen Inferenz mit Ollama</h2><p><a href="https://ollama.com/">Ollama</a> ist eine hervorragende Möglichkeit, schnell eine kuratierte Auswahl an Open-Source-Modellen für lokale Inferenztests auszuprobieren, und ein beliebtes Werkzeug für KI-Entwickler.</p><h3>Ausführen von Ollama bare metal</h3><p>Eine <a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama">lokale Installation</a> auf Mac, Linux oder Windows ist der einfachste Weg, um lokale GPU-Funktionen zu nutzen, insbesondere für Nutzer mit Apple-Chips der M-Serie. Sobald Sie Ollama installiert haben, können Sie DeepSeek R1 mit dem folgenden Befehl herunterladen und ausführen.</p><p>Vielleicht möchten Sie die Parametergröße an Ihre Hardware anpassen. Verfügbare Größen finden Sie <a href="https://ollama.com/library/deepseek-r1">hier</a>.</p>ollama run deepseek-r1:7b<p>Sie können im Terminal mit dem Modell chatten, aber das Modell läuft auch dann weiter, wenn Sie den Befehl mit Strg+d verlassen oder „/bye“ eingeben. Um zu sehen, ob das Modell noch läuft, geben Sie Folgendes ein:</p>ollama ps<h3>Ollama in einem Container ausführen</h3><p>Der schnellste alternative Weg zum Ausführen von Ollama ist die Nutzung einer Container-Engine wie Docker. Die Nutzung der GPU Ihres lokalen Rechners ist je nach Umgebung nicht immer einfach, aber eine schnelle Testeinrichtung ist nicht schwer, solange Ihr Container über genügend RAM und Speicherplatz für die Multi-GB-Modelle verfügt.</p><p>Das Einrichten und Ausführen von Ollama in Docker ist so einfach wie der Befehl:</p>mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama
<p>Dies erstellt ein Verzeichnis namens „Ollama“ im aktuellen Verzeichnis und verankert es im Container, um die Ollama-Konfiguration sowie die Modelle zu speichern. Je nach Anzahl der verwendeten Parameter können diese eine Größe von einigen GB bis zu Dutzenden von GB haben, daher sollten Sie ein Laufwerk mit ausreichend freiem Speicherplatz wählen.</p><p>Hinweis: Wenn Sie eine Nvidia-GPU in Ihrem Computer haben, installieren Sie unbedingt das <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation">Nvidia Container-Toolkit</a> und fügen Sie dem obigen Befehl zum Ausführen von Docker „--gpus=all“ hinzu.</p><p>Sobald der Ollama-Container auf Ihrem Rechner läuft, können Sie ein Modell wie DeepSeek R1 mit folgendem Befehl abrufen:</p>docker exec -it ollama ollama pull deepseek-r1:7b<p>Ähnlich wie beim Bare-Metal-Ansatz möchten Sie möglicherweise die Parametergröße ändern, um sie an Ihre Hardware anzupassen. Verfügbare Größen finden Sie unter <a href="https://ollama.com/library/deepseek-r1">https://ollama.com/library/deepseek-r1</a>.</p><p>Sobald das Herunterladen des Modells abgeschlossen ist, können Sie „/bye“ eingeben, um die Eingabeaufforderung zu beenden. So überprüfen Sie, ob das Modell noch ausgeführt wird:</p>docker exec -it ollama ollama ps<h2>Testen unserer lokalen Inferenz mit einem Curl</h2><p>Um die lokale Inferenz mit cURL zu testen, können Sie den folgenden Befehl ausführen. Wir verwenden stream:false, damit wir die narrative JSON-Reaktion leicht lesen können:</p>curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "prompt":"Why is Elastic so cool?"
}'<h2>Testen von „OpenAI-kompatiblem“ Ollama und einer RAG-Eingabeaufforderung</h2><p>Praktischerweise bietet Ollama auch einen REST-Endpoint, der das Verhalten von OpenAI nachahmt, um die Kompatibilität mit einer Vielzahl von Tools, einschließlich Kibana, zu gewährleisten.</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>Das Testen dieser komplexeren Eingabeaufforderung führt zu Inhalten, die einen &lt;think&gt;-Abschnitt enthalten, in dem das Modell darauf trainiert wurde, das Problem zu durchdenken.</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>Ollama mit Kibana verbinden</h2><p>Eine großartige Möglichkeit, Elasticsearch zu nutzen, ist das „<a href="https://github.com/elastic/start-local?tab=readme-ov-file#-try-elasticsearch-and-kibana-locally">start-local</a>“-Entwicklungsskript.</p><p>Stellen Sie sicher, dass Kibana und Elasticsearch Ihr Ollama im Netzwerk erreichen können. Wenn Sie ein lokales Container-Setup des Elastic Stack verwenden, bedeutet dies möglicherweise, dass Sie „localhost“ durch „host.docker.internal“ oder „host.containers.internal“ ersetzen müssen, um einen Netzwerkpfad zum gehosteten Computer zu erhalten.</p><p>Navigieren Sie in Kibana zu Stack Management &gt; Alerts and Insights &gt; Connectors.</p><h3>Was tun, wenn Sie diese allgemeine Setup-Warnung sehen?</h3><p>Sie müssen sicherstellen, dass der xpack.encryptedSavedObjects.encryptionKey <a href="https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html">korrekt eingestellt ist</a>. Dies ist ein häufig übersehener Schritt bei der lokalen Docker-Installation von Kibana, daher liste ich die Schritte zur Behebung in der Docker-Syntax auf.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4f7b7be2e04afae/6a17df9a1d1b8391e293e393/b70b4b810bcac1d1599b07da90a98c5c744a38de-497x223.png" alt="" /><p>Stellen Sie sicher, dass Sie Ihr Kibana/Konfig-Verzeichnis dauerhaft speichern, damit Änderungen erhalten bleiben, wenn der Container heruntergefahren wird. Meine Kibana-Container-Laufwerke sehen in der docker-compose.yml folgendermaßen aus:</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>Jetzt können Sie den Keystore erstellen und einen Wert eingeben, damit die Verbindungsschlüssel nicht im Klartext gespeichert werden.</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>Starten Sie Ihren gesamten Cluster vollständig neu, um sicherzustellen, dass die Änderungen wirksam werden.</p><h3>Erstellen des Connectors</h3><p>Erstellen Sie auf dem Connector-Konfigurationsbildschirm (navigieren Sie in Kibana zu Stack Management &gt; Alerts and Insights &gt; Connectors) einen Connector und wählen Sie den Typ „OpenAI“ aus.</p><p>Konfigurieren Sie den Connector mit den folgenden Einstellungen:</p><ul><li><p>Name des Connectors: Deepseek (Ollama)</p></li><li><p>Wählen Sie einen OpenAI-Anbieter aus: andere (OpenAI-kompatibler Dienst)</p></li><li><p>URL: <a href="http://localhost:11434/v1/chat/completions">http://localhost:11434/v1/chat/completions</a></p><ul><li><p>Passen Sie den richtigen Pfad zu Ihrem Ollama an. Denken Sie daran, host.docker.internal oder ein Äquivalent zu ersetzen, wenn Sie aus einem Container heraus aufrufen.</p></li></ul></li><li><p>Standardmodell: deepseek-r1:7b</p></li><li><p>API-Schlüssel: Denken Sie sich etwas aus, ein Eintrag ist erforderlich, aber der Wert spielt keine Rolle</p></li></ul><p>Beachten Sie, dass das Testen eines benutzerdefinierten Connectors zu Ollama im Connector-Setup derzeit in 8.17 nicht funktioniert, aber in der nachfolgenden Kibana-Version 8.18 behoben wurde.</p><p>Unser Connector sieht so aus:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774e0793eb110f9d/6a17df9c445de981014d004d/4ce214aa953b4090ed112fbde40b01c01fb8f5c7-786x836.png" alt="" /><h2>Vektoreingebettete Daten in Elasticsearch einlesen</h2><p>Wenn Sie bereits mit Playground vertraut sind und Daten eingerichtet haben, können Sie zum nächsten Playground-Schritt übergehen. Wenn Sie jedoch einige schnelle Testdaten benötigen, müssen wir sicherstellen, dass unsere _inference-APIs eingerichtet sind. Ab Version 8.17 sind die Zuweisungen für Machine Learning dynamisch, sodass wir zum Herunterladen und Aktivieren des mehrsprachigen e5-Vektors nur Folgendes in den Kibana Dev-Tools ausführen müssen.</p>GET /_inference


POST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{
   "input": "are internet memes about deepseek sound investment advice?"
}<p>Wenn Sie dies noch nicht getan haben, wird das Herunterladen des e5-Modells aus den Modell-Repositorys von Elastic ausgelöst.</p><p>Als Nächstes laden wir ein gemeinfreies Buch als unseren RAG-Kontext hoch. Hier können Sie „Alice im Wunderland“ von Project Gutenberg herunterladen: <a href="https://www.gutenberg.org/cache/epub/11/pg11.txt">Link</a>. Speichern Sie es als .txt-Datei.</p><p>Navigieren Sie zu Elasticsearch &gt; Home &gt; Datei hochladen</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c594487844ecb4/6a17df9dfaa9137edb93c786/649042271f34a5e66789b17c39bfe95971c7f4ce-1360x629.png" alt="" /><p>Wählen Sie Ihre Textdatei aus oder ziehen Sie sie per Drag &amp; Drop und klicken Sie dann auf die Schaltfläche „Importieren“.</p><p>Wählen Sie auf dem Bildschirm „Daten importieren“ die Registerkarte „Erweitert“ und setzen Sie den Indexnamen auf „book_alice“.</p><p>Wählen Sie die Option „Zusätzliches Feld hinzufügen“, sie befindet sich klein direkt unter „Automatisch erstellte Felder“. Wählen Sie „Semantisches Textfeld hinzufügen“ und ändern Sie den Inferenz-Endpoint in „.multilingual-e5-small-elasticsearch“. Wählen Sie „Hinzufügen“ und dann „Importieren“.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9c22ccdaee8590/6a17df9f3e03d731f94f2b8e/e58d5c9a2d406d8e62eb96cab9ac98ca89414346-507x602.png" alt="" /><p></p><p>Wenn das Laden und die Inferenz abgeschlossen sind, können wir zu Playground gehen.</p><h2>RAG im Playground testen</h2><p>Navigieren Sie in Kibana zu Elasticsearch &gt; Playground.</p><p>Auf dem Playground-Bildschirm sollten Sie ein grünes Häkchen und „LLM Connected“ sehen, das anzeigt, dass ein Connector vorhanden ist. Dies ist der Ollama-Connector, den wir gerade oben erstellt haben. Eine ausführlichere Anleitung für Playground finden Sie <a href="https://www.elastic.co/guide/en/kibana/current/playground.html">hier</a>.</p><p>Klicken Sie auf das blaue Symbol „Datenquellen hinzufügen“ und wählen Sie den „book_alice“-Index aus, den wir zuvor erstellt haben, oder einen anderen Index, den Sie zuvor konfiguriert haben und der Inferenz-APIs für Einbettungen verwendet.</p><p>DeepSeek ist ein Gedankenkettenmodell mit starken Ausrichtungsmerkmalen. Aus der RAG-Perspektive heraus ist dies sowohl gut als auch schlecht. Das Gedankenkettentraining kann DeepSeek dabei helfen, scheinbar widersprüchliche Aussagen in Zitaten zu rationalisieren, aber die starke Ausrichtung auf Trainingswissen kann auch dazu führen, dass es seine eigene Version der Weltfakten unserer Kontextgrundlage vorzieht. Diese starke Ausrichtung ist zwar gut gemeint, erschwert jedoch bekanntermaßen die Unterweisung von LLMs bei der Erörterung von Themen, bei denen unser privates Wissen im Trainingsdatensatz eingeschränkt oder nicht gut repräsentiert ist.</p><p>In unserem Playground-Setup haben wir folgende Systemvorgabe eingetragen: „Sie sind ein Assistent für Frage-Antwort-Aufgaben anhand relevanter Textstellen aus dem Buch „Alice im Wunderland““ und die anderen Vorgaben übernommen.</p><p>Auf die Frage „Wer war bei der Teeparty?“ erhalten wir die Antwort: „Der Märzhase, der Hutmacher und die Haselmaus waren bei der Teeparty. [Zitat: Position 1 und 2]“, was korrekt ist.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ce6a0facd972fdd/6a17dfa03e03d79aaa4f2b92/e8af3ff93a72e1f02de8e73f6c2606cbc19970e5-1296x813.png" alt="" /><p>Anhand der &lt;think&gt;-Tags können wir erkennen, dass DeepSeek bei der Beantwortung der Fragen definitiv über den Inhalt der Zitate nachgedacht hat.</p><h2>Testen von Ausrichtungsbeschränkungen</h2><p>Lassen Sie uns als Test ein intellektuell anspruchsvolles Szenario für DeepSeek erstellen. Wir erstellen einen Index von Verschwörungstheorien, von denen die Trainingsdaten von DeepSeek wissen, dass sie nicht wahr sind.</p><p>In den Kibana-Entwicklungstools erstellen wir den folgenden Index und die folgenden Daten:</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>
Diese Verschwörungstheorien werden die Grundlage für unser LLM bilden. Trotz einer aggressiven Systemaufforderung akzeptiert DeepSeek unsere Version der Fakten nicht. Wären wir in einer Situation, in der wir wüssten, dass unsere privaten Daten vertrauenswürdiger, fundierter oder auf die Bedürfnisse unserer Organisation abgestimmt sind, wäre dies nicht akzeptabel:</p><p>Zur Testfrage „Sind Vögel echt?“ (Erklärung <a href="https://knowyourmeme.com/memes/birds-arent-real">kenne dein Meme</a>) erhalten wir die Antwort: „Im angegebenen Kontext werden Vögel nicht als real angesehen, aber in Wirklichkeit sind sie echte Tiere. [Kontext: Position 1]“. Dieser Test beweist, dass DeepSeek R1 auch auf der 7B-Parameterebene leistungsstark ist … je nach unserem Datensatz ist es jedoch möglicherweise nicht die beste Wahl für RAG.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e8dabf65ea200e1/6a17dfa2ec0f8982135a6541/67d5f6cdb97bfd3adb926cbd588c768f9d6730ae-1277x737.png" alt="" /><h2>Was haben wir also gelernt?</h2><p>Zusammenfassend:</p><ul><li><p>Das lokale Ausführen von Modellen in Tools wie Ollama ist eine großartige Möglichkeit, einen Blick auf das Modellverhalten zu werfen.</p></li><li><p>DeepSeek R1 ist ein Schlussfolgerungsmodell, was bedeutet, dass es für Anwendungsfälle wie RAG Vor- und Nachteile hat.</p></li><li><p>Playground ist in der Lage, sich über eine OpenAI-ähnliche REST-API mit Inferenz-Hosting-Frameworks wie Ollama zu verbinden, was in dieser frühen Ära des KI-Hostings zu einem De-facto-Standard wird.</p></li></ul><p>Insgesamt sind wir beeindruckt, wie weit die lokale, „air-gapped“-RAG gekommen ist. Die Tools in Elasticsearch, Kibana und die verfügbaren Open-Weight-Modelle haben sich erheblich weiterentwickelt, seit wir 2023 zum ersten Mal über die <a href="https://www.elastic.co/search-labs/blog/privacy-first-ai-search-langchain-elasticsearch">datenschutzfreundliche KI-Suche</a> geschrieben haben.</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[KI]]></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[Geodaten mit Kibana in Elasticsearch einlesen und in ES|QL verwenden]]></title>
    <description><![CDATA[Wie man Kibana und den CSV-Ingest-Prozessor verwendet, um Geodaten in Elasticsearch einzulesen und damit in der Elasticsearch Query Language (ES|QL) zu suchen. Elasticsearch verfügt über leistungsstarke Geodaten-Suchfunktionen, die nun in ES|QL integriert werden, um die Benutzerfreundlichkeit und OGC-Vertrautheit deutlich zu verbessern. Um diese Funktionen nutzen zu können, benötigen wir jedoch Geodaten.]]></description>
    <content:encoded><![CDATA[<p>Kürzlich haben wir einen Blogbeitrag veröffentlicht, in dem wir die Verwendung der neuen <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">Geodaten-Suchfunktionen</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">in</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">ES|QL</a>, der neuen, leistungsstarken <a href="https://www.elastic.co/search-labs/blog/esql-piped-query-language-goes-ga">Abfragesprache</a> von Elasticsearch, beschreiben. Um diese Funktionen nutzen zu können, benötigen Sie Geodaten in Elasticsearch. In diesem Blogbeitrag zeigen wir Ihnen, wie Sie Geodaten einlesen und in ES|QL-Abfragen verwenden.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" alt="ESQL-Geodatensuche" /><h2>Importieren von Geodaten mit Kibana</h2><p>Die Daten, die wir für die Beispiele im vorherigen Blog verwendet haben, basierten auf Daten, die wir intern für Integrationstests verwenden. Zu Ihrer Bequemlichkeit haben wir es hier in Form einiger CSV-Dateien beigefügt, die Sie problemlos mit Kibana importieren können. Die Daten setzen sich aus Flughäfen, Städten und Stadtgrenzen zusammen. Sie können die Daten hier herunterladen:</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">airports.csv</a></p><ul><li><p>Dies beinhaltet die Zusammenführung von drei Datensätzen:</p><ul><li><p>Flughäfen (Namen, Standorte und zugehörige Daten) von <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/">Natural Earth</a></p></li><li><p>Stadtstandorte von <a href="https://simplemaps.com/data/world-cities">SimpleMaps</a></p></li><li><p>Flughafenhöhen aus <a href="https://www.partow.net/miscellaneous/airportdatabase/">der globalen Flughafendatenbank</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">airport_city_boundaries.csv</a></p><ul><li><p>Dies beinhaltet eine Zusammenführung der oben genannten Flughafen- und Städtenamen mit einer neuen Quelle:</p><ul><li><p>Stadtgrenzen aus <a href="https://www.openstreetmap.org/">OpenStreetMap</a></p></li></ul></li></ul></li></ul><p>Wie Sie sich vorstellen können, haben wir einige Zeit damit verbracht, diese Datenquellen in den beiden oben genannten Dateien zusammenzuführen, mit dem Ziel, die Geodatenfunktionen von ES|QL testen zu können. Dies entspricht möglicherweise nicht ganz Ihren spezifischen Datenanforderungen, aber hoffentlich gibt Ihnen dies eine Vorstellung davon, was möglich ist. Insbesondere möchten wir einige interessante Dinge demonstrieren:</p><ul><li><p>Importieren von Daten mit Geodatenfeldern zusammen mit anderen indexierbaren Daten</p></li><li><p>Importieren von <code>geo_point</code> und <code>geo_shape</code> -Daten und deren gemeinsame Verwendung in Abfragen</p></li><li><p>Importieren von Daten in zwei Indizes, die über eine räumliche Beziehung verknüpft werden können</p></li><li><p>Erstellung einer Ingest-Pipeline zur Erleichterung zukünftiger Importe (über Kibana hinaus)</p></li><li><p>Einige Beispiele für Ingest-Prozessoren, wie <code>csv</code>, <code>convert</code> und <code>split</code></p></li></ul><p>In diesem Blogbeitrag geht es zwar um die Arbeit mit CSV-Daten, aber es ist wichtig zu verstehen, dass es <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">mehrere Möglichkeiten</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">gibt, Geodaten mit</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">Kibana</a> hinzuzufügen . Innerhalb der Kartenanwendung können Sie durch Trennzeichen getrennte Daten wie CSV, GeoJSON und ESRI ShapeFiles hochladen und auch direkt in der Karte Formen zeichnen. In diesem Blogbeitrag konzentrieren wir uns auf den Import von CSV-Dateien von der Kibana-Startseite.</p><h3>Import der Flughäfen</h3><p>Die erste Datei, <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">airports.csv</a>, hat einige interessante Eigenheiten, mit denen wir uns auseinandersetzen müssen. Erstens weisen die Spalten zusätzliche Leerzeichen als Trennzeichen auf, was für CSV-Dateien untypisch ist. Zweitens handelt es sich bei dem Feld <code>type</code> um ein Mehrwertfeld, das wir in separate Felder aufteilen müssen. Schließlich handelt es sich bei einigen Feldern nicht um Zeichenketten, sondern um Felder, die in den richtigen Datentyp konvertiert werden müssen. All dies kann mithilfe der CSV-Importfunktion von Kibana erfolgen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt393bc416bf425301/6a16f707839dfa1e86dcfca9/b1afd8c95973bec32f229a9adfaef14680b09a8e-1944x478.png" alt="Kibana Upload – Vorschau" /><p>Beginnen Sie auf der Kibana-Startseite. Es gibt einen Abschnitt mit dem Titel „Erste Schritte durch Hinzufügen von Integrationen“, der einen Link mit der Bezeichnung „Datei hochladen“ enthält:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte12fc741edab20d3/6a16f709acf088600fbe98bf/996372bb3a52859cc840bd1d8f984a33a0e7ada3-1180x410.png" alt="Kibana-Startseite – Datei hochladen" /><p>Klicken Sie auf diesen Link, und Sie gelangen zur Seite „Datei hochladen“. Hier können Sie die <code>airports.csv</code> -Datei per Drag &amp; Drop einfügen. Kibana analysiert die Datei und zeigt Ihnen eine Vorschau der Daten an. Das System hätte das Trennzeichen automatisch als Komma und die erste Zeile als Kopfzeile erkennen sollen. Allerdings wurden vermutlich weder die zusätzlichen Leerzeichen zwischen den Spalten entfernt, noch wurden die Typen der Felder bestimmt, da angenommen wurde, dass alle Felder entweder <code>text</code> oder <code>keyword</code> sind. Das müssen wir beheben.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf65a09ec0c7a61ad/6a16f70ad7c0227aedde626f/1d9ffa6cdbc0d67a228be1a747ec1ebda6a63099-1800x538.png" alt="Kibana Upload – Vorschau" /><p>Klicken Sie auf <code>Override settings</code> und aktivieren Sie das Kontrollkästchen für <code>Should trim fields</code>, und anschließend <code>Apply</code> um die Einstellungen zu schließen. Nun müssen wir die Datentypen der Felder korrigieren. Dies ist auf der nächsten Seite verfügbar, also klicken Sie bitte auf <code>Import</code>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda9a5f85d8e693dc/6a16f70c60084b72f53c4348/a97aceffb1858eae26a213336913505ae9923b03-1800x526.png" alt="Kibana Upload - Import" /><p>Wählen Sie zuerst einen Indexnamen aus und anschließend <code>Advanced</code> , um zur Seite für Feldzuordnungen und Datenverarbeitung zu gelangen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt56705083cdd9eb18/6a16f70d66c4f93350f8bdbb/058b0fb09da0b8d7f9c9b0a9c83b8b485ce43925-1440x629.png" alt="Kibana Upload – Feldzuordnungen" /><p>Hier müssen wir sowohl die Feldzuordnungen für den Index als auch die Datenaufnahmepipeline anpassen. Erstens hat Kibana wahrscheinlich das Feld <code>scalerank</code> automatisch als <code>long</code> erkannt, aber die Felder <code>location</code> und <code>city_location</code> fälschlicherweise als <code>keyword</code> interpretiert. Ändern Sie sie in <code>geo_point</code>, sodass die Zuordnungen am Ende etwa so aussehen:</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>Sie haben hier eine gewisse Flexibilität, aber beachten Sie, dass die Wahl des Typs Einfluss darauf hat, wie das Feld indiziert wird und welche Art von Abfragen möglich ist. Wenn Sie beispielsweise <code>location</code> auf <code>keyword</code> belassen, können Sie keine Geodaten-Suchanfragen darauf durchführen. Wenn Sie <code>elevation</code> als <code>text</code> belassen, können Sie keine numerischen Bereichsabfragen darauf durchführen.</p><p>Jetzt ist es an der Zeit, die Datenaufnahmepipeline zu reparieren. Falls Kibana <code>scalerank</code> automatisch als <code>long</code> erkannt hat, wurde außerdem ein Prozessor hinzugefügt, um das Feld in <code>long</code> umzuwandeln. Wir müssen einen ähnlichen Prozessor für das Feld <code>elevation</code> hinzufügen, der es diesmal in <code>double</code> umwandelt. Bearbeiten Sie die Pipeline, um sicherzustellen, dass diese Konvertierung vorhanden ist. Bevor wir dies speichern, möchten wir noch eine weitere Konvertierung durchführen, um das Feld <code>type</code> in mehrere Felder aufzuteilen. Fügen Sie der Pipeline einen <code>split</code> -Prozessor mit folgender Konfiguration hinzu:</p>{
  "split": {
    "field": "type",
    "separator": ":",
    "ignore_missing": true
  }
}<p>Die finale Datenaufnahmepipeline sollte wie folgt aussehen:</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>Beachten Sie, dass wir keinen Konvertierungsprozessor für die Felder <code>location</code> und <code>city_location</code> hinzugefügt haben. Dies liegt daran, dass der Typ <code>geo_point</code> in der Feldzuordnung das WKT- Format der Daten in diesen Feldern bereits versteht. Der Typ <code>geo_point</code> versteht eine Reihe von Formaten, darunter <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html">WKT, GeoJSON und mehr</a>. Wenn wir beispielsweise zwei Spalten in der CSV-Datei für <code>latitude</code> und <code>longitude</code> hätten, hätten wir entweder einen <code>script</code> oder einen <code>set</code> Prozessor hinzufügen müssen, um diese zu einem einzigen <code>geo_point</code> Feld zu kombinieren (z. B. <code>"set": {"field": "location", "value": "{{lat}},{{lon}}"}</code>).</p><p>Wir sind nun bereit, die Datei zu importieren. Klicken Sie auf <code>Import</code> , und die Daten werden mit den soeben definierten Mappings und der Ingest-Pipeline in den Index importiert. Sollten beim Einlesen der Daten Fehler auftreten, werden diese von Kibana hier gemeldet, sodass Sie entweder die Quelldaten oder die Einlesepipeline bearbeiten und es erneut versuchen können.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte81621425c7289c5/6a16f70f839dfaf608dcfcad/55dde2940c7aba66ce8257d15007ef797b8a5107-1440x415.png" alt="Kibana Upload - Importieren" /><p>Beachten Sie, dass eine neue Aufnahmepipeline erstellt wurde. Dies kann angezeigt werden, indem man im Kibana-Bereich <code>Stack Management</code> auf die Option <code>Ingest pipelines</code> klickt. Hier können Sie die soeben erstellte Pipeline sehen und sie bei Bedarf bearbeiten. Tatsächlich kann der Abschnitt <code>Ingest pipelines</code> zum Erstellen und Testen von Ingest-Pipelines verwendet werden, eine sehr nützliche Funktion, wenn Sie noch komplexere Ingests planen.</p><p>Wenn Sie diese Daten sofort erkunden möchten, springen Sie zu den späteren Abschnitten. Wenn Sie aber auch die Stadtgrenzen importieren möchten, lesen Sie weiter.</p><h3>Importieren der Stadtgrenzen</h3><p>Die unter <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> verfügbare Datei mit den Stadtgrenzen ist etwas einfacher zu importieren als das vorherige Beispiel. Es enthält ein <code>city_boundary</code> Feld, das eine WKT-Darstellung der Stadtgrenze als <code>POLYGON</code> ist, und ein <code>city_location</code> Feld, das eine <code>geo_point</code> Darstellung des Stadtstandorts ist. Wir können diese Daten auf ähnliche Weise wie die Flughafendaten importieren, allerdings mit einigen Unterschieden:</p><ul><li><p>Wir mussten die Überschreibungseinstellung <code>Has header row</code> auswählen, da diese nicht automatisch erkannt wurde.</p></li><li><p>Wir mussten keine Felder kürzen, da die Daten bereits frei von überflüssigen Leerzeichen waren.</p></li><li><p>Wir mussten die Datenaufnahmepipeline nicht bearbeiten, da alle Datentypen entweder Zeichenketten oder räumliche Datentypen waren.</p></li><li><p>Wir mussten jedoch die Feldzuordnungen bearbeiten, um das Feld <code>city_boundary</code> auf <code>geo_shape</code> und das Feld <code>city_location</code> auf  zu setzen. <code>geo_point</code></p></li></ul><p>Unsere endgültigen Feldzuordnungen sahen wie folgt aus:</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>Wie beim Import mit <code>airports.csv</code> zuvor, klicken Sie einfach auf <code>Import</code> , um die Daten in den Index zu importieren. Die Daten werden mit den von uns bearbeiteten Mappings und der von Kibana definierten Ingest-Pipeline importiert.</p><h3>Erkundung von Geodaten mit Entwicklerwerkzeugen</h3><p>In Kibana ist es üblich, die indizierten Daten mit dem Befehl „Discover“ zu erkunden. Wenn Sie jedoch Ihre eigene Anwendung mit ES|QL-Abfragen schreiben möchten, könnte es interessanter sein, auf die reine Elasticsearch-API zuzugreifen. Kibana verfügt über eine komfortable Konsole zum Experimentieren mit dem Schreiben von Abfragen. Dies wird als <code>Dev Tools</code> -Konsole bezeichnet und befindet sich in der Kibana-Seitenleiste. Diese Konsole kommuniziert direkt mit dem Elasticsearch-Cluster und kann zum Ausführen von Abfragen, Erstellen von Indizes und vielem mehr verwendet werden.</p><p>Versuchen Sie Folgendes:</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>Dies sollte folgende Ergebnisse liefern:</p><p>Distanz</p><p>Abkürzung</p><p>Name</p><p>Ort</p><p>Land</p><p>Stadt</p><p>Elevation</p><p>273418.05776847183</p><p>SCHINKEN</p><p>Hamburg</p><p>PUNKT (10.005647830925 53.6320011640866)</p><p>Deutschland</p><p>Norderstedt</p><p>17.0</p><p>337534.653466062</p><p>TXL</p><p>Berlin-Tegel Int'l</p><p>PUNKT (13.2903090925074 52.5544287044101)</p><p>Deutschland</p><p>Hohen Neuendorf</p><p>38,0</p><p>483713.15032266214</p><p>OSL</p><p>Oslo Gardermoen</p><p>Punkt (11.0991032762581 60.1935783171386)</p><p>Norwegen</p><p>Oslo</p><p>208.0</p><p>522538.03148094116</p><p>BMA</p><p>Bromma</p><p>PUNKT (17.9456175406145 59.3555902065112)</p><p>Schweden</p><p>Stockholm</p><p>15.0</p><p>522538.03148094116</p><p>ARN</p><p>Arlanda</p><p>Punkt (17.9307299016916 59.6511203397372)</p><p>Schweden</p><p>Stockholm</p><p>38,0</p><p>624274.8274399083</p><p>DUS</p><p>Düsseldorf Int'l</p><p>PUNKT (6,76494446612174 51,2781820420774)</p><p>Deutschland</p><p>Düsseldorf</p><p>45,0</p><p>633388.6966435644</p><p>PRG</p><p>Ruzyn</p><p>PUNKT (14.2674849854076 50.1076511703671)</p><p>Tschechien</p><p>Prag</p><p>381,0</p><p>635911.1873311149</p><p>AMS</p><p>Schiphol</p><p>Punkt (4,76437693232812 52,3089323889822)</p><p>Niederlande</p><p>Hoofddorp</p><p>-3.0</p><p>670864.137958866</p><p>FRA</p><p>Frankfurt International</p><p>PUNKT (8.57182286907608 50.0506770895207)</p><p>Deutschland</p><p>Frankfurt</p><p>111,0</p><p>683239.2529970079</p><p>WAW</p><p>Okecie Int'l</p><p>Punkt (20.9727263383587 52.171026749259)</p><p>Polen</p><p>Piaseczno</p><p>111,0</p><h2>Visualisierung von Geodaten mit Kibana Maps</h2><p>Kibana Maps ist ein leistungsstarkes Werkzeug zur Visualisierung von Geodaten. Es kann verwendet werden, um Karten mit mehreren Ebenen zu erstellen, wobei jede Ebene einen anderen Datensatz darstellt. Die Daten können auf verschiedene Weise gefiltert, aggregiert und formatiert werden. In diesem Abschnitt zeigen wir Ihnen, wie Sie in Kibana Maps eine Karte mit den Daten erstellen, die wir im vorherigen Abschnitt importiert haben.</p><p>Navigieren Sie im Kibana-Menü zu <code>Analytics</code>-&gt;<code>Maps</code> , um eine neue Kartenansicht zu öffnen. Klicken Sie auf <code>Add Layer</code> und wählen Sie <code>Documents</code> aus, wählen Sie die Datenansicht <code>airports</code> und bearbeiten Sie dann den Ebenenstil, um die Markierungen mithilfe des Feldes <code>elevation</code> einzufärben, damit wir leicht erkennen können, wie hoch jeder Flughafen liegt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcc4736d88c1abc9/6a16f7102b835f7353f4afca/9e63726d7c059331e6e20e474f8abee53dc2cbb4-840x388.png" alt="Kibana Maps – Flughafen-Layer-Stil" /><p>Klicken Sie auf „Änderungen beibehalten“, um die Karte zu speichern:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ec3cc535b5c21d8/6a16f71375879ec091fe15dc/32ad1dadb5d341a2b66662c58638b781122fc22c-2852x1528.png" alt="Kibana Maps – Flughäfen" /><p>Fügen Sie nun eine zweite Ebene hinzu und wählen Sie diesmal die Datenansicht <code>airport_city_boundaries</code> aus. Dieses Mal verwenden wir das Feld <code>city_boundary</code> , um die Ebene zu gestalten, und stellen die Füllfarbe auf ein helles Blau ein. Dadurch werden die Stadtgrenzen auf der Karte angezeigt. Achten Sie darauf, die Ebenen neu anzuordnen, damit die Flughafenmarkierungen ganz oben liegen.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2932d7ff4a7206c9/6a16f7156f7f0409f09145c7/53dd65026f9a98c13f2cc4f9328a79242f0b70de-2854x1510.png" alt="Kibana Maps – Layerstil für Stadtgrenzen" /><h2>Räumliche Verknüpfungen</h2><p>ES|QL unterstützt keine <code>JOIN</code> -Befehle, aber mit dem <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich"><code>ENRICH</code></a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich">-Befehl</a> lässt sich ein Sonderfall eines Joins realisieren. Dieser Befehl funktioniert ähnlich wie ein „Left Join“ in SQL und ermöglicht es Ihnen, Ergebnisse aus einem Index mit Daten aus einem anderen Index anzureichern, basierend auf einer räumlichen Beziehung zwischen den beiden Datensätzen.</p><p>Nehmen wir beispielsweise an, wir reichern die Ergebnisse einer Tabelle mit Flughäfen um zusätzliche Informationen über die jeweilige Stadt an, indem wir die Stadtgrenze ermitteln, die den Flughafenstandort enthält, und führen dann einige statistische Auswertungen der Ergebnisse durch:</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>Wenn Sie diese Abfrage ausführen, ohne vorher den Anreicherungsindex vorzubereiten, erhalten Sie eine Fehlermeldung wie:</p>cannot find enrich policy [city_boundaries]<p>Dies liegt daran, dass ES|QL, wie bereits erwähnt, keine echten <code>JOIN</code> -Befehle unterstützt. Ein wichtiger Grund dafür ist, dass Elasticsearch ein verteiltes System ist und Joins aufwändige Operationen sind, die schwer zu skalieren sind. Der Befehl <code>ENRICH</code> kann jedoch sehr effizient sein, da er speziell vorbereitete Anreicherungsindizes nutzt, die im gesamten Cluster dupliziert werden, wodurch lokale Joins auf jedem Knoten durchgeführt werden können.</p><p>Um dies besser zu verstehen, konzentrieren wir uns auf den Befehl <code>ENRICH</code> in der obigen Abfrage:</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary<p>Dieser Befehl weist Elasticsearch an, die aus dem Index <code>airports</code> abgerufenen Ergebnisse anzureichern und einen Join <code>intersects</code> zwischen dem Feld <code>city_location</code> des ursprünglichen Index und dem Feld <code>city_boundary</code> des Index <code>airport_city_boundaries</code> durchzuführen, den wir bereits in einigen Beispielen verwendet haben. Einige dieser Informationen sind in dieser Abfrage jedoch nicht klar ersichtlich. Was wir sehen, ist der Name einer Anreicherungsrichtlinie <code>city_boundaries</code>, und die fehlenden Informationen sind in dieser Richtliniendefinition enthalten.</p>{
  "geo_match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>Hier sehen wir, dass eine <code>geo_match</code> -Abfrage durchgeführt wird (<code>intersects</code> ist der Standardwert), das Feld, mit dem abgeglichen werden soll, ist <code>city_boundary</code>, und die <code>enrich_fields</code> sind die Felder, die wir dem Originaldokument hinzufügen möchten. Eines dieser Felder, nämlich <code>region</code> wurde tatsächlich als Gruppierungsschlüssel für den Befehl <code>STATS</code> verwendet, was ohne diese 'left join'-Funktion nicht möglich gewesen wäre. Weitere Informationen zu Anreicherungsrichtlinien finden Sie in der <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/enrich-setup.html">Anreicherungsdokumentation</a>.</p><p>Die Anreicherungsindizes und -richtlinien in Elasticsearch wurden ursprünglich für die Anreicherung von Daten während der Indexierung entwickelt, wobei Daten aus einem anderen vorbereiteten Anreicherungsindex verwendet wurden. In ES|QL hingegen funktioniert der Befehl <code>ENRICH</code> zur Abfragezeit und erfordert keine Verwendung von Ingest-Pipelines. Dadurch ähnelt es im Prinzip einem SQL <code>LEFT JOIN</code>, nur dass man nicht beliebige zwei Indizes verknüpfen kann, sondern nur einen normalen Index auf der linken Seite mit einem speziell vorbereiteten Anreicherungsindex auf der rechten Seite.</p><p>In beiden Fällen, ob für Ingest-Pipelines oder die Verwendung in ES|QL, müssen einige vorbereitende Schritte durchgeführt werden, um den Anreicherungsindex und die Richtlinie einzurichten. Wir haben den Index <code>airport_city_boundaries</code> bereits oben importiert, dieser kann jedoch nicht direkt als Anreicherungsindex im Befehl <code>ENRICH</code> verwendet werden. Zunächst müssen wir zwei Schritte durchführen:</p><ul><li><p>Erstellen Sie die oben beschriebene Anreicherungsrichtlinie, um den Quellindex, das Feld im Quellindex, mit dem abgeglichen werden soll, und die Felder, die nach dem Abgleich zurückgegeben werden sollen, zu definieren.</p></li><li><p>Führen Sie diese Richtlinie aus, um den Anreicherungsindex zu erstellen. Dabei wird ein spezieller interner Index erstellt, indem der ursprüngliche Quellindex in eine effizientere Datenstruktur eingelesen und anschließend im gesamten Cluster kopiert wird.</p></li></ul><p>Die Anreicherungsrichtlinie kann mit folgendem Befehl erstellt werden:</p>PUT /_enrich/policy/city_boundaries
{
  "match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>Die Richtlinie kann mit folgendem Befehl ausgeführt werden:</p>POST /_enrich/policy/city_boundaries/_execute<p>Beachten Sie, dass Sie diese Richtlinie erneut ausführen müssen, wenn Sie den Inhalt des Index <code>airport_city_boundaries</code> ändern, damit die Änderungen im Anreicherungsindex sichtbar werden. Führen wir nun die ursprüngliche ES|QL-Abfrage erneut aus:</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>Dies liefert die Top 5 Regionen mit den meisten Flughäfen, zusammen mit dem Schwerpunkt aller Flughäfen, die übereinstimmenden Regionen zugeordnet sind, und der Längenspanne der WKT-Darstellung der Stadtgrenzen innerhalb dieser Regionen:</p><p>Schwerpunkt</p><p>Anzahl</p><p>Region</p><p>PUNKT (-12.139086859300733 31.024386116624648)</p><p>126</p><p>null</p><p>PUNKT (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Detroit</p><p>Punkt (39.74537850357592 47.21613017376512)</p><p>3</p><p>городской округ Батайск</p><p>PUNKT (-156.80986787192523 20,476673701778054)</p><p>3</p><p>Hawaii</p><p>PUNKT (-73.94515332765877 40.70366442203522)</p><p>3</p><p>Stadt New York</p><p>PUNKT (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Detroit</p><p>PUNKT (-76.66873019188643 24.306286952923983)</p><p>2</p><p>New Providence</p><p>PUNKT (-3,0252167768776417 51,39245774131268)</p><p>2</p><p>Cardiff</p><p>PUNKT (-115.40993484668434 32,73126147687435)</p><p>2</p><p>Municipio de Mexicali</p><p>Punkt (41.790108773857355 50.302146775648)</p><p>2</p><p>Zentralbezirk</p><p>PUNKT (-73.88902732171118 45.57078813901171)</p><p>2</p><p>Montréal</p><p>Möglicherweise stellen Sie auch fest, dass die am häufigsten vorkommende Region <code>null</code> war. Was könnte das bedeuten? Zur Erinnerung: Ich habe diesen Befehl mit einem 'Left Join' in SQL verglichen. Das bedeutet, dass, wenn keine übereinstimmende Stadtgrenze für einen Flughafen gefunden wird, der Flughafen trotzdem zurückgegeben wird, jedoch mit <code>null</code> Werten für die Felder ab dem <code>airport_city_boundaries</code> Index. Es stellte sich heraus, dass es 125 Flughäfen gab, bei denen kein passender Eintrag <code>city_boundary</code> gefunden wurde, und einen Flughafen mit einer Übereinstimmung, bei dem das Feld <code>region</code> den <code>null</code> hatte. Dies führte zu einer Zählung von 126 Flughäfen ohne <code>region</code> in den Ergebnissen. Falls Ihr Anwendungsfall erfordert, dass alle Flughäfen einer Stadtgrenze zugeordnet werden können, müssten zusätzliche Daten beschafft werden, um die Lücken zu schließen. Es wäre notwendig, zwei Dinge zu ermitteln:</p><ul><li><p>Welche Datensätze im Index <code>airport_city_boundaries</code> haben keine <code>city_boundary</code> Felder?</p></li><li><p>welche Datensätze im Index <code>airports</code> nicht mit dem Befehl <code>ENRICH</code> übereinstimmen (d.h. (überschneiden sich nicht)</p></li></ul><h2>Verwendung von ES|QL für Geodaten in Kibana Maps</h2><p>Kibana hat die Unterstützung für Spatial ES|QL in der Kartenanwendung hinzugefügt. Das bedeutet, dass Sie nun ES|QL verwenden können, um in Elasticsearch nach Geodaten zu suchen und die Ergebnisse auf einer Karte zu visualisieren.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91922eb4ef43d290/6a16f7161949f737bfe7a7b5/bd78470bd8a4bc60f0db7006bd804b8fe87e2fea-1440x683.png" alt="Kibana Layers ES|QL" /><p>Im Menü „Ebenen hinzufügen“ gibt es eine neue Ebenenoption mit der Bezeichnung „ES|QL“. Wie alle bisher beschriebenen Geodatenfunktionen befindet sich auch diese in der „technischen Vorschauphase“. Durch Auswahl dieser Option können Sie der Karte eine Ebene hinzufügen, die auf den Ergebnissen einer ES|QL-Abfrage basiert. Man könnte beispielsweise eine Ebene zur Karte hinzufügen, die alle Flughäfen der Welt anzeigt.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5185ef7461d7e81d/6a16f718839dfa1559dcfcb1/1dd28d3d0509f92d26b0bb5320a2925f7a54c5d9-1440x736.png" alt="Kibana ES|QL - Flughäfen" /><p>Oder Sie könnten eine Ebene hinzufügen, die die Polygone ab dem Index <code>airport_city_boundaries</code> anzeigt, oder noch besser, wie wäre es mit der komplexen <code>ENRICH</code> -Abfrage oben, die Statistiken darüber generiert, wie viele Flughäfen sich in jeder Region befinden?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt51ee3543bb811d98/6a16f71a8b73cbbe63189df1/679a0a401faa613c7cedddd07c64f614ac2b7144-1440x727.png" alt="Kibana ES|QL – Regionsstatistik" /><h2>Was kommt als Nächstes?</h2><p>Der vorherige Blogbeitrag <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">zum Thema Geodaten-Suche</a> konzentrierte sich auf die Verwendung von Funktionen wie <code>ST_INTERSECTS</code> zur Durchführung von Suchvorgängen, die in Elasticsearch seit Version 8.14 verfügbar sind. Und in diesem Blog erfahren Sie, wie Sie die Daten importieren können, die wir für diese Suchvorgänge verwendet haben. Elasticsearch 8.15 brachte jedoch eine besonders interessante Funktion mit sich: <code>ST_DISTANCE</code> , mit der sich effiziente räumliche Distanzsuchen durchführen lassen, und dies wird das Thema des nächsten Blogbeitrags sein!</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>