<?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/es/search-labs/blog/category/kibana</link>
    </image>
    <link>https://www.elastic.co/es/search-labs/blog/category/kibana</link>
    <atom:link href="https://www.elastic.co/es/search-labs/rss/category/kibana.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[es]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 04:13:57 GMT</lastBuildDate>
  <item>
    <title><![CDATA[API de paneles de Kibana: un contrato estable para cada tipo de panel, probado por más de 50 equipos antes de GA]]></title>
    <description><![CDATA[Administra los dashboards de Kibana como código: haz commit con Git, promueve en todos los entornos y automatiza los despliegues con la API de Kibana y Terraform.]]></description>
    <content:encoded><![CDATA[<p>Las<a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards"> API de dashboards y visualizaciones de Kibana</a> están listas para producción en Elastic 9.5, disponibles en todos los niveles de suscripción, con total compatibilidad con versiones anteriores. Define tus paneles como JSON, haz commit en Git y luego despliega en diferentes entornos usando pipelines de integración continua y despliegue continuo (CI/CD),<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard"> Terraform</a> o cualquier herramienta que ya tengas. Más de 50 equipos probaron la API durante<a href="https://www.elastic.co/search-labs/blog/kibana-dashboards-as-code-terraform-api"> la vista previa técnica en la versión 9.4</a>, algunos ya ejecutándola en producción. La versión 9.5 también agrega nuevos endpoints (en vista previa técnica) para<a href="https://dashboardsapispec.kibana.dev/tags.html"> las etiquetas</a>, con endpoints <a href="https://dashboardsapispec.kibana.dev/markdowns.html"> de paneles Markdown</a> y<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"> Enlaces</a> disponibles ahora en Elastic Cloud Serverless y que aterrizan en la 9.6.</p><h2>Qué significa la compatibilidad con versiones anteriores para la API de Dashboards de Kibana</h2><p>Durante la vista previa técnica, la forma de la API podría cambiar entre versiones.[1] Eso ya no es así. Disponibilidad general (GA) significa:</p><ul><li><p><strong>Compatibilidad total con versiones anteriores.</strong> Con el tiempo, se agregarán nuevos campos y tipos de panel, pero los campos y el comportamiento actuales se mantendrán sin cambios. Cualquier cambio futuro que rompa la compatibilidad será considerado con mucho cuidado y solo se introducirá en una nueva versión principal del stack.</p></li><li><p><strong>Listo para producción con soporte completo.</strong> La API ofrece las garantías completas de soporte de Elastic. Puedes usarla de manera segura en entornos de producción para despliegues automatizados, promoción del entorno y administración programática del dashboard.</p></li></ul><h2>Nuevos endpoints de la API Kibana para los paneles de etiquetas, markdown y enlaces</h2><p>Elastic 9.5 también introduce un nuevo endpoint independiente para <a href="https://dashboardsapispec.kibana.dev/tags.html"><strong>etiquetas</strong></a>, que permite categorizar y filtrar paneles. Ahora puedes administrarlos mediante programación a través de endpoints CRUD dedicados, lo que facilita organizar paneles a gran escala en todos los entornos.	</p><p>Los nuevos endpoints de paneles <a href="https://dashboardsapispec.kibana.dev/markdowns.html"><strong>Markdown</strong></a> y <a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"><strong>Enlaces</strong></a> ya están disponibles en Serverless y llegarán en la próxima versión de la pila (9.6).</p><h2>¿Qué tipos de paneles soporta la API de Kibana Dashboards?</h2><p>La API de dashboards admite todos los <em>paneles por valor</em> en la versión 9.5 (los definidos directamente en un dashboard, a diferencia de los paneles de biblioteca guardados para su reutilización). Cada tipo de panel admitido tiene un esquema tipificado y validado.</p><p><strong>Tipo de panel</strong></p><p><strong>Estado</strong></p><p>Gráficos XY</p><p>Con soporte</p><p>Métricas</p><p>Con soporte</p><p>Circular</p><p>Con soporte</p><p>Calibre</p><p>Con soporte</p><p>Mapa de calor</p><p>Con soporte</p><p>Tablas de datos</p><p>Con soporte</p><p>Mapa de árbol</p><p>Con soporte</p><p>Sesiones de Discover</p><p>Con soporte</p><p>Controles</p><p>Con soporte</p><p>Markdown</p><p>Con soporte</p><p>Enlaces</p><p>Con soporte</p><p>Paneles de ML</p><p>Con soporte</p><p>Paneles de Observability</p><p>Con soporte</p><p>Mapas</p><p>Próximamente</p><p>Vega</p><p>Próximamente</p><h2>Cómo gestionar los dashboards de Kibana como código</h2><p>La API de dashboards permite un flujo de trabajo completo de dashboards como código: exportar un dashboard como JSON limpio y diferenciable, hacer commit en Git como fuente de verdad, revisar los cambios en pull requests, y desplegar la misma definición en desarrollo, staging y producción. Una vez que un dashboard se administra como código, trata a Git como la única fuente de verdad: los cambios efectuados directamente en la UI se sobrescriben la próxima vez que despliegues.</p><p>El principal desafío al mover un dashboard entre espacios, clústeres o etapas es que los dashboards hacen referencia a objetos como Data view y visualizaciones de biblioteca mediante un ID. Debido a que estos ID se generan automáticamente y difieren de un entorno a otro, un dashboard exportado desde un entorno puede apuntar a objetos que no existen en otro. Hay tres formas de manejarlo, enumeradas aquí de la más a la menos automatizada:</p><ul><li><p><strong>Usa Terraform.</strong> El <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">proveedor Elastic Stack Terraform</a> rastrea cada recurso y mapea automáticamente los ID por entorno, por lo que las referencias se mantienen estables mientras promocionas un dashboard desde el desarrollo hasta la producción.</p></li><li><p><strong>Definir por valor </strong><a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"><strong>Paneles de lenguaje de búsqueda de Elasticsearch (ES|QL)</strong></a><strong>.</strong> La forma más portátil de construir un panel es definir su visualización con ES|QL directamente en el dashboard. Una consulta <a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql-kibana">ES|QL</a> lee los índices que se especifican en ella, por lo que el panel no contiene referencias externas a vistas de datos ni a objetos de biblioteca. El resultado es un dashboard totalmente autónomo y portátil.</p></li><li><p><strong>Asigna ID coincidentes.</strong> Si haces referencia a objetos guardados, como Data view o visualizaciones de biblioteca, créalos con un ID elegido usando PUT (upsert) en lugar de POST (que genera automáticamente un ID). Emplea ID legibles por humanos, como logs-prod, para que sean fáciles de reutilizar y reconocer en diferentes entornos.</p></li></ul><p>Para un recorrido detallado de estos patrones de portabilidad y del flujo de trabajo completo de dashboards como código, consulta la <a href="https://www.elastic.co/docs/explore-analyze/dashboards/manage-dashboards-as-code#dashboards-as-code-portability">documentación de Gestionar dashboards como código</a>.</p><h3>Crea un dashboard de Kibana con la API de dashboards usando PUT</h3><p>Aquí hay un ejemplo rápido de crear un dashboard con un panel métrico usando PUT en lugar de POST para asignar un ID personalizado usando el nombre del dashboard (service-health-overview). La misma lógica funciona para crear visualizaciones independientes guardadas en la biblioteca.</p>PUT kbn:/api/dashboards/service-health-overview
{
  "title": "Service health overview",
  "description": "Key service metrics — managed via API",
  "tags": [
    "production",
    "sre-team"
  ],
  "panels": [
    {
      "type": "vis",
      "grid": {
        "x": 0,
        "y": 0,
        "w": 12,
        "h": 8
      },
      "config": {
        "title": "Error rate (5xx)",
        "type": "metric",
        "data_source": {
          "type": "esql",
          "query": "FROM logs-* | WHERE http.response.status_code &gt;= 500 | STATS error_rate=count(*) BY host.name"
        },
        "metrics": [
          {
            "type": "primary",
            "column": "count"
          }
        ]
      }
    }
  ]
}<h2>Roadmap de la API de paneles de Kibana: Maps, Vega y endpoints independientes</h2><p>Estamos ampliando activamente el alcance de la API. El siguiente paso es agregar compatibilidad con mapas y paneles Vega, incluyendo esquemas tipados para ellos. También estamos creando endpoints CRUD independientes para las sesiones de Discover (más allá de su compatibilidad actual como paneles del dashboard), Vega, Maps y Anotaciones, desacoplados del ciclo de vida del dashboard.</p><p>Para las definiciones completas de esquemas, visita la <a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">documentación de la API de Dashboards</a>. Para los usuarios de Terraform, el <a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">proveedor Terraform de Elastic Stack</a> es compatible con la API GA Dashboards.</p><h2>Nota</h2><ol><li><p>Los endpoints de núcleo no han cambiado desde la vista previa técnica. Si construiste integraciones contra 9.4, funcionan en 9.5. Los únicos cambios incompatibles son dos menores que afectan al listado del dashboard y a los formatos de unidades de duración, documentados <a href="https://www.elastic.co/docs/release-notes/kibana/breaking-changes">aquí</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[Experiencia del desarrollador]]></category>
    <category><![CDATA[Integraciones]]></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[Acceso instantáneo al dashboard en menos de un minuto, 5 veces más económico: dashboards con IA y gráficos personalizados de Vega-Lite en Kibana]]></title>
    <description><![CDATA[Describe tus métricas en lenguaje natural y el chat de IA de Kibana genera dashboards respaldados por ES|QL y gráficos Vega-Lite, desde gráficos de dispersión hasta formato condicional y consejos de herramientas personalizados.]]></description>
    <content:encoded><![CDATA[<p>El<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat"> chat de IA</a> de Kibana ahora construye dashboards completos<a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"> respaldados por el lenguaje de búsqueda de Elasticsearch (ES|QL)</a> desde una indicación en lenguaje natural en menos de un minuto. En Elastic 9.5, esto pasa a disponibilidad general (GA) (<a href="https://www.elastic.co/es/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana">vista previa técnica en 9.4</a>) con recuperación de errores que reintenta consultas fallidas, costos de generación de ES|QL 5 veces menores gracias al enrutamiento por niveles de modelo, y controles interactivos de filtros. Esta versión también agrega la creación de gráficos<a href="https://www.elastic.co/docs/explore-analyze/visualize/custom-visualizations-with-vega"> Vega-Lite</a> a través del lenguaje natural, incluidos gráficos de dispersión, gráficos de caja, formato condicional e información sobre herramientas personalizadas que normalmente tendrías que codificar a mano en JSON.</p><h2>Novedades en la creación del dashboard de IA de Kibana</h2><p><strong>Capacidad</strong></p><p><strong>Vista previa técnica (9.4)</strong></p><p><strong>GA (9.5)</strong></p><p>Manejo de errores</p><p>No se permiten reintentos en consultas ES|QL fallidas</p><p>Reintento automático hasta tres veces con inspección y ajuste de consultas</p><p>Costo de generación de ES|QL</p><p>Todas las consultas enrutadas a través del modelo principal</p><p>Enrutamiento por niveles, hasta 5 veces más económico</p><p>Intervalo de tiempo</p><p>Ventana predeterminada fija</p><p>Selección automática basada en la distribución temporal de los datos</p><p>Controles de filtro</p><p>Sin soporte</p><p>Se agrega automáticamente para los campos más relevantes</p><p>Gráficos de Vega-Lite</p><p>Sin soporte</p><p>Creación en lenguaje natural, incluyendo gráficos de dispersión, gráficos de caja, formato condicional, sugerencias de herramientas personalizadas</p><p>Edición de gráficos</p><p>Sin soporte</p><p>Edita paneles Vega-Lite existentes a través del lenguaje natural</p><h3>Recuperación automática de errores para la generación del dashboard de IA</h3><p>En la versión preliminar técnica, el agente no volvió a intentar las consultas ES|QL fallidas. En la versión 9.5, detecta errores de consulta y vuelve a intentarlo hasta tres veces, inspeccionando cada error y ajustando la consulta antes de darte por vencido. En la práctica, esto elimina la mayoría de los problemas de paneles vacíos y produce dashboards que se renderizan correctamente en el primer intento.</p><h3>¿Por qué es más barato crear dashboards con IA en Elastic 9.5?</h3><p>No todos los pasos en la generación del dashboard requieren el mismo nivel de razonamiento. En la versión 9.5, la generación de ES|QL emplea un modelo más ligero de manera predeterminada y solo recurre al modelo principal cuando es necesario. Si tu <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/connectors">conector</a> emplea Claude Opus 4.8 de Anthropic, eso significa que la generación de ES|QL será 5 veces más económica en todos los paneles.</p><h3>Selección automática de intervalos de tiempo basada en tus datos</h3><p>Los dashboards solo son útiles cuando muestran la ventana de datos correcta. El agente ahora aplica una lógica mejorada para elegir un intervalo de tiempo que tenga sentido para los datos que está consultando, a menos que el usuario solicite un intervalo de tiempo específico. Considera la distribución temporal de los datos y ajusta en consecuencia, ya sea la última hora para un incidente en tiempo real o los últimos 90 días para un análisis de tendencias, en lugar de recurrir de manera predeterminada a una ventana fija.</p><h3>Control automático de filtros en dashboards generados por IA</h3><p>La creación de dashboards ahora admite controles; es decir, filtros interactivos que permiten a los usuarios refinar un dashboard por valores de campo sin editar las consultas subyacentes. Al generar un dashboard, el agente agrega automáticamente controles en la parte superior para los campos más relevantes para filtrar.</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>Gráficos Vega-Lite de lenguaje natural: tipos de gráficos y formato más allá de los valores predeterminados</h2><p><a href="https://vega.github.io/vega/">Vega</a> y <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> admiten una amplia variedad de tipos de gráficos y personalizaciones en Kibana. Con 9.5, puedes construirlos a partir de un lenguaje sencillo en lugar de escribir el código tú mismo. </p><h3>Gráficos de dispersión, gráficos de caja y más tipos de gráficos Vega-Lite</h3><p>Los diagramas de dispersión, diagramas de caja, múltiplos pequeños facetados, gráficos de burbujas y diagramas de composición (como combinar histogramas con mapas de calor), entre muchos otros, se admiten en <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a>. Una indicación como <em>Muéstrame un gráfico de dispersión del tiempo de respuesta frente al tamaño de la solicitud, coloreado por nombre de servicio</em>, produce un panel Vega-Lite con los mapeos de datos correctos. Usan las paletas de colores predeterminadas de Kibana para combinarse con el resto del dashboard.</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>Formato condicional, información sobre herramientas personalizadas y etiquetas en gráficos estándar</h3><p>Incluso para tipos de gráficos que ya son nativos de los dashboards, como barra, línea o área, a veces necesitas más control del que ofrecen las capacidades predeterminadas. Vega-Lite, a través del chat, cubre esa necesidad. Algunos ejemplos incluyen:</p><ul><li><p><strong>Formato de color condicional:</strong> colorea los puntos de datos por encima de un umbral de manera diferente; por ejemplo, marca en rojo los puntos de datos en una línea o barras cuando alguna métrica supera tu objetivo de nivel de servicio (SLO). Pregúntale al agente algo como <em>Marca en rojo cualquier punto por encima de 500 ms para mi gráfico de líneas</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>Marcas y etiquetas personalizadas:</strong> agrega emojis, símbolos o etiquetas de texto en línea a los puntos de datos para obtener indicadores de estado de un vistazo.</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>Información sobre herramientas personalizada:</strong> enriquece los estados del cursor con métricas adicionales, contexto o valores calculados que no forman parte de los ejes del gráfico. Pregunta algo como <em>Agrega una descripción emergente que muestre el total de registros y el porcentaje por barra.</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>Esto también funciona para editar gráficos de Vega existentes. Si tienes un panel Vega-Lite que necesita un ajuste como cambiar una escala de color, ajustar un eje o cambiar el tipo de marca, describe el cambio en el chat en lugar de indagar en el código JSON.</p><h2>Cómo construimos la generación en lenguaje natural de Vega-Lite en Kibana</h2><p>Generar un gráfico Vega-Lite a partir de una oración no es una simple indicación de <em>solicitud JSON al modelo</em>. Construimos un pequeño pipeline agéntico que convierte la intención del lenguaje natural en un gráfico validado y respaldado por datos.</p><p>Cuando llega una solicitud, el agente primero determina si Vega-Lite es la opción adecuada. Para las solicitudes de Vega-Lite, establece la visualización en una consulta ES|QL real contra Elasticsearch y luego usa un modelo para generar el código Vega-Lite. Antes de renderizar, el resultado pasa por una capa de normalización que corrige el esquema y vincula la consulta canónica. También aplica transformaciones de seguridad de renderizado. </p><p>Algunas decisiones de diseño hacen que este flujo de trabajo sea confiable:</p><ul><li><p><strong>Llamadas a herramientas tipificadas</strong>: la creación de gráficos es una invocación de herramienta estructurada en lugar de Vega-Lite de forma libre pegada en la conversación.</p></li><li><p><strong>Generación con restricciones</strong>: el modelo genera código Vega-Lite dentro de un esquema definido, haciendo que la salida sea más previsible y fácil de validar.</p></li><li><p><strong>Ejemplos seleccionados:</strong> los patrones estructurales, como el facetado, las marcas superpuestas y los mapas de calor, proporcionan orientación sin copiar los datos subyacentes.</p></li><li><p><strong>Ejecutar y verificar bucles</strong>: las consultas se ejecutan antes de la creación de gráficos y los errores de validación desencadenan reintentos correctivos para la generación de ES|QL.</p></li></ul><h2>Prueba la creación de dashboard con IA y gráficos Vega-Lite en Kibana</h2><p>Para probar la creación de dashboards en lenguaje natural y gráficos Vega-Lite, actualiza a <strong>Elastic 9.5</strong> (o <a href="https://cloud.elastic.co/registration">inicia una prueba gratis</a>), y abre el <strong>chat</strong> en Kibana. Luego pídele que cree un dashboard a partir de tus datos. Para Vega-Lite, intenta pedir un tipo de gráfico que hayas querido pero que nunca hayas construido, como un diagrama de dispersión o un gráfico de burbujas. Si el resultado no es del todo correcto, dile al agente qué cambiar. El agente itera contigo.</p><p>Esto requiere una licencia Empresarial. <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Comencemos</a>.</p><p><em>El lanzamiento y el momento de cualquier característica o funcionalidad descrita en esta publicación quedan a exclusivo criterio de Elastic. Es posible que alguna característica o funcionalidad que no esté disponible en este momento no se lance a tiempo o no se lance en absoluto.</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 personas, cero decisiones humanas: respuesta agéntica ante desastres con Elasticsearch]]></title>
    <description><![CDATA[Descubre cómo una regla de detección de Kibana, un flujo de trabajo y un agente de AI reubicaron automáticamente a 137 000 miembros del personal militar en siete instalaciones cuando azotó un huracán, sin necesidad de despachadores.]]></description>
    <content:encoded><![CDATA[<p>Elastic acaba de coordinar la evacuación automatizada de 137 000 militares en siete instalaciones, sin intervención humana. Un huracán de categoría 4 azota la costa de Hampton Roads. El enriquecimiento geoespacial de Elasticsearch identifica cada instalación en la zona de impacto al momento de la indexación. Se activa una regla de detección de Kibana. Un flujo de trabajo inicia una conversación con un agente de AI. El agente analiza la capacidad, la distancia y la compatibilidad entre ramas de las fuerzas armadas, y luego envía 16 notificaciones de evacuación y recepción en una sola pasada. De un evento de GDACS sin procesar a una acción coordinada, automáticamente.</p><p>Cada año, los desastres naturales obligan a los gestores de emergencias, comandantes militares y oficiales de seguridad pública a tomar decisiones críticas en plazos ajustados. Estas decisiones suelen depender de cadenas de llamadas, hojas de cálculo y conocimiento institucional distribuido entre decenas de personas. La coordinación por sí sola consume un tiempo valioso.</p><p>Esta publicación demuestra cómo Elastic puede potenciar un sistema de coordinación agéntico con capacidad de respuesta ante desastres, que detecta amenazas, analiza la logística y actúa automáticamente. Para hacerlo concreto, creamos una simulación: un huracán ficticio de categoría 4 que amenaza la costa de Hampton Roads desencadena la reubicación automatizada de más de 137 000 personas en siete instalaciones militares.</p><p><strong>Descargo de responsabilidad:</strong> <strong>Este es un escenario totalmente ficticio creado con fines de demostración. </strong>El huracán ELARA-26 no existe. Las ubicaciones de las instalaciones se basan en datos geográficos reales y disponibles públicamente (el set de datos Military Installations, Ranges, and Training Areas [MIRTA] del Departamento de Defensa de los EE. UU. [DoD]), pero todos los datos operativos, como el recuento de personal, la capacidad de alojamiento, los activos, los correos electrónicos de contacto y los perfiles de misión, son completamente ficticios. Nada en esta demostración refleja la preparación, la capacidad o los procedimientos operativos militares reales.</p><h2>Por qué la respuesta automatizada ante desastres requiere coordinación geoespacial y agéntica</h2><p>Cuando un desastre natural amenaza la infraestructura crítica, el desafío de coordinación es inmediato:</p><ul><li><p>¿Qué instalaciones están en la zona de impacto?</p></li><li><p>¿Cuánto personal necesita trasladarse?</p></li><li><p>¿A dónde pueden ir? ¿Esas instalaciones tienen capacidad?</p></li><li><p>¿A quién se necesita notificar en este momento?</p></li></ul><p>Estas preguntas no esperan. Tampoco deberían hacerlo las respuestas.</p><h2>Despliega el pipeline: requisitos previos y configuración</h2><p>Sigue las instrucciones <a href="https://github.com/tehbooom/elastic_natural_disaster/blob/main/README.md">aquí en el repositorio de ejemplo</a> para desplegar un cluster local de Elastic con Elastic Inference Service (EIS) mediante <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/connect-self-managed-cluster-to-eis#set-up-eis-with-cloud-connect">Cloud Connect</a>.</p><h2>Cómo funciona el pipeline de respuesta ante desastres con agentes de Elasticsearch</h2><p>El pipeline tiene siete capas que trabajan juntas de extremo a extremo:</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>Ingesta de datos:</strong> eventos de desastres del Sistema Mundial de Alerta y Coordinación de Desastres (GDACS) enviados a Elasticsearch</p></li><li><p>P<strong>ipeline de ingesta</strong>: GeoJSON se ingesta y normaliza a Elastic Common Schema (ECS).</p></li><li><p><strong>Enriquecimiento geoespacial:</strong> el polígono del área afectada del evento se compara con los límites indexados de las instalaciones militares.</p></li><li><p><strong>Alerting:</strong> una regla de detección de Kibana se activa cuando un desastre interseca cualquier instalación.</p></li><li><p><strong>Automatización de flujos de trabajo:</strong> la alerta activa un flujo de trabajo de Kibana que inicia una conversación con un agente de AI.</p></li><li><p><strong>Razonamiento de AI:</strong> el agente analiza las instalaciones afectadas, sus activos y las instalaciones de apoyo más cercanas para determinar cómo reubicar todos los activos y al personal.</p></li><li><p><strong>Notificaciones por correo electrónico</strong>: el agente envía correos electrónicos a todos los destinatarios sobre la llegada y salida de personal o activos.</p></li></ol><p>Revisemos cada capa.</p><h2>Paso 1: indexar instalaciones militares con límites geográficos</h2><p>La base es el set de datos MIRTA del DoD de <a href="https://source.coop/seerai/hifld/military-installations-ranges-and-training-areas-mirta-dod-sites---boundaries">source.coop/seerai/hifld</a>. Este set de datos proporciona un geo_shape de tipo Point para cada instalación; coordenadas de centroide en lugar de polígonos de límites completos.</p><p>Cada documento de instalación en el índice mitra-facilities se enriquece con datos de perfil operativo (todos ficticios), más allá de lo que proporciona MIRTA:</p>{
  "entity_name": "Naval Station Norfolk",
  "branch_of_service": "Navy",
  "mission_function_type": "fleet_support",
  "personnel_count": 50000,
  "housing_capacity": 55000,
  "temporary_housing_capacity": 10000,
  "logistics_capabilities": ["fuel", "airlift", "sealift", "medical"],
  "available_assets": [
    { "type": "helicopters", "count": 24 },
    { "type": "transport_vehicles", "count": 150 }
  ],
  "contact_email": "norfolk.ops@navy.mil.gov.fake",
  "operational_status": "act",
  "is_joint_base": false,
  "entity_geo_location": { "type": "polygon", "coordinates": [...] }
}<p>Este índice enriquecido es lo que le permite al agente de AI tomar decisiones inteligentes de asignación; no solo “aquí hay bases cercanas”, sino “aquí hay bases con capacidad de alojamiento disponible, tipos de misión compatibles y la logística para recibir activos entrantes”.</p><h2>Paso 2: ingestar y normalizar eventos de GDACS</h2><p>GDACS publica GeoJSON en tiempo real para terremotos, ciclones tropicales, inundaciones, incendios forestales, volcanes y sequías. Ingestamos este feed en un flujo de datos (logs-gdacs.events-*) mediante un pipeline de ingesta personalizado que normaliza el GeoJSON sin procesar a campos de ECS.</p><p>El pipeline de ingesta de GDACS hace varias cosas que vale la pena destacar:</p><p><strong>Extracción de geometría:</strong> el centroide se almacena como geo_point para la visualización en mapas, y el polígono de impacto se almacena como geo_shape en gdacs.affected_area, que es el campo que se utiliza para búsquedas de intersección más adelante.</p><p><strong>Normalización de la gravedad:</strong> cada tipo de desastre tiene una escala de gravedad diferente. Un ciclón tropical se mide en velocidad del viento en km/h; un terremoto, en magnitud de Richter. El pipeline los mapea a todos a una puntuación normalizada de 0–100:</p>// Painless snippet from the ingest pipeline
if (type == 'TC') {
  norm = Math.min(100.0, Math.max(0.0, (val - 40.0) / 2.6));
} else if (type == 'EQ') {
  norm = Math.min(100.0, Math.max(0.0, (val - 4.0) * 20.0));
}<p>Luego, la puntuación de gravedad normalizada se mapea a una etiqueta severity_level (low, medium, high, critical) utilizada para el mapeo de gravedad de las alertas en la regla de detección.</p><p><strong>Alineación con ECS:</strong> event.kind: alert, event.category: threat, marcas de tiempo asignadas a event.start/event.end, y un _id estable basado en una huella digital para la deduplicación.</p><h2>Paso 3: enriquecimiento geoespacial: búsqueda de instalaciones afectadas al momento de la indexación</h2><p>La política de enriquecimiento geo_match de Elasticsearch compara el polígono del desastre con el límite de cada instalación al momento de la indexación, sin necesidad de una unión en tiempo de búsqueda. En lugar de consultar durante la búsqueda, usamos un <strong>procesador de enriquecimiento</strong> en el pipeline de ingesta para comparar el polígono de impacto del desastre con el límite de cada instalación <em>a medida que se indexa el documento</em>.</p><p>La política de enriquecimiento es una política geo_match:</p>{
  "geo_match": {
    "indices": "mitra-facilities",
    "match_field": "entity_geo_location",
    "enrich_fields": [
      "entity_name",
      "entity_type",
      "entity_station_number",
      "entity_geo_city_name",
      "entity_geo_region_name"
    ]
  }
}<p>El procesador se ejecuta al final del pipeline de ingesta:</p>{
  "enrich": {
    "policy_name": "facilities-geo",
    "field": "gdacs.affected_area",
    "target_field": "affected_facilities",
    "shape_relation": "INTERSECTS",
    "max_matches": 128
  }
}<p>INTERSECTS detecta cualquier instalación cuyo límite toque o se superponga con el polígono de desastre, incluidas las intersecciones parciales. El resultado es que cada documento de evento de GDACS se almacena con un arreglo anidado affected_facilities que nos indica exactamente qué instalaciones se encuentran en la zona de impacto. No se necesita una búsqueda de unión.</p><h2>Paso 4: regla de detección: alertas sobre el impacto en las instalaciones</h2><p>Una regla de detección de Kibana monitorea el flujo de datos logs-gdacs.events-* y se activa cuando un evento de GDACS se ha enriquecido con información sobre al menos una instalación afectada:</p>Búsqueda: affected_facilities: { entity_name: * }<p>La regla se ejecuta cada hora (cubre un intervalo de now-1h a now) y usa un mapeo dinámico de gravedad; el campo gdacs.severity_level calculado por el pipeline de ingesta determina automáticamente la gravedad de la alerta.</p><p>La gravedad de la alerta también determina la puntuación de riesgo mediante el mapeo de campos:</p>"risk_score_mapping": [
  {
    "field": "gdacs.normalized_severity",
    "operator": "equals",
    "value": ""
  }
]<p>Cuando la regla se activa, envía todo el contexto de la alerta, incluido el arreglo enriquecido affected_facilities con los nombres, tipos y ubicaciones de las instalaciones, a un flujo de trabajo de Kibana para su procesamiento posterior.</p><h2>Paso 5: automatización del flujo de trabajo: conectar la alerta con el agente</h2><p>Los flujos de trabajo de Kibana gestionan la transferencia de la detección a la respuesta. El flujo de trabajo de respuesta ante desastres naturales se activa mediante la alerta:</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: "Nueva alerta de desastre natural: {{ event.alerts | json }}"<p>Toda la carga útil de la alerta (tipo de desastre, gravedad, área afectada y la lista de instalaciones afectadas) se reenvía al agente de AI como contexto inicial. El agente se encarga del resto.</p><h2>Paso 6: el agente de AI: de los datos a la acción coordinada</h2><p>El agente mitra.response toma la carga útil completa de la alerta y, en un único ciclo agéntico, evalúa el alcance, encuentra instalaciones receptoras, asigna personal y envía notificaciones de evacuación y recepción, todo sin intervención humana.</p><p>El agente tiene dos herramientas disponibles:</p><ul><li><p><strong>mitra.nearest_facility</strong>realiza una búsqueda en el índice mitra-facilities mediante una búsqueda geo_shape, ordenada por distancia desde una coordenada dada, y devuelve hasta 50 instalaciones activas cercanas con capacidad disponible.</p></li><li><p><strong>mitra.send_email</strong> itera sobre una arreglo JSON de objetos de instalaciones y envía notificaciones de evacuación o recepción con formato.</p></li></ul><p>El conjunto de instrucciones del agente define un flujo de trabajo claro:</p><ol><li><p><strong>Evalúa la situación.</strong> Parsea la alerta, identifica las instalaciones afectadas y determina el alcance del desastre.</p></li><li><p><strong>Haz un inventario de lo que se debe mover.</strong> Recuentos de personal, activos críticos, requisitos de alojamiento por instalación.</p></li><li><p><strong>Encuentra instalaciones de destino.</strong> Invoca a mitra.nearest_facility para cada instalación afectada, sin incluir las que aún están en la zona de peligro.</p></li><li><p><strong>Toma decisiones de asignación.</strong> Analiza soluciones que involucren una o varias instalaciones, la compatibilidad entre ramas de las fuerzas armadas, la capacidad de alojamiento y el apoyo para los activos.</p></li><li><p><strong>Envía correos electrónicos de coordinación.</strong> Envía órdenes de evacuación a las instalaciones de origen y notificaciones de recepción a las instalaciones receptoras.</p></li><li><p><strong>Genera un reporte resumido. </strong>Genera un breve resumen de todas las instalaciones afectadas, el total de personal, los activos trasladados, las instalaciones de destino y cualquier inquietud en el chat para su revisión.</p></li></ol><p>La lógica de asignación del agente sigue restricciones del mundo real: no exceder la capacidad de alojamiento, dar preferencia a las reubicaciones dentro de la misma rama de las fuerzas armadas cuando sea posible, usar bases conjuntas para alojar al personal de distintas ramas que exceda la capacidad de otras instalaciones y priorizar la distancia para minimizar el tiempo de traslado.</p><h3>La herramienta de instalación más cercana</h3><p>La búsqueda subyacente del flujo de trabajo usa geo_shape con un filtro de círculo y ordenamiento por _geo_distance:</p>"query": {
  "bool": {
    "filter": [
      {
        "geo_shape": {
          "entity_geo_location": {
            "shape": {
              "type": "circle",
              "coordinates": [{{ inputs.lon }}, {{ inputs.lat }}],
              "radius": "5000km"
            },
            "relation": "intersects"
          }
        }
      },
      { "term": { "operational_status.keyword": "act" } }
    ]
  }
},
"sort": [
  {
    "_geo_distance": {
      "entity_geo_point": { "lat": {{ inputs.lat }}, "lon": {{ inputs.lon }} },
      "order": "asc",
      "unit": "km"
    }
  }
],
"script_fields": {
  "available_capacity": {
    "script": {
      "source": "Math.max(0, doc['housing_capacity'].value - doc['personnel_count'].value)"
    }
  }
}<p>La capacidad disponible se calcula en el momento de la búsqueda mediante un campo de script que calcula la capacidad de alojamiento menos el recuento de personal actual. El agente usa esto para asignar personal entre destinos sin exceder los límites.</p><h2>Huracán ELARA-26: coordinación agéntica de 137 000 efectivos, de extremo a extremo</h2><p>El huracán ELARA-26 es una tormenta de categoría 4 (vientos máximos de 213 km/h) que se prevé que toque tierra en el área de Hampton Roads de Virginia. Cuando se ingiere el evento de GDACS, el polígono del área afectada interseca siete instalaciones militares principales de la región. La regla de detección se activa. El flujo de trabajo inicia una conversación del agente.</p><p>Dentro de un solo ciclo agéntico, el agente:</p><ul><li><p>Identificó siete instalaciones en la zona de impacto, con un total combinado de 137 372 miembros del personal.</p></li><li><p>Llamó a mitra.nearest_facility para encontrar instalaciones receptoras fuera de la trayectoria de la tormenta.</p></li><li><p>Distribuyó al personal entre nueve instalaciones receptoras en función de la capacidad de alojamiento disponible y la distancia.</p></li><li><p>Generó y despachó órdenes de evacuación a las siete instalaciones afectadas.</p></li><li><p>Generó y despachó notificaciones de recepción a las nueve instalaciones receptoras.</p></li><li><p>Generó un resumen completo de coordinación, similar al siguiente:</p></li></ul><p><strong>Instalaciones evacuadas:</strong></p><p>Instalación</p><p>Personal</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>9707</p><p>Joint Base Langley-Eustis</p><p>15 000</p><p>Naval Weapons Station Yorktown</p><p>11 801</p><p><strong>Instalaciones receptoras:</strong></p><p>Instalación</p><p>Distancia</p><p>Personal entrante</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>~5000</p><p>NG Bethany Beach Training Site</p><p>209 km</p><p>~4707</p><p>Rivanna Station</p><p>140 km</p><p>~7500</p><p>Def Gen Supply Center</p><p>22 km</p><p>~6000</p><p>Los activos reubicados incluyen vehículos de transporte, helicópteros, lanchas patrulleras, unidades médicas, vehículos de ingeniería, generadores, remolques de agua, kits de refugio y sistemas de comunicación.</p><h3>Notificaciones por correo electrónico automatizadas</h3><p>Una vez que el agente finalizó su plan de asignación, invocó a mitra.send_email y envió 16 correos electrónicos en una sola pasada; es decir, órdenes de evacuación a las siete instalaciones afectadas y notificaciones de recepción a las nueve instalaciones receptoras. Cada mensaje incluía la instalación de destino, el recuento de personal entrante, los activos por trasladar y un contacto de coordinación. Lo que habría requerido horas de cadenas de llamadas se completó automáticamente en cuanto el agente terminó de razonar.</p><h3>Ampliación de la respuesta agéntica ante desastres con RAG y fundamentación en políticas</h3><p>Esta demostración se basa exclusivamente en datos estructurados, como cifras de capacidad, distancias y estado operativo. Las funcionalidades de búsqueda semántica y Retrieval Augmented Generation (RAG) de Elastic pueden hacer que el agente sea significativamente más inteligente, con dos adiciones:</p><p><strong>Recuperación de respuestas históricas:</strong> indexa reportes posteriores a la acción, resúmenes de incidentes de la Agencia Federal para el Manejo de Emergencias (FEMA) y registros de respuesta ante desastres anteriores como incrustaciones vectoriales. Cuando se activa un evento nuevo, el agente puede recuperar semánticamente cómo se gestionaron eventos similares, lo que fundamenta las decisiones de asignación con conocimiento institucional en lugar de basarse únicamente en cálculos de capacidad.</p><p><strong>Fundamentación en políticas y doctrina:</strong> indexa las directivas de gestión de emergencias del DoD, los planes de continuidad de las operaciones de la instalación y las directrices del comandante. El agente puede recuperar y citar las políticas reales que rigen una respuesta, lo que garantiza que cada decisión esté fundamentada en la doctrina en lugar de en inferencias.</p><p>Ambos siguen el mismo enfoque nativo de Elastic: un pipeline de inferencia genera incrustaciones al momento de la indexación, y se expone una herramienta de búsqueda semántica al agente. El pipeline de coordinación permanece igual. El agente simplemente se vuelve más inteligente.</p><h2>Por qué Elasticsearch es la plataforma adecuada para la respuesta agéntica del sector público</h2><p>Esto no es un chatbot. No es un dashboard. Es un sistema de flujo de trabajo agéntico con capacidad de respuesta, uno que detectó una amenaza, razonó sobre un problema logístico complejo y coordinó la reubicación de 137 000 personas sin intervención humana. Ese tipo de resultado solo es posible porque cada funcionalidad de la que depende reside en una sola plataforma unificada.</p><p>El soporte geoespacial de Elasticsearch (geo_point, geo_shape, políticas de enriquecimiento y ordenación basada en la distancia) gestiona el razonamiento espacial que hace posible la detección de intersecciones y la búsqueda de instalaciones a escala. La búsqueda semántica y las incrustaciones vectoriales proporcionan a los agentes una base factual, lo que garantiza que el razonamiento de la AI se apoye en el contenido real de tus datos y no en suposiciones producto de alucinaciones. El motor de detección de Kibana, Workflows, Agent Builder y las herramientas de Agent Builder lo integran todo en un pipeline que va desde el evento sin procesar hasta la acción coordinada, sin necesidad de código de integración externo.</p><p>Ninguna otra plataforma reúne esto como lo hace Elastic. La combinación de indexación en tiempo real, precisión geoespacial, recuperación semántica y orquestación agéntica, todo en un solo stack, con seguridad y observabilidad de nivel empresarial integradas, es lo que diferencia a Elastic de las herramientas que hacen bien una de estas cosas pero requieren que unas el resto por tu cuenta.</p><h2>Respuesta geoespacial agéntica para la gestión de emergencias, bomberos, fuerzas del orden y salud pública</h2><p>La misma arquitectura se aplica dondequiera que se crucen personas, instalaciones y eventos en tiempo real. Los datos específicos cambian. El pipeline no.</p><p><strong>Gestión de emergencias:</strong> FEMA y las oficinas estatales de gestión de emergencias pueden mapear las ubicaciones de los refugios, las áreas de preparación y las poblaciones vulnerables con respecto a los polígonos de fenómenos meteorológicos adversos entrantes del Servicio Meteorológico Nacional (NWS), lo que activa el posicionamiento previo automatizado de recursos antes de que una tormenta toque tierra.</p><p><strong>Servicios de bomberos y emergencias médicas:</strong> los departamentos de bomberos pueden superponer las ubicaciones de las unidades y las zonas de respuesta sobre los perímetros de incendios forestales o las agrupaciones de incendios estructurales, y dirigir automáticamente las solicitudes de ayuda mutua a las unidades disponibles más cercanas que cuenten con el equipo adecuado.</p><p><strong>Fuerzas del orden:</strong> las agencias pueden correlacionar las ubicaciones de incidentes activos con zonas escolares, infraestructura crítica y posiciones de los oficiales, lo cual activa notificaciones de confinamiento con reconocimiento geográfico o el despacho de recursos sin esperar la clasificación manual.</p><p><strong>Seguridad en las escuelas públicas:</strong> los distritos escolares pueden monitorear datos de amenazas en tiempo real y compararlos con los límites de los recintos escolares. Cuando una amenaza cruza el perímetro de una escuela, un agente puede notificar de inmediato a la administración, iniciar las comunicaciones de cierre de emergencia y coordinar la respuesta de las fuerzas del orden, todo antes de que un despachador atienda el teléfono.</p><p><strong>Salud pública:</strong> los departamentos de salud pueden cotejar datos de vigilancia de enfermedades o zonas de riesgo ambiental con ubicaciones de clínicas, capas de densidad poblacional e inventarios de depósitos de suministros para dirigir los recursos donde más se necesitan.</p><p>Sector</p><p>Caso de uso</p><p>Capacidad de Elastic</p><p>Gestión de emergencias</p><p>Hacer coincidir las ubicaciones de los refugios con los polígonos de fenómenos meteorológicos adversos del NWS</p><p>Enriquecimiento de geo_shape + flujos de trabajo de Kibana</p><p>Bomberos y EMS</p><p>Superponer las ubicaciones de las unidades sobre los perímetros de incendios forestales</p><p>enrutamiento geoespacial + búsqueda de la instalación más cercana</p><p>Fuerzas del orden</p><p>Correlacionar incidentes con zonas escolares y posiciones de oficiales</p><p>reglas de alerta con reconocimiento geográfico + envío de recursos mediante el agente</p><p>Seguridad en las escuelas públicas</p><p>Monitorear las fuentes de amenazas contra los perímetros del campus</p><p>reglas de detección + notificación automatizada</p><p>Salud pública</p><p>Comparar las zonas de peligro con las ubicaciones de las clínicas y los depósitos de suministros</p><p>búsqueda semántica + enriquecimiento geoespacial</p><p>Los datos son diferentes en cada escenario. El patrón subyacente de ingestar, enriquecer en tiempo de indexación, detectar intersecciones, activar una respuesta agéntica y actuar es exactamente el mismo. Elastic brinda a las organizaciones del sector público la plataforma para crearlo una vez y adaptarlo en todas partes.</p><p><em>El lanzamiento de cualquiera de las características o funcionalidades descritas en esta publicación, así como su fecha, quedan a exclusivo criterio de Elastic. Es posible que algunas características o funcionalidades que no estén disponibles en este momento no se lancen a tiempo o no se lancen en absoluto.</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[AI agéntica]]></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 en Kibana ahora renderiza los dashboards de forma nativa]]></title>
    <description><![CDATA[Elastic AI Chat en Kibana ahora crea dashboards a partir de lenguaje natural, lo que te permite mantener tus gráficos y análisis en un solo hilo y guardarlos como objetos reutilizables de Kibana.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Elastic AI Chat</a> en Kibana ahora convierte una pregunta en lenguaje simple en <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">visualizaciones</a> respaldadas por <strong>ES|QL</strong> o un <strong>dashboard</strong> completo, justo dentro de tu <strong>conversación</strong>. Describe las métricas que necesitas, refina mientras avanzas y guarda cuando el resultado sea satisfactorio. Todo <strong>permanece en la conversación</strong> hasta que estás listo para <strong>guardar</strong>, y entonces se convierte en un objeto Kibana de primera clase que tu equipo puede abrir, editar y reutilizar. Disponible como una vista previa técnica en Elastic 9.4</p><p>El agente crea dashboards desde cero, pero también funciona con lo que ya tienes. Abre la barra lateral de AI Chat mientras se ve un dashboard y se <strong>conecta</strong> <strong>automáticamente</strong>. Pregunta por qué una métrica se disparó, desglosa por región o agrega un panel de comparación. Tu dashboard existente se convierte en el <strong>punto de partida</strong>, no solo en el producto final.</p><h2>Detrás de escena: cómo creamos dashboards en AI Chat</h2><p>Enseñamos al agente tareas específicas a través de <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-skills">habilidades</a>, descripciones estructuradas de cómo operar en un problema dado. Sin embargo, crear una habilidad de dashboard significaba enseñar a un LLM a generar dashboards de Kibana válidos, y la API heredada de objetos guardados lo hacía muy difícil: JSON profundamente anidado, cambios sutiles de versión a versión, referencias frágiles. Necesitábamos un enfoque diferente.</p><h3>Una API especialmente diseñada para dashboards programáticos</h3><p>La nueva <a href="https://dashboardsapispec.kibana.dev/dashboards.html">API de dashboards</a> se diseñó precisamente para este escenario. En lugar de exponer el estado interno sin procesar, ofrece esquemas tipados y validados para cada tipo de panel. La API se encarga de la conversión entre estructuras externas limpias y las representaciones internas de Kibana, así que el agente puede centrarse en lo que debe incluir el dashboard en lugar de en cómo darle formato.</p><h3>Una habilidad, una herramienta, muchas operaciones</h3><p>La <code>dashboard-management</code> habilidad expone una sola <code>manage_dashboard</code> herramienta que acepta una matriz ordenada de <strong>operaciones</strong>. Cada operación es una acción discreta: establecer metadatos, agregar un panel de Markdown, crear visualizaciones respaldadas por ES|QL a partir del lenguaje natural, editar paneles existentes, agrupar paneles en secciones plegables o reposicionar elementos en la cuadrícula.</p><p>Puedes describir un dashboard completo: título, descripción, secciones y cada panel interior en una sola llamada:</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>Las operaciones se ejecutan en orden, por lo que los pasos posteriores pueden hacer referencia a los anteriores y basarse en ellos. Este diseño mantiene la conversación centrada en la intención en lugar de en los detalles de implementación.</p><h3>El pipeline de visualización: del lenguaje natural a ES|QL y, finalmente, a las visualizaciones</h3><p></p><p>Cuando solicitas un dashboard, el agente explora tus datos (índices, mapping de campos, tipos), luego planifica las visualizaciones y llama a manage_dashboard.</p><p>Cada panel pasa por su propia pipeline: selección de tipo de gráfico, generación de ES|QL, configuración de visualización y validación. Separamos esto del hilo principal del agente: la construcción de la visualización requiere varias llamadas al modelo por cada panel, y mezclarlo con el contexto principal sobrecargaría la ventana y entorpecería el razonamiento.</p><p>Dentro de manage_dashboard, todos los paneles se construyen de manera concurrente y luego se reensamblan en orden. El resultado es un dashboard completo con paneles insertados: sin visualizaciones huérfanas, sin problemas de sincronización.</p><h3>Por qué movimos la creación de visualizaciones dentro de la herramienta del dashboard</h3><p>Nuestro primer enfoque usó una herramienta separada para crear visualizaciones: una llamada por panel, y luego pasábamos cada archivo adjunto a la herramienta del dashboard. Funcionó, pero cada visualización necesitaba su propia llamada a la herramienta, su propio ciclo de vida y una entrega explícita. Lo peor es que, al editar una visualización en la conversación, el panel del dashboard no se actualizaba, lo que confundía a los usuarios.</p><p>Integramos la creación de visualizaciones directamente en manage_dashboard. Los mismos flujos de trabajo paralelos se ejecutan, pero los paneles se ensamblan en la estructura del dashboard sin archivos adjuntos intermedios. Menos llamadas, sin problemas de sincronización, un ciclo de vida único.</p><p>Las visualizaciones independientes siguen funcionando: puedes colocar gráficos existentes en un dashboard a través de referencias de archivos adjuntos, pero para construir desde cero, la creación en línea es la ruta más limpia</p><h2>Para equipos de seguridad</h2><p>Los analistas de SOC y los ingenieros de detección no pueden permitirse el lujo de tener que ir y volver al editor del dashboard en medio de una investigación. Con AI Chat, pide volumen de alertas por tipo de regla, host o táctica MITRE y velo en tu hilo en aproximadamente un minuto. A medida que la búsqueda se desarrolla, incorpora paneles, anomalías en la ejecución de procesos, conexiones de red, comparaciones de línea de tiempo, sin perder el contexto.</p><p>Guarda cuando hayas terminado. El dashboard se convierte en una referencia para la revisión posterior al incidente, un punto de partida para el próximo analista, o una sesión informativa semanal sobre amenazas (sin necesidad de una nueva explicación).</p><p>Lee más sobre cómo los equipos de seguridad pueden usar la creación de dashboards y otras capacidades de AI Chat recientemente lanzadas en esta <a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">publicación de blog</a>.</p><h2>Para ingenieros de observabilidad y confiabilidad del sitio (SRE)</h2><p>Cuando un servicio se deteriora a las 2 a. m., no hay tiempo para crear dashboards desde cero. Con AI Chat, un SRE puede describir las métricas que necesita (latencia p99 por servicio, tasa de error frente a eventos de despliegue, reinicios del pod en la última hora) y obtener un dashboard completo en el hilo de investigación en aproximadamente un minuto. El agente puede refinarlo paso a paso a medida que el panorama se aclara: agregar un panel, cambiar la ventana de tiempo, desglosar por región.</p><p>Guarda el dashboard y estará inmediatamente disponible en la sala de crisis (los mismos paneles, el mismo encuadre) para todos los que se unan a la reunión sobre el incidente. Después del incidente, se convierte en la base para el análisis de lo ocurrido.</p><h2>Lo que se viene</h2><p>Estamos trabajando en la optimización de tokens, interacciones de pantalla completa más ricas, soporte de panel más amplio y mejoras continuas de calidad. La vista previa técnica es el momento adecuado para definir prioridades: si falta algo, avísanos a través del ícono “<strong>Enviar comentarios</strong>” en el menú superior.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6783ac3a6540ba5b/6a17dd804b055d813e4320e0/1bb71a01a12641961134f2231778344a6249e8f4-1490x634.png" alt="Página de gestión del dashboard que muestra una lista con una entrada titulada “[OTel] Detalles del host: visión general”, junto a filtros, una barra de búsqueda, un botón “Crear dashboard” y una opción para enviar comentarios." /><h2>Pruébalo</h2><p>Actualiza a <strong>Elastic 9.4</strong> (o inicia una prueba), abre <strong>AI Chat </strong>en modo de pantalla completa y pruébalo en una investigación real. Pídele al agente que te muestre un gráfico con las métricas que te interesan y, después, pídele el siguiente desglose. Si la historia se mantiene, guárdala y compártela: mismos paneles, mismo encuadre, sin necesidad de volver a explicarla. Requiere una licencia empresarial (<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">comenzar</a>).
<em>El lanzamiento y la disponibilidad de cualquier característica o funcionalidad descrita en esta publicación quedan a exclusivo criterio de Elastic. Es posible que cualquier característica o funcionalidad que no esté disponible actualmente no se entregue a tiempo o no se entregue en absoluto.</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler,Robert Jaszczurek]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc2ccc8f75d7cc972/6a17dd82577262f0831bcb21/f3c7ce5e05cabea693363616e62f5e30e0be2cd5-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Kibana reduce el tiempo de carga del dashboard hasta en un 25 %: esta es la estrategia de sondeo que hay detrás]]></title>
    <description><![CDATA[Descubre cómo Kibana usa el sondeo continuo y la detección de HTTP/2 en el navegador para reducir los tiempos de carga del dashboard hasta en un 25 %, con una transición automática a HTTP/1 en caso de que no sea posible.]]></description>
    <content:encoded><![CDATA[<p>Los dashboards de Kibana y Discover ahora se cargan hasta un 25 % más rápido gracias al sondeo continuo. En lugar de esperar entre comprobaciones periódicas, Kibana ahora mantiene abiertas las conexiones HTTP y entrega los resultados de las búsquedas de Elasticsearch en el momento en que están listos. En HTTP/2+ (el valor predeterminado de Kibana desde la versión 9.0), esto se activa automáticamente sin necesidad de configuración. En HTTP/1, Kibana recurre al sondeo tradicional para evitar el agotamiento del grupo de conexiones.</p><h2>Cómo Kibana obtiene datos al cargar un dashboard</h2><p>Cuando se abre un dashboard, la mayoría de los paneles (internamente, los llamamos <em>insertables</em>) inician una o más búsquedas de Elasticsearch. Sin embargo, en lugar de la simple llamada y respuesta de una búsqueda síncrona (sinc), usamos el poder de la búsqueda asíncrona (asinc) (<a href="https://www.elastic.co/docs/solutions/search/async-search-api">docs</a>).</p><p>Con la búsqueda asincrónica, los resultados de las consultas se mantienen disponibles en Elasticsearch fuera de cualquier solicitud HTTP en particular. Esto es importante porque</p><ul><li><p>hace que la carga de datos sea resistente a la turbulencia de la red</p></li><li><p>impulsa nuestra <a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">función de búsqueda en segundo plano</a>, que permite a los usuarios seguir trabajando en otras cosas en Kibana mientras esperan a que se cargue un dashboard o una sesión de Discover que tarda mucho en cargarse</p></li></ul><p>Tras enviar la búsqueda inicial, Kibana monitorea la búsqueda para detectar cuándo está completa y recuperar el conjunto de resultados.</p><h3>Cómo el sondeo tradicional afecta los tiempos de carga del dashboard de Kibana</h3><p>En el sondeo tradicional, Kibana envía una búsqueda, cierra la conexión inicial y luego verifica periódicamente en Elasticsearch si la búsqueda ha finalizado.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Diagrama que muestra el sondeo tradicional en Kibana. La línea de tiempo de Kibana muestra un breve período de conexión abierta después del envío de la búsqueda, seguido de un largo período de reposo, luego un breve sondeo para el estado y finalmente los resultados entregados. La línea de tiempo de Elasticsearch ejecuta una búsqueda que se completa a mitad del período de sueño de Kibana, lo que ilustra la brecha de coordinación que causa la pérdida de tiempo." /><p>Le damos a Elasticsearch un corto período de tiempo después del envío de la búsqueda para que simplemente complete la búsqueda y devuelva los resultados. Si la búsqueda se completa tan rápidamente, equivale a una simple llamada y respuesta. Pero para búsquedas más largas, la conexión inicial se cierra y Kibana comienza a verificar periódicamente la búsqueda para completarla. Esto se llama <em>sondeo</em>.</p><h4>Desventajas en el rendimiento del sondeo tradicional</h4><p>Si observamos la figura anterior, tal vez ya puedas ver el inconveniente de rendimiento de este enfoque: lo más probable es que la búsqueda termine durante uno de los intervalos de suspensión de Kibana, lo que lleva a perder tiempo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="Diagrama de la línea de tiempo que muestra el costo de rendimiento del sondeo tradicional. La línea de tiempo de Kibana muestra un período de conexión abierta, un largo período de inactividad, un sondeo de estado y, a continuación, la entrega de los resultados. La línea de tiempo de Elasticsearch muestra que la búsqueda se completa a mitad del período de inactividad de Kibana, seguida de un segmento rojo de tiempo perdido, la duración desperdiciada antes de que Kibana se despierte y recupere los resultados." /><p>En el peor de los casos (cuando una búsqueda se completa al comienzo de un período de inactividad) se desperdiciará toda la duración del intervalo de sondeo.</p><h4>El impacto de una estrategia de retroceso</h4><p>Aplicar una estrategia de retroceso, es una práctica estándar al realizar sondeos. Esto significa que cuanto más larga sea la duración de la búsqueda, con menos frecuencia realizamos el sondeo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="Gráfico de barras horizontales que muestra el cronograma de retroceso del intervalo de sondeo de Kibana según la duración de la búsqueda. Las búsquedas de menos de 1.5 segundos utilizan un intervalo de aproximadamente 0.5 segundos; las búsquedas de 1.5 a 5 segundos utilizan 1 segundo; las búsquedas de 5 a 20 segundos utilizan aproximadamente 2.5 segundos; las búsquedas de más de 20 segundos utilizan un intervalo de sondeo de 5 segundos." /><p>Sin embargo, esto también significa que el tiempo potencial perdido escala con la duración de la búsqueda.</p><h4>Cómo los intervalos de sondeo generan patrones de latencia en forma de diente de sierra</h4><p>Al unir estos factores, nuestro tiempo perdido se convierte en una función escalonada en diente de sierra.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="Gráfico de líneas que muestra el tiempo perdido en segundos frente al tiempo de finalización de la búsquedas en segundos, lo que forma un patrón de diente de sierra donde el tiempo perdido aumenta y luego cae a cero repetidamente, con picos que crecen desde menos de 1 segundo hasta 5 segundos a medida que la duración de la búsqueda aumenta de 0 a 30 segundos." /><p>Aquí, los picos representan los peores escenarios posibles y los valles, los mejores. Esto muestra que el sondeo tradicional nos puede costar desde nada hasta el tiempo completo del intervalo de sondeo, dependiendo de cuánto dure la búsqueda (y las condiciones de la red).</p><h2>Sondeos continuos: cómo Kibana elimina el tiempo de espera</h2><p>El problema con los sondeos tradicionales es la falta fundamental de coordinación entre Kibana y Elasticsearch. Idealmente, Kibana sabe inmediatamente cuándo hay resultados disponibles. Entonces, ¿qué pasaría si invirtiéramos el patrón de sondeo para que casi todo el tiempo se dedique a revisar Elasticsearch y no se pierda nada?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="Diagrama de la línea de tiempo que muestra el sondeo continuo en Kibana. La línea de tiempo de Kibana es completamente azul: la conexión permanece abierta desde el envío de la búsqueda a través de dos actualizaciones de conexión hasta que se entregan los resultados, sin períodos de espera. La línea de tiempo de Elasticsearch muestra la búsqueda completada y los resultados entregados de inmediato. La leyenda muestra el tiempo perdido tachado, lo que indica que se ha eliminado." /><p>Con esta combinación de sondeos largos y sin más períodos de inactividad, los resultados se entregan no bien están listos.</p><h3>Degradación de HTTP/1</h3><p>La teoría es sólida. Entonces, ¿por qué este despliegue de Kibana parece tan degradado cuando activamos el sondeo continuo?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="Grabación de pantalla animada de un dashboard de Kibana que carga el set de datos de logs de muestra, que muestra varios paneles que se completan secuencialmente, lo que incluye una serie temporal de códigos de respuesta, un mapa de EE. UU. del total de solicitudes, el recuento de visitantes únicos, las métricas de la tasa de errores HTTP y un diagrama de Sankey de los datos del sistema operativo de la máquina y del destino." /><p>La clave es que este despliegue se está ejecutando sobre HTTP/1. En HTTP/1, las solicitudes HTTP se mapean 1:1 a conexiones TCP. Así que varias solicitudes de sondeo de larga duración están acaparando el límite de conexiones del navegador, lo que provoca que otras peticiones se pongan en cola.</p><p>En cambio, en HTTP/2+, las solicitudes de red pueden compartir conexiones TCP mediante multiplexación, así que no nos encontramos con este problema.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Diagrama que compara HTTP/1 y HTTP/2 para el sondeo continuo de Kibana. HTTP/1 requiere una conexión TCP por cada solicitud, lo que agota el grupo de conexiones del navegador con seis conexiones. HTTP/2 multiplexa múltiples solicitudes de sondeo a través de una única conexión TCP, evitando el agotamiento del grupo y manteniendo el rendimiento." /><p>Entonces, en HTTP/2+ el sondeo continuo es una virtud, pero en HTTP/1 se convierte en un vicio.</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>Conexiones TCP</p><p>Uno por solicitud HTTP</p><p>Multiplexado (muchas solicitudes comparten conexiones)</p><p>Comportamiento del sondeo continuo</p><p>Degradación del rendimiento (agotamiento del grupo de conexiones)</p><p>Beneficio completo (resultados entregados inmediatamente)</p><h4>Cómo Kibana detecta el protocolo HTTP para un sondeo óptimo</h4><p>HTTP/2 es el protocolo recomendado y es el predeterminado de Kibana desde la versión 9.0, así que sería una pena no enviar esta mejora de rendimiento. Por otro lado, la experiencia de HTTP/1 está tan degradada que no es aceptable arriesgarse a usarla en ningún despliegue local que aún no haya actualizado su protocolo. La respuesta es clara: necesitamos detectar qué protocolo está en uso y aplicar la estrategia de sondeo óptima.</p><p>Ciertamente es posible que el servidor de Kibana sepa de qué protocolo está hablando. Pero hay un problema: el factor limitante es el grupo de conexiones del navegador. Eso significa que lo que realmente importa es lo que el <em>navegador</em> está diciendo.</p><p>Debido a los proxies, no siempre son los mismos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="Diagrama de arquitectura que muestra tres componentes en una cadena horizontal: el servidor Kibana a la izquierda, un proxy opcional en el centro y el cliente Kibana a la derecha. El salto del servidor al proxy está etiquetado con kibana.yml server.protocol, lo que indica el protocolo conocido. El salto del proxy al cliente está etiquetado con tres signos de interrogación, lo que indica que el protocolo en ese salto final es desconocido y puede ser diferente." /><p>Si basáramos nuestra optimización en el protocolo del servidor, podríamos equivocarnos de dos maneras diferentes.</p><ol><li><p>Aplica sondeos continuos cuando no deberíamos y degrada la experiencia.</p></li><li><p>Si no aplicamos el sondeo continuo cuando deberíamos, nos perdemos la optimización.</p></li></ol><p>Afortunadamente, los navegadores modernos proporcionan una manera de detectar el protocolo del último salto de red de cualquier solicitud completada mediante el uso de un <code>PerformanceObserver</code>. Así que nos fijamos en el protocolo de la primera búsqueda enviada y optimizamos en función de eso.</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>Resultados de laboratorio: sondeo continuo frente a sondeo tradicional en Kibana</h2><p>Para validar el sondeo continuo, creamos dashboards con retardos de búsqueda que iban de 1 a 23 segundos y medimos los tiempos de carga con y sin la optimización activada. Luego cargamos los dashboards con y sin sondeo continuo para medir las ganancias (nos divertimos mucho con <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="Gráfico de barras que muestra los resultados de las pruebas de laboratorio para el sondeo continuo de Kibana: tiempo ahorrado frente al sondeo tradicional en duraciones de búsqueda de 1 a 23 segundos. Los ahorros varían entre casi cero y 4.9 segundos dependiendo de dónde se completen las búsquedas en relación con los límites del intervalo de sondeo, lo que confirma el patrón de latencia en forma de sierra predicho por el cronograma de retroceso." /><p>El patrón reproduce nuestro diagrama de diente de sierra original. Para algunas duraciones de búsqueda, las ganancias son pequeñas, mientras que para otras ascienden a varios segundos.</p><h2>Conclusión</h2><p>Esta optimización reemplaza con éxito la latencia inherente al sondeo tradicional con una estrategia de sondeo continuo más eficiente. El reto principal fue implementar esta optimización condicionalmente para evitar la degradación del rendimiento en despliegues HTTP/1. Lo solucionamos usando el <code>PerformanceObserver</code> del navegador para detectar de forma confiable el protocolo en uso en el salto final de red.</p><p>Las pruebas de laboratorio validan la teoría, muestran que el sondeo continuo arroja resultados tan pronto como están listos. En promedio, esto conduce a una mejora significativa en la experiencia del usuario, lo que hace que los datos se carguen hasta un 25 % más rápido.</p><p>Este trabajo es el último paso en nuestro compromiso por reducir el tiempo que tardan nuestros usuarios en obtener información útil. Al hacer de Kibana un proxy más transparente para los datos de Elasticsearch, superamos los límites del rendimiento dentro de nuestra esfera de influencia. Más próximamente.</p><p>(en 2025, Thomas Neirynk ofreció una <a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">excelente visión general</a> de los métodos y la motivación detrás de la mejora del rendimiento del dashboard de Kibana. Esta es una actualización sobre esa iniciativa).</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[Descríbelo, no lo dibujes: dashboard de Kibana con IA integrada a través de MCP y ES|QL]]></title>
    <description><![CDATA[De la indicación al dashboard. Aprende a construir dashboards de Kibana con lenguaje natural a través de example-mcp-dashbuilder: una aplicación MCP open source que escribe consultas ES|QL, crea gráficos interactivos y exporta dashboards completamente funcionales directamente a Kibana.]]></description>
    <content:encoded><![CDATA[<p>example-mcp-dashbuilder es una aplicación MCP open source que convierte una línea de comandos en inglés sencillo en un dashboard de Kibana interactivo y en tiempo real, todo dentro de la ventana de chat de tu editor. Describe el dashboard que deseas y la IA descubre tu estructura de índice, escribe las agregaciones ES|QL correctas para cada visualización y muestra una vista previa en línea a medida que va trabajando. Cuando termines, con un solo comando podrás exportar un dashboard de Kibana totalmente funcional con las visualizaciones reales de Lens, tu diseño de cuadrícula exacto y los colores personalizados conservados. En la actualidad, se admiten seis tipos de gráficos. El conjunto completo de Kibana Lens está previsto en el roadmap.</p><h2>¿Qué es el generador de dashboard de Kibana?</h2><p>¿Y si pudieras describir el dashboard que quieres en un lenguaje sencillo y ver cómo aparece, con gráficos interactivos, un diseño de arrastrar y soltar y la posibilidad de exportarlo a Kibana con un solo clic?</p><p>Eso es precisamente lo que hace <a href="https://github.com/elastic/example-mcp-dashbuilder.git"><strong>example-mcp-dashbuilder</strong></a>. Es una aplicación open source (Model Context Protocol (MCP)) que conecta asistentes de IA a Elasticsearch que te permiten crear paneles completos de Kibana a través de la conversación. No hay que hacer clic en los menús. No hay que escribir manualmente las configuraciones de visualización. Solo describe lo que necesitas y la IA explora tus datos, escribe las consultas en lenguaje de búsqueda de Elasticsearch (ES|QL), construye los gráficos y entrega un dashboard interactivo en vivo, todo dentro de la ventana de chat de tu editor.</p><h2><strong>De la línea de comandos al dashboard en segundos</strong></h2><p>Así es como se ve en la práctica. Escribes algo como:</p><p>"Crea un dashboard de tráfico web desde logstash-*, con solicitudes totales, bytes transferidos a lo largo del tiempo, fuentes geográficas principales y un desglose de código de respuesta"</p><p>La IA entonces:</p><ol><li><p><strong>Descubre tus datos:</strong> enumera índices, inspecciona mapeos de campo.</p></li><li><p><strong>Escribe consultas ES|QL:</strong> adaptadas a tu esquema con las agregaciones correctas.</p></li><li><p><strong>Crea visualizaciones:</strong> gráficos de barras, gráficos de líneas, métricas con líneas de destellos, mapas de calor, gráficos circulares.</p></li><li><p><strong>Organiza todo:</strong> secciones plegables, títulos significativos, diseño adecuado.</p></li><li><p><strong>Muestra una vista previa interactiva:</strong> directamente en el chat, con descripciones emergentes, un selector de hora y arrastrar y soltar.</p></li></ol><p>Cada gráfico aparece en línea a medida que se crea, por lo que puedes ver el progreso en tiempo real. Luego <code>view_dashboard</code> muestra el dashboard completo con todos los paneles dispuestos en la cuadrícula de 48 columnas de Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75af5d9042d141b5/6a17e99dbe608675a4004792/dcbf47c4f17bf1a184fb0167408ebeb861ef6c9d-1404x1568.png" alt="Dos gráficos que aparecen en la interfaz example‑mcp‑dashbuilder. La primera es un gráfico de barras vertical titulado “Principales fuentes geográficas,” que muestra los recuentos de solicitudes por código de país. El segundo es un gráfico circular titulado “Desglose de códigos de respuesta HTTP,” que muestra segmentos para las respuestas 200, 404 y 503." /><p><em>Vista previa de un solo gráfico en línea.</em></p><h2><strong>Impulsado por ES|QL</strong></h2><p>Toda recuperación de datos usa <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>, el lenguaje de búsquedas canalizadas de Elasticsearch. La IA no se limita a pasar consultas sin procesar, sino que también utiliza su conocimiento integrado de la sintaxis de ES|QL, junto con la información sobre la estructura de tus datos, para escribir consultas correctas y eficientes para cada tipo de visualización.</p><p>El servidor incluye una referencia completa de ES|QL como recurso MCP. Antes de escribir cualquier consulta, la IA lee esta referencia para comprender los comandos, funciones y patrones disponibles. Combinada con una guía de mejores prácticas de visualización de datos (que también sirve como recurso), la IA sabe no solo <em>cómo</em> realizar consultas, sino <em>qué</em> constituye una buena visualización:</p><ul><li><p>Usa <code>BUCKET(@timestamp, 1 day)</code> para series temporales; siempre <code>SORT</code> por el campo de tiempo.</p></li><li><p>Limita los gráficos circulares a seis porciones con <code>| SORT value DESC | LIMIT 6</code>.</p></li><li><p>Elige gráficos de barras para comparaciones de categorías, gráficos de líneas para tendencias, métricas para indicadores clave de rendimiento (KPIs).</p></li></ul><h2><strong>Exploración de datos basada en IA con análisis abierto</strong></h2><p>Una cosa es crear un dashboard que ya diseñaste en tu cabeza. Preguntar "¿Qué tiene de interesante este índice?" y obtener una respuesta útil es más difícil. Requiere que la IA sepa cómo <em>explorar</em>, no solo cómo dibujar.</p><p>example-mcp-dashbuilder envía un recurso <code>analysis://guidelines</code> que define un flujo de exploración estructurado: perfila los datos, ejecuta agregaciones específicas, revela patrones que vale la pena investigar, crea gráficos para los hallazgos más interesantes y propone consultas desglosadas que el usuario podría querer a continuación. Frases desencadenantes, como "analizar mis registros" o "encontrar patrones en este índice", hacen que la IA lea el manual antes de hacer cualquier otra cosa, por lo que un prompt abierto produce una investigación coherente en lugar de un montón aleatorio de gráficos.</p><p>El resultado: puedes proporcionarle a la IA un índice desconocido y obtener a cambio un punto de partida: un dashboard más una breve lista de preguntas del tipo "¿Esto es lo que observé, quieres que profundice en alguno de estos puntos?".</p><h2><strong>Exportación e importación de dashboard de Kibana: el viaje de ida y vuelta completo</strong></h2><p>El viaje de ida y vuelta de exportación e importación es donde example-mcp-dashbuilder se vuelve realmente útil para los equipos que ya trabajan en Kibana. example-mcp-dashbuilder es una interfaz de dashboard conversacional que vive dentro de tu editor, pero no limita tu trabajo allí. Los paneles que crees aquí pueden trasladarse a Kibana cuando quieras, y los paneles existentes de Kibana pueden venir de otro lado para la edición asistida por IA.</p><h3><strong>Exportar a Kibana</strong></h3><p>Cuando te guste tu dashboard, un solo comando lo exporta:</p><p>"Exportar este dashboard a Kibana"</p><p>Cada panel se traduce a una visualización real de Kibana Lens. La traducción preserva:</p><ul><li><p><strong>Consultas ES|QL:</strong> transferidas directamente como fuentes de datos Lens ES|QL.</p></li><li><p><strong>Posiciones de cuadrícula:</strong> el mismo sistema de 48 columnas que usa Kibana, así tu diseño se ve idéntico.</p></li><li><p><strong>Colores personalizados:</strong> paletas de series, fondos de métricas, rampas de color de mapa de calor.</p></li></ul><p>El resultado es un dashboard de Kibana completamente funcional. No es una captura de pantalla. No es una inserción. Un dashboard real que puedes compartir y continuar editando en Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1921c74c2833cabe/6a17e99f6864a4a712b687da/5e27777bc0a82cafb373943f65298bdb21d66176-1999x902.png" alt="Se muestran dos paneles, uno al lado del otro. El dashboard izquierdo titulado “Editar tráfico web — Logstash (Dashbuilder)” muestra las métricas de tráfico recientes, junto con un panel de volumen de tráfico, un gráfico de barras geográficas y un gráfico circular de código de respuesta. El dashboard derecho muestra un diseño similar con totales más altos e incluye un panel de volumen de tráfico, un gráfico de barras geográficas y un gráfico circular de código de respuesta." /><p><em>El dashboard de Kibana y el dashboard del chat de cursor, uno al lado del otro.</em></p><h3><strong>Importar desde Kibana</strong></h3><p>El viaje de ida y vuelta también funciona en la otra dirección:</p><p>"Importar el dashboard de Kibana con ID abc-123"</p><p>Esto recupera un dashboard de Kibana existente, traduce sus visualizaciones de Lens de vuelta a configuraciones de gráficos editables, conserva la disposición de la cuadrícula y las secciones, y carga todo en example-mcp-dashbuilder. Desde ahí, puedes modificarlo con lenguaje natural y volver a exportarlo.</p><p>Esto hace que la IA sea un complemento de tu flujo de trabajo actual en Kibana, no un sustituto.</p><h2><strong>Temas personalizados y colores</strong></h2><p>¿Quieres un dashboard de marca? Solo pregúntanos.</p><p>"Crea un dashboard de temática rosa con colores personalizados"</p><p>Cada tipo de visualización admite una configuración de color personalizada:</p><ul><li><p><strong>Gráficos:</strong> <code>palette</code> acepta una matriz de colores hexadecimales para series y segmentos.</p></li><li><p><strong>Métricas:</strong> <code>color</code> establece el color de fondo.</p></li><li><p><strong>Mapas de calor:</strong> <code>colorRamp</code> define el gradiente, de valores bajos a altos.</p></li></ul><p>La IA capta las solicitudes de temas de forma natural. Di, "Tema oceánico," y elegirá azules y verdes azulados. Di: "Que coincidan con los colores de nuestra marca" y proporciona los valores hexadecimales, y estos se transferirán a Kibana en el momento de la exportación.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2bc7cddbdef81354/6a17e9a1ec0f89ee155a665e/4aceba013ac9cbb4a541109efd6acddf8a6ec47d-1562x1568.png" alt="Un dashboard de comercio electrónico temático con colores rosados personalizados. El diseño muestra los KPI de ingresos y pedidos en la parte superior, una sección de tendencias colapsada y dos gráficos basados en categorías debajo: un gráfico de barras para ingresos por categoría y un gráfico circular para pedidos por categoría." /><p><em>Un dashboard temático con colores personalizados.</em></p><p><strong>Cómo funciona example-mcp-dashbuilder: arquitectura MCP</strong></p><p>example-mcp-dashbuilder se basa en <a href="https://modelcontextprotocol.io/">MCP</a>, el estándar abierto para conectar asistentes de IA con herramientas y datos externos. Aquí está la arquitectura a alto nivel:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c0cd879646e9947/6a17e9a36864a4c408b687df/cbfeabe151ec1ee2b0655f4d17468c9bb358df7e-1024x559.png" alt="Un diagrama de arquitectura que muestra el MCP Host conectado al MCP Server, el cual contiene herramientas, recursos e instrucciones. Debajo, una caja de app MCP incluye Elastic Charts y el diseño de cuadrícula de Kibana. Elasticsearch y Kibana aparecen en la parte inferior con flechas que los conectan a la MCP App." /><p>El <strong>servidor MCP</strong> expone 25 herramientas que la IA puede llamar directamente, desde ejecutar consultas ES|QL hasta exportar dashboards, junto con un puñado de herramientas internas "exclusivas de la app" que la vista previa en línea usa para obtener datos, conservar los cambios de diseño y detectar campos de tiempo. Ofrece tres recursos: una guía de mejores prácticas para la visualización de datos, una referencia de ES|QL y un manual de análisis profundo que se activa con preguntas abiertas ("analiza mis logs", "¿qué hay de interesante en este índice?"). Y se ejecuta por stdio o HTTP. El transporte HTTP soporta respuestas transferibles y gestión de sesiones, de modo que varios clientes pueden conectarse a un solo servidor.</p><p>La app <strong>MCP</strong> es la vista previa interactiva. Está hecha con React, <a href="https://elastic.github.io/elastic-charts">Elastic Charts</a> y <a href="https://eui.elastic.co/">Elastic UI</a>, todo empaquetado en un único archivo HTML independiente. Cuando la IA llama a <code>view_dashboard</code> o crea un gráfico, el host renderiza este HTML en un iframe en modo sandbox. La app se comunica completamente con el servidor a través del protocolo de aplicaciones <a href="https://modelcontextprotocol.io/extensions/apps/overview">MCP</a>, con <code>callServerTool()</code> a través de postMessage para obtener datos, almacenar diseños y detectar campos de tiempo. No hay un servidor localhost, no hay un puerto para configurar ni una dependencia de red externa.</p><p>Esto significa que funciona con cualquier cliente compatible con MCP: Cursor, Claude Desktop, Claude.ai, VS Code con Copilot y más.</p><h2><strong>¿Qué tipos de gráficos soporta example-mcp-dashbuilder?</strong></h2><p>Al momento de escribir, se admiten seis tipos de gráficos que cubren los escenarios de dashboard más comunes:</p><p>Tipo</p><p>Lo mejor para</p><p>Ejemplo</p><p>Barra</p><p>Comparación de categorías</p><p>Solicitudes por origen geográfico</p><p>Línea</p><p>Tendencias a lo largo del tiempo</p><p>Bytes transferidos por hora</p><p>Área</p><p>Volumen a lo largo del tiempo</p><p>Volumen de solicitudes a lo largo del tiempo</p><p>Circular</p><p>Parte del todo (máximo seis segmentos)</p><p>Distribución de los códigos de respuesta</p><p>Métrica</p><p>Indicador clave de rendimiento (KPI) único con minilínea</p><p>Total de solicitudes con tendencia horaria</p><p>Mapa de calor</p><p>Patrones en dos dimensiones</p><p>Solicitudes por día de la semana y por hora</p><p>Los paneles de control admiten secciones plegables para su organización, un selector de tiempo con detección automática de campos de tiempo y la capacidad de guardar y cambiar entre varios paneles; las sesiones de chat paralelas permanecen aisladas entre sí mediante un <code>dashboardId</code> que se interpone en cada llamada a la herramienta.</p><h2><strong>Cómo instalar y ejecutar example-mcp-dashbuilder</strong></h2><p>example-mcp-dashbuilder es de open source y está listo para usar. Necesitarás Node.js 22+, una instancia de Elasticsearch (local o Elastic Cloud) y un cliente compatible con MCP.</p><p><strong>Claude Desktop:</strong> descarga la última versión <code>.mcpb</code> de <a href="https://github.com/elastic/example-mcp-dashbuilder/releases">GitHub Releases</a> y haz doble clic. Claude Desktop te pedirá tus credenciales de Elasticsearch.</p><p><strong>Cursor / Claude Code / VS Code Copilot:</strong> apunta tu configuración de MCP al archivo tar publicado; sin clonar, sin <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>Establece <code>ES_NODE, ES_API_KEY</code> (o <code>ES_USERNAME / ES_PASSWORD</code>) y <code>KIBANA_URL</code> como variables de entorno. Si prefieres trabajar desde el código fuente, clona el repositorio y ejecuta <code>npm run setup</code> para un asistente interactivo que gestione tanto Elasticsearch local como Elastic Cloud (Cloud ID + clave API).</p><p>Y empieza a crear:</p><p>"Explora el índice de logs y crea el dashboard más completo que puedas"</p><p>A partir de ahí, la IA se encarga de todo. 😉</p><h2><strong>Roadmap: lo que viene para example-mcp-dashbuilder</strong></h2><p>Esta es una versión preliminar y la estamos desarrollando activamente. Algunas áreas en las que nos enfocamos:</p><ul><li><p><strong>Más tipos de gráficos:</strong> indicador, donut, treemap, tabla de datos y nube de cloud para igualar todas las capacidades de Lens.</p></li><li><p><strong>Enviar paneles a Git: </strong>escribe las configuraciones de los paneles en un repositorio para el control de versiones y los flujos de trabajo de revisión de código.</p></li><li><p><strong>Mejor experiencia de error: </strong>comentarios más detallados cuando las consultas ES|QL fallan, con sugerencias para correcciones comunes.</p></li><li><p><strong>Flujos de análisis más ricos: </strong>ampliación del manual de análisis profundo para cubrir más formas de datos (log, métricas, trazas).</p></li></ul><p>Nos encantaría saber lo que crees con él. Pruébalo, reporta problemas y cuéntanos qué visualizaciones y flujos de trabajo serían más útiles para tu equipo.</p><p><a href="https://github.com/elastic/example-mcp-dashbuilder">GitHub: elastic/example-mcp-dashbuilder</a></p><h3>Agradecimientos</h3><p>Gracias a <a href="mailto:walter.rafelsberger@elastic.co">Walter Rafelsberger</a> y <a href="mailto:tim.schnell@elastic.co">Tim Schnell</a> por sus contribuciones a la implementación.</p><h3>Preguntas frecuentes</h3><p><strong>¿Qué es example-mcp-dashbuilder?</strong> example-mcp-dashbuilder es una aplicación de open source MCP (Model Context Protocol) que conecta asistentes de IA con Elasticsearch. Te permite describir un dashboard de Kibana en lenguaje sencillo y genera automáticamente consultas ES|QL, crea visualizaciones y muestra un dashboard interactivo en tiempo real dentro de la ventana de chat de tu editor.</p><p><strong>¿Qué lenguaje de búsqueda usa example-mcp-dashbuilder para recuperar datos?</strong> Toda la recuperación de datos utiliza ES|QL, el lenguaje de búsqueda de Elasticsearch. El servidor MCP incluye una referencia integrada de ES|QL que la IA consulta antes de escribir cualquier consulta, lo que garantiza una sintaxis correcta y agregaciones eficientes para cada tipo de visualización.</p><p><strong>¿Puedo exportar paneles creados con example-mcp-dashbuilder a Kibana?</strong> Sí. Ejecutar "Exporta este dashboard a Kibana" convierte cada panel en una visualización real de Kibana Lens, conserva las consultas ES|QL, el diseño de cuadrícula de 48 columnas, los colores personalizados y las paletas de series. El resultado es un dashboard de Kibana completamente funcional, no una captura de pantalla ni una incrustación.</p><p><strong>¿Puedo importar un dashboard de Kibana existente en example-mcp-dashbuilder para una edición asistida por IA?</strong> Sí. Al introducir el ID de un dashboard de Kibana, se recupera el dashboard existente, se convierten sus visualizaciones de Lens en configuraciones de gráficos editables y se cargan en example-mcp-dashbuilder. Después puedes modificar el dashboard usando lenguaje natural y volver a exportarlo a Kibana.</p><p><strong>¿Qué clientes de MCP son compatibles con example-mcp-dashbuilder?</strong> example-mcp-dashbuilder funciona con cualquier cliente compatible con MCP, incluidos Cursor, Claude Desktop, Claude.ai y VS Code con Copilot. Es compatible tanto con el transporte stdio como HTTP, sin necesidad de configuración de servidor o puerto localhost.</p><p><strong>¿Qué tipos de gráficos admite example-mcp-dashbuilder?</strong> La versión actual admite seis tipos de gráficos: barra, línea, área, circular, métrica (con minigráfico) y mapa de calor. Las adiciones previstas incluyen medidor, dona, gráfico de rectángulos, tabla de datos y nube de etiquetas para igualar las capacidades completas de Kibana Lens.</p><p><strong>¿Qué necesito para ejecutar example-mcp-dashbuilder?</strong> Necesitas Node.js versión 22 o superior, una instancia de Elasticsearch (local o en Elastic Cloud) y un cliente compatible con MCP. Configura las variables de entorno ES_NODE, ES_API_KEY (o ES_USERNAME/ES_PASSWORD) y KIBANA_URL. Para Claude Desktop, descarga el archivo .mcpb Descarga el archivo desde GitHub Releases y haz doble clic para instalarlo.</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[AI]]></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[Mejorar la interactividad del dashboard de Kibana con controles variables]]></title>
    <description><![CDATA[Descubre cómo utilizar los controles variables en Kibana 8.18+ para filtrar visualizaciones individuales, ajustar intervalos de tiempo y agrupar por diferentes campos en los dashboards de Kibana.]]></description>
    <content:encoded><![CDATA[<p>¡Nos complace compartir que los <strong>controles variables ahora están disponibles en los dashboards de Kibana</strong> a partir de la versión 8.18 y en toda la serie 9.x! Esta característica ha sido una de las mejoras más solicitadas con más frecuencia por los usuarios de los dashboards—y finalmente está aquí 🎉 Durante los últimos meses, hemos continuado expandiendo y refinando <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#add-variable-control">controles de variables</a>, por lo que este es el momento perfecto para dedicarles su propia publicación en el blog.</p><h2>¿Qué son los controles variables?</h2><p>Si has trabajado antes con los dashboards de Kibana, probablemente conozcas nuestros controles clásicos de dashboard: esos prácticos menús desplegables que muestran valores de tus datos para que puedas aplicar filtros con un par de clics.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7405fbff7584b1b/6a17ee5cfbc5f8aea1491b5d/b82c1b25a0b38661e5ce4552f763be487d5074aa-1600x701.png" alt="" /><p>A simple vista, los controles variables son parecidos , pero tienen un giro ingenioso: en lugar de filtrar automáticamente cada panel en tu dashboard, pueden conectarse directamente a <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">búsquedas ES|QL dentro de visualizaciones individuales</a>.</p><p>Eso significa que <em>tú</em> decides dónde se aplica cada control. Y aún más, puedes usarlos para todo tipo de trucos creativos, como ajustar intervalos de tiempo, cambiar campos de desglose o modificar parámetros de visualización en el momento. Básicamente, ofrecen a tus dashboards una experiencia realmente interactiva, lo que permite obtener tu información de manera más rápida y fácil.</p><h2>Casos de uso para controles variables</h2><p>Muy bien, los controles variables parecen útiles, pero ¿para qué sirven realmente? A continuación se muestran algunos ejemplos de cómo mejorar tus dashboards:</p><h3>Filtrar visualizaciones seleccionadas.</h3><p>¿Quieres filtrar <em>algunas</em> visualizaciones sin cambiar otras? Los controles de variables te permiten hacer exactamente eso. Selecciona los paneles a los que deseas responder y conéctalos en las búsquedas de ES|QL detrás de tus visualizaciones.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd014bba50a3a61e/6a17ee5e14d90c006d79b69a/efa367363830b03bc67028aceafe78c4b44e578f-1440x562.gif" alt="" /><h3>Selecciona diferentes intervalos de tiempo</h3><p>Otorga a tus usuarios el poder de cambiar entre “5 minutos”, “1 hora”, “1 día” o cualquier cubeta de tiempo que tenga sentido. Crea un control variable con intervalos predefinidos y conéctalo a tu búsqueda de series temporales.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt237797ddea95ce08/6a17ee602f4a5cfd65fa8996/62aa9f4e728036f8c70213b76b1cf131f36f5b4d-1440x606.gif" alt="" /><h3>Cambiar funciones</h3><p>En lugar de crear múltiples gráficos para cada operación, permite que los usuarios del dashboard elijan si quieren ver el máximo, el promedio, diferentes percentiles o cualquier otro agregador.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4c856460132fb604/6a17ee627b54f920838b3991/f6a2b4c73dc35efe462c2924a153d7b3fa3a7922-1436x606.gif" alt="" /><h3>Agrupar por diferentes campos</h3><p>A veces necesitas desglosar los datos por diferentes dimensiones durante una investigación. Con controles variables, puedes definir múltiples campos “agrupar por” y permitir que los usuarios del dashboard elijan cuál les permite descubrir su información.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbf1a24038dde55b8/6a17ee646864a413b6b6884c/fe8745a6fddccadba0666686b8ebc67fdaf64158-1438x606.gif" alt="" /><h2>¿Cómo puedes crearlos?</h2><p>La manera más sencilla (y probablemente más amena) de crear un control de variable es directamente desde el <strong>editor de búsquedas ES|QL</strong> en tu visualización. Simplemente comienza a escribir tu búsqueda, usa el menú de autocompletado y Kibana configurará el control de una manera que te resulte útil.</p><p>Pero si prefieres empezar desde la variable en sí, también puedes ir a: <strong>Agregar panel → Controles → Control de variables</strong> y agregar la variable a tus visualizaciones después de crear el control.</p><h3>Ejemplo 1: Control de filtrado con selección de múltiples valores.</h3><p>1. Elija una visualización que se realice a partir de una búsqueda ES|QL y haga clic en “Crear control” dentro de la cláusula WHERE.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1356c9ac1ffce732/6a17ee661d1b83104a93e4f3/46cb6f2a6775aee152d42eb5ee85170f1bdf26cb-1600x668.png" alt="" /><p>2. Serás redirigido automáticamente al elemento flotante de creación de variables, donde se seleccionará el tipo “Valores de una búsqueda” para ti, y el nombre de la variable ya estará previamente completado. Recuerda que el nombre de un control siempre debe comenzar con “?...” para que funcione en la búsqueda de visualización.</p><p>Normalmente necesitarás una búsqueda como esta para obtener los valores de un campo y actualizarlos según el rango de tiempo seleccionado en el dashboard:</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. Al guardar el control, lo verás aparecer en la parte superior del dashboard y tu búsqueda de visualización se actualizará con el nombre del control variable.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte03c74e0c60bdb42/6a17ee6a0b0bed13cddd3636/5fc434c8951889e9769652b675191711d126a685-1600x653.png" alt="" /><p>4. Si deseas agregar una <a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#esql-multi-values-controls">selección de valores múltiples</a> al control, debes usar la función <code>MV_CONTAINS</code> en la búsqueda y seleccionar “Permitir selecciones múltiples” durante la creación del control en el paso 2 (disponible desde la versión 9.3).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt218a166f7a1dc52c/6a17ee6ca2929979a9d02d27/1f237cea0a37cb25a7917a2a683707a269adae8e-1600x670.png" alt="" /><h3>Ejemplo 2: Control de intervalos de tiempo.</h3><p>Si estás creando una serie temporal, puedes agregar fácilmente un control variable en el intervalo de histograma de fecha:</p><p>1. Cuando escribas una búsqueda ES|QL para tu serie temporal, haz clic en “Crear control”. Al construir una variable para intervalos, es mejor usar <code>TBUCKET</code> en lugar de <code>BUCKET</code> para que acepte intervalos más legibles como “1 hora”, “1 día”, etc. Pronto habrá una opción automática para <code>TBUCKET</code> que se adaptará automáticamente a los intervalos de tiempo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta6f32acf5ed19697/6a17ee6e6864a4a32fb68850/b0ad53d790ff9bdd42db5e77477318319f423534-1600x664.png" alt="" /><p>2. Define los intervalos para completar las opciones en el menú desplegable.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf08d6a75afe87314/6a17ee6f25daab58fe08a2fa/f3bd83f530cfa4698c1a3b1ae60d08d0414043b5-1600x757.png" alt="" /><p>3. Selecciona diferentes intervalos en el menú desplegable y observa cómo cambia tu visualización.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ecd5f376b096063/6a17ee7196142a0f77eb1b9b/0f928d9c70929f64926e065059188d140cd48943-1600x671.png" alt="" /><h3>Ejemplo 3: variables para funciones</h3><ol><li><p>Crea una variable usando el tipo de control “Valores estáticos” y agrega nombres de funciones a los valores de tu menú desplegable. Es importante usar un nombre para la variable que comience con “??...” para reemplazar funciones.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6bdc0c817465f3f0/6a17ee73505ac3268cad8bea/531444237b7e152d3c8a6f3ca7e464f954f9e856-1600x663.png" alt="" /><p>2. Incluye el nombre de la variable en la búsqueda ES|QL.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd631ad49bbb93c3e/6a17ee75e9ea87708ea9c6aa/9858442abb26d8d266d464852871b139fde63b89-1600x665.png" alt="" /><h3>Ejemplo 4: variables para campos</h3><ol><li><p>Puedes usar el tipo de control “Valores estáticos” y escribir los nombres de los campos que desees. Es importante usar un nombre de variable que comience con “??...” para que funcione en los campos.</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29079f2b85c7239c/6a17ee77b1e113328f79f30b/33534c3df2fae024b25c28b4aed5d742e54202a2-1600x710.png" alt="" /><p>2. Crea una referencia a la variable donde la necesites en la búsqueda de la visualización.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ca73c08dfa27319/6a17ee780b0bed31e8dd363a/71cdf3e9df72c59d957628a3aa6e4aa9bd60d6d5-1600x676.png" alt="" /><h2>Controles de variables en Discover</h2><p>Los controles variables no son solo una característica del dashboard: también están disponibles directamente en el editor de ES|QL en Discover. Puede crear controles para obtener una experiencia de exploración de datos más rápida en Discover, llevarlos al dashboard y viceversa.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40c9ce5eed7ded45/6a17ee7b420229747b29f684/fdddeec902d0bc746caed9276d01d7d48793dd85-1600x709.png" alt="" /><h2>Detalles técnicos</h2><p>A estas alturas, probablemente hayas notado que los controles de variables incluyen algunas reglas, como a qué partes de una búsqueda pueden hacer referencia y los prefijos de nombres que necesitas usar (“?...” para valores y “??...” para campos o funciones). Eso se debe a que las variables no son simplemente reemplazos de texto que ocurren en el cliente. En realidad, son ciudadanos de primera clase en el propio lenguaje de búsquedas (conocidos como <a href="https://www.elastic.co/docs/solutions/search/agent-builder/tools/esql-tools#parameter-types">parámetros en ES|QL</a>).</p><p></p><p>Este diseño ofrece grandes ventajas. Por un lado, Kibana puede entender el contexto de cada variable, lo que nos permite generar y completar previamente, de manera automática, su configuración. Además, es mucho más seguro: debido a que el lenguaje valida estrictamente las entradas de variables, previene las inyecciones maliciosas y genera errores fácilmente, si algo parece incorrecto. Asimismo, mejora el rendimiento y la estabilidad al trasladar la compleja validación y el manejo de errores al servidor en lugar de al cliente. Recordatorio sobre el rendimiento: una de las mejores prácticas es crear variables que incluyan búsquedas rápidas, ya que se cargan antes que el dashboard, por lo que las búsquedas lentas pueden afectar al rendimiento de todo el dashboard.</p><p>Por supuesto, esta arquitectura también tiene algunas <a href="https://www.elastic.co/docs/solutions/search/agent-builder/limitations-known-issues#esql-limitations">limitaciones</a>—por ahora. Las variables aún no admiten una opción “Cualquiera” para filtrar, y actualmente no se pueden usar con ciertos operadores como <code>LIKE</code>o <code>FROM</code> (para cambiar fuentes de datos). ¿La buena noticia? Estamos trabajando activamente para agregar estas funciones.</p><h2>Qué depara el futuro para los controles</h2><p>¡Este no es el final! Algunas de las mejoras importantes incluyen:</p><p>✨ La capacidad de colocar controles en cualquier lugar del dashboard</p><p>✨ Encadenar tus controles, lo que significa que la salida de un control se convierte en la entrada para el siguiente</p><p>✨ Mejores opciones de selección como la opción “Cualquiera” para variables.</p><p>✨ Nuevos tipos de control (control de tipo búsqueda y variables para tus fuentes de datos)</p><p>✨ Y otras mejoras en la experiencia del usuario que han estado solicitando, como el filtro previo de controles normales.</p><p>Si tienes ideas o comentarios, nos encantaría saber de ti.</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[analíticas]]></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[Paneles impulsados por IA: de una visión a Kibana]]></title>
    <description><![CDATA[Genera un panel de control usando un LLM para procesar una imagen y convertirla en un Panel de Kibana.
]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/kibana/kibana-lens">Kibana Lens</a> hace que los paneles de control sean muy sencillos, pero cuando necesitas decenas de paneles, los clics se acumulan. ¿Y si pudieras hacer un boceto de un panel de control, hacer capturas de pantalla y dejar que un LLM termine todo el proceso por ti?</p><p>En este artículo, haremos que eso suceda. Crearemos una aplicación que tome una imagen de un panel de control, analice nuestros mapeos y luego genere un panel sin que tengamos que tocar Kibana en absoluto.</p><p><strong>Pasos</strong>:</p><ol><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#background-&amp;-application-workflow">Antecedentes y flujo de trabajo de la aplicación</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#prepare-data">Preparar datos</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#llm-configuration">Configuración de LLM</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#application-functions">Funciones de aplicación</a></p></li></ol><h2>Antecedentes y flujo de trabajo de la aplicación</h2><p>La primera idea que se me ocurrió fue dejar que el LLM generara todo el formato NDJSON <a href="https://www.elastic.co/docs/explore-analyze/find-and-organize/saved-objects">de los objetos almacenados</a> de Kibana y luego los importara a Kibana.</p><p>Probamos algunos modelos:</p><ul><li><p>Gemini 2.5 pro</p></li><li><p>GPT o3 / o4-mini-alto / 4,1</p></li><li><p>Claude 4 soneto</p></li><li><p>Grok 3</p></li><li><p>Deepseek (Deepthink R1)</p></li></ul><p>Y para los prompts, empezamos tan sencillos como:</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>A pesar de repasar <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.">algunos ejemplos de planos</a> y explicaciones detalladas sobre cómo construir cada visualización, no tuvimos suerte. Si te interesa esta experimentación, puedes encontrar <a href="https://gist.github.com/TomasMurua/a78dc283e115624731beffc98984b70b">detalles aquí</a>.</p><p>El resultado de este enfoque fue ver estos mensajes al intentar subir a Kibana los archivos producidos por el LLM:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9ea005966a783057/6a1707d266c4f90e4ef8bf88/2b599443b5613c9f0fc3235581614add5b4b3900-891x98.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e5632d6d95b998c/6a1707d3a6c2b9441de79661/d87ccfc033bc00ee8188c5cae18043fbca22784c-741x233.png" alt="" /><p>Esto significa que el JSON generado es inválido o está mal formateado. Los problemas más comunes eran que el LLM producía NDJSON incompleto, alucinaban parámetros o devolvían JSON normal en lugar de NDJSON, por mucho que intentáramos hacer cumplir lo contrario.</p><p>Inspirados por <a href="https://www.elastic.co/search-labs/blog/llm-functions-elasticsearch-intelligent-query">este artículo</a> —donde <a href="https://www.elastic.co/docs/solutions/search/search-templates">las plantillas de búsqueda</a> funcionaban mejor que el estilo libre de un LLM— decidimos dar plantillas al LLM en lugar de pedir generar el archivo NDJSON completo y luego, en código, usar los parámetros dados por el LLM para crear las visualizaciones adecuadas. Este enfoque no decepcionó, y es previsible y ampliable, ya que ahora el código hace el trabajo duro y no el LLM.</p><p>El flujo de trabajo de la aplicación será el siguiente:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f7738a4c7ddd0cd/6a1707d52b835f0a25f4b166/52c587cf0cf3517fdd4ee7ab95581dd4f2bce030-725x668.png" alt="" /><p></p><p><em>Omitiremos algo de código para simplificar, pero puedes encontrar el código funcional de la aplicación completa en </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>este</strong></em></a><em> cuaderno.</em></p><h2>Prerrequisitos</h2><p>Antes de empezar a desarrollar, necesitarás lo siguiente:</p><ol><li><p>Python 3.8 o superior</p></li><li><p>Un entorno <a href="https://docs.python.org/3/library/venv.html">Venv</a> Python</p></li><li><p>Una instancia de Elasticsearch en ejecución, junto con su endpoint y clave API</p></li><li><p>Una clave de API de OpenAI almacenada bajo el nombre de la variable de entorno OPENAI_API_KEY:</p></li></ol>export OPENAI_API_KEY="your-openai-api-key"<h2>Preparar datos</h2><p>Para los datos, lo mantendremos sencillo y usaremos registros sitio web de muestra de Elastic. Puedes aprender cómo importar esos datos a tu <a href="https://www.elastic.co/docs/manage-data/ingest/sample-data#add-sample-data-sets">clúster aquí</a>.</p><p>Cada documento incluye detalles sobre el anfitrión que emitió las solicitudes a la aplicación, junto con información sobre la propia solicitud y su estado de respuesta. A continuación se muestra un documento de ejemplo:</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>Ahora, vamos a tomar los mapeos del índice que acabamos de cargar, <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>Vamos a pasar los mapeos junto con la imagen que cargaremos más adelante.</p><h2>Configuración de LLM</h2><p>Configuremos el LLM para que use <a href="https://python.langchain.com/docs/concepts/structured_outputs/">una salida estructurada</a> para introducir una imagen y recibir un JSON con la información que necesitamos pasar a nuestra función para producir los objetos JSON.</p><p>Instalamos las dependencias:</p>pip install elasticsearch pydantic langchain langchain-openai -q<p>Elasticsearch nos ayudará a recuperar los <a href="https://www.elastic.co/docs/manage-data/data-store/mapping">mapeos de índice</a>. Pydantic nos permite definir esquemas en Python para luego pedir al LLM que lo siga, y <a href="https://www.elastic.co/search-labs/integrations/langchain">LangChain</a> es el framework que facilita la llamada a LLMs y herramientas de IA.</p><p>Crearemos un esquema Pydantic para definir la salida que queremos del LLM. Lo que necesitamos saber de la imagen es el tipo de gráfico, campo, título de visualización y título del panel de control:</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>Para la entrada de imagen enviaremos un panel de control que acabo de dibujar:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7870f6421986d11d/6a1707d78b73cb3408189fa3/36441d7b5dc1f3ff2ac2a30710208d57ad41c716-1600x898.jpg" alt="" /><p>Ahora declaramos la llamada al modelo LLM y la carga de imagen. Esta función recibirá los mapeos del índice de Elasticsearch y una imagen del panel de control que queremos generar.</p><p>Con <code>with_structured_output</code> podemos usar nuestro esquema de <code>Dashboard</code> Pydantic como objeto de respuesta que producirá el LLM. Con <a href="https://docs.pydantic.dev/latest/">Pydantic</a>, podemos definir modelos de datos con validación, lo que garantiza que la salida del LLM coincida con la estructura esperada.</p><p>Para convertir la imagen a base64 y enviarla como entrada, puedes usar un <a href="https://www.base64-image.de/">convertidor online</a> o hacerlo <a href="https://www.geeksforgeeks.org/python-convert-image-to-string-and-vice-versa/">en código</a>.</p>prompt = f"""
    You are an expert in analyzing Kibana dashboards from images for the version 9.0.0 of Kibana.

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

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

    Index Mappings:
    {index_mappings}

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

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


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

    print("Dashboard values generated by the LLM successfully")
    print(dashboard_values)
except Exception as e:
    print(f"Failed to analyze image and match fields: {str(e)}")<p>El LLM ya tiene contexto sobre los paneles Kibana, así que no necesitamos explicar todo en el prompt, solo algunos detalles para cerciorarnos de que no olvide que está funcionando con Elasticsearch y Kibana.</p><p>Vamos a desglosar el prompt:</p><p>Sección</p><p>Razón</p><p>Eres un experto en analizar paneles de Kibana a partir de imágenes para la versión 9.0.0 de Kibana.</p><p>Al reforzar esto es Elasticsearch, y la versión de Elasticsearch reducimos la probabilidad de que el LLM alucine parámetros antiguos o inválidos.</p><p>Se te dará una imagen del panel de control y un mapeo de índice de Elasticsearch.</p><p>Explicamos que la imagen trata sobre paneles para evitar interpretaciones erróneas por parte del LLM.</p><p>A continuación se muestran los mapeos de índices del índice en el que se basa el panel de control. Emplea esto para ayudarte a entender los datos y los campos disponibles. Mapeos de índice: {index_mappings}</p><p>Es crucial proporcionar los mapeos para que el LLM pueda seleccionar campos válidos dinámicamente. De lo contrario, podríamos codificar los mapeos aquí, lo cual es demasiado rígido, o confiar en la imagen que contiene los nombres de campo correctos, lo cual no es fiable.</p><p>Incluye solo los campos relevantes para cada visualización, basándote en lo que sea visible en la imagen.</p><p>Tuvimos que agregar este refuerzo porque a veces intenta agregar campos que no son relevantes para la imagen.</p><p>Esto devolverá un objeto con un serial de visualizaciones para mostrar:</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>Procesamiento de la respuesta de los LLM</h2><p>Creamosun panel de panel de muestra 2x2 y luego lo exportamos en JSON usando <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-get-dashboards-dashboard">la API Get a dashboard</a>, y después almacenamos los paneles como plantillas de visualización (pastel, barra, métrica) donde podemos reemplazar algunos parámetros para crear nuevas visualizaciones con diferentes campos según la pregunta.</p><p>Puedes ver los archivos JSON <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>de plantilla aquí</strong></a>. Fíjate en cómo cambiamos los valores de los objetos que queremos reemplazar más adelante por {<code>variable_name</code>}
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc55d69d84a08e668/6a1707d8a2929903acd00fb8/ec7e1ac0cd8b470df13e60940162b56778acb386-315x234.png" alt="" /><p>Con la información que nos proporcionó el LLM, podemos decidir qué plantilla usar y qué valores reemplazar.</p><p><code>fill_template_with_analysis</code> recibirá los parámetros de un único panel, incluyendo la plantilla JSON de la visualización, un título, un campo y las coordenadas de la visualización en la cuadrícula.</p><p>Luego, reemplazará los valores de la plantilla y devolverá la visualización JSON final.</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>Para simplificar, tendremos coordenadas estáticas que asignaremos a los paneles que el LLM decida crear y produciremos un panel de cuadrícula 2x2 como en la imagen anterior.</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>Dependiendo del tipo de visualización decidido por el LLM, elegiremos una plantilla de archivo JSON y reemplazaremos la información relevante usando <code>fill_template_with_analysis</code> , luego agregaremos el nuevo panel a un array que usaremos más adelante para crear el panel de control.</p><p>Cuando el panel esté listo, usaremos la <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-dashboards-dashboard-id">API Crear un panel</a> para enviar el nuevo archivo JSON a Kibana y generar el panel:
</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>Para ejecutar el script y generar el panel de control, ejecuta el siguiente comando en la consola:</p>python &lt;file_name&gt;.py<p>El resultado final será el siguiente:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ceffed004153a4f/6a1707d9a929cf9147ae0901/e909afbf0e47d9a6e0f7bd07dfb2efcfa5cf06ac-921x715.png" alt="" /><h2>Conclusión</h2><p>Los LLMs muestran sus fuertes capacidades visuales al hacer texto a código o convertir imágenes en código. La API de los paneles también permite convertir archivos JSON en paneles, y con un LLM y algo de código, podemos convertir imágenes en un panel Kibana.</p><p>El siguiente paso es mejorar la flexibilidad de los gráficos del salpicadero empleando diferentes configuraciones de cuadra, tamaños y posiciones de tablero. Además, ofrecer soporte para visualizaciones y tipos de visualización más complejos sería una adición útil a esta aplicación.</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[AI]]></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 parte 2: Análisis y visualización de datos]]></title>
    <description><![CDATA[Profundizaremos más que nunca en tus datos de Spotify y exploraremos conexiones que ni siquiera sabías que existían.]]></description>
    <content:encoded><![CDATA[<p>En la <a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">primera parte</a> de este serial, escrita por Iulia Feroli, hablamos sobre cómo obtener tus datos de Spotify Wrappped y visualizarlos en Kibana. En la parte 2, profundizamos en los datos para ver qué más podemos descubrir. Para ello, vamos a aprovechar un enfoque un poco diferente y usar <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify a Elasticsearch</a> para indexar los datos en Elasticsearch. Esta herramienta es un poco más avanzada y requiere un poco más de configuración, pero merece la pena. Los datos están más estructurados y podemos hacer preguntas más complejas.</p><h2>Diferencias respecto al primer análisis de Spotify Wrapped</h2><p>En el primer blog, usamos la exportación de Spotify directamente y no realizamos ninguna tarea de normalización ni ningún otro procesamiento de datos. Esta vez, usaremos los mismos datos, pero realizaremos un procesamiento de datos para hacerlos más utilizables. Esto nos permitirá responder a preguntas mucho más complejas, como:</p><ul><li><p>¿Cuál es la duración media de una canción en mi top 100?</p></li><li><p>¿Cuál es la popularidad media de una canción en mi top 100?</p></li><li><p>¿Cuál es la duración media de escucha de una canción?</p></li><li><p>¿Cuál es la pista que más me salto?</p></li><li><p>¿Cuándo me gusta saltarme pistas?</p></li><li><p>¿Estoy escuchando una hora concreta del día más que otras?</p></li><li><p>¿Estoy escuchando más un día de la semana que otros?</p></li><li><p>¿Es un mes de especial interés?</p></li><li><p>¿Cuál es el artista con el mayor tiempo de escucha?</p></li></ul><p>Spotify Wrapped es una experiencia divertida cada año, mostrando lo que escuchaste este año. No te da cambios año tras año, y por tanto podrías extrañarte a algunos artistas que antes estaban en tu top 10, pero que ahora desaparecieron.</p><h2>Procesamiento de datos envueltos en Spotify para análisis</h2><p>Hay una gran diferencia en la forma en que procesamos los datos en la primera y la segunda publicación. Si quieres seguir trabajando con los datos de la primera publicación, tendrás que tener en cuenta algunos cambios en el nombre de campos, así como volver a ES|QL para hacer ciertas extracciones como <code>hour of day</code> sobre la marcha.</p><p>Aun así, todos deberíais poder seguir esta publicación. El procesamiento de datos se realiza en el repositorio <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">de Spotify a Elasticsearch</a> , implica aplicar a la API de Spotify la duración de la canción, la popularidad y también renombrar y mejorar algunos campos. Por ejemplo, el campo <code>artist</code> en la exportación de Spotify es solo una cadena y no representa características ni pistas multiartista</p><h2>Visualizando datos en Spotify Wrapped con paneles de control</h2><p>Creé un panel de control en Kibana para visualizar los datos. El panel está <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">disponible aquí</a> y puedes importarlo a tu instancia Kibana. El panel de control es bastante extenso y responde muchas de las preguntas anteriores.</p><p>¡Vamos a hablar de algunas preguntas y cómo responderlas juntos!</p><h3>¿Cuál es la duración media de una canción en mi top 100?</h3><p>Para responder a esta pregunta, podemos usar Lens o ES|QL. Vamos a explorar las tres opciones. Formulemos esta pregunta correctamente de manera Elasticsearch. Queremos encontrar las 100 canciones más populares y luego calcular la duración media de todas esas canciones juntas. En términos de Elasticsearch eso serían dos agregaciones:</p><ol><li><p>Descubre las 100 mejores canciones</p></li><li><p>Calcula la duración media de esas 100 canciones.</p></li></ol><p><strong>Lens</strong></p><p>En Lens, esto es bastante sencillo: crear un nuevo Lens, cambiar a una tabla y arrastrar y soltar el campo <code>title</code> dentro de la tabla. Luego haz clic en el campo <code>title</code> y pon el tamaño en 100, además de poner modo <code>accuracy</code> . Luego arrastra y suelta el campo <code>duration</code> en la tabla y usa <code>last value</code>, porque realmente solo necesitamos el último valor de la duración de cada canción. La misma canción solo tendrá una duración. Al final de esta agregación de <code>last value</code> hay un desplegable para una fila resumen, selecciona <code>average</code> y te lo mostrará.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="Uso de Lens para datos envuelto en Spotify" /><p><strong>ES|QL</strong></p><p>ES|QL es un lenguaje bastante nuevo comparado con DSL y agregaciones, pero es muy poderosa y fácil de usar. Para responder a la misma pregunta en ES|QL, escribirías la siguiente consulta:</p><p>Déjame guiarte paso a paso por este ES|Consulta QL:</p><ol><li><p><code>from spotify-history</code> - Este es el patrón índice que estamos usando.</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - Esta es la primera agregación, estamos calculando la duración máxima de cada canción y el recuento de cada canción. Usamos <code>max</code> en lugar de <code>last value</code> como se usa en el Lens, eso es porque ES|Ahora mismo QL no tiene ni primera ni última.</p></li><li><p><code>sort count desc</code> - Ordenamos las canciones por el conteo de cada canción, así que la canción más escuchada está arriba.</p></li><li><p><code>limit 100</code> - Limitamos el resultado a las 100 mejores canciones.</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - Calculamos la duración media de las canciones.</p></li></ol><h3>¿Me interesa especialmente un mes?</h3><p>Para responder a esta pregunta podemos usar Lens con la ayuda de campo de ejecución y ES|QL. ¿Qué notamos de inmediato? No hay ningún campo en los datos que denote el <code>month</code> directamente, sino que necesitamos calcularlo a partir del campo <code>@timestamp</code> . Hay varias formas de hacerlo:</p><ol><li><p>Emplea un campo de ejecución para alimentar el objetivo</p></li><li><p>ES|QL</p></li></ol><p>Personalmente creo que ES|QL es la solución más ordenada y rápida.</p><p>Eso es todo, no hace falta nada sofisticado, podemos aprovechar la función <code>DATE_EXTRACT</code> para extraer el mes del campo <code>@timestamp</code> y luego podemos agregar sobre él. Usando el ES|Visualización QL podemos incluirla en el panel de control.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Visualización mensual de desglose en Spotify Wrapped" /><h3>¿Cuál es mi duración de escucha por artista y al año?</h3><p>La idea detrás de eso es ver si un artista es solo algo puntual o si hay una repetición. Si no recuerdo mal, Spotify solo te muestra los 5 mejores artistas en el wrappeado anual. ¿Quizá tu artista número 6 se mantiene igual todo el tiempo, o cambia mucho después de la décima posición?</p><p>Una de las representaciones más sencillas de esto es un gráfico de barras porcentuales. Podemos usar Lens para esto. Sigue los pasos a seguir:</p><p>Arrastra y suelta el campo <code>listened_to_ms</code> . Este campo representa cuánto tiempo escuchaste una canción en milisegundos. Ahora, por defecto, Lens creará una agregación <code>median</code> , no queremos eso, cambia eso a un <code>sum</code>. En la parte superior selecciona <code>percentage</code> en lugar de <code>stacked</code> para el tipo de gráfico de barras. Para el desglose selecciona <code>artist</code> y di top 10. En el menú desplegable de <code>Advanced</code> no olvides seleccionar <code>accuracy mode</code>. Ahora, cada bloque de color representa cuánto escuchaste a este único artista. Dependiendo de tu selector de tiempo, las barras pueden representar valores que van de días, a semanas, a meses o años. Si quieres un desglose semanal, selecciona el <code>@timestamp</code> y configura el <code>mininum interval</code> en <code>year</code>. Ahora, lo que podemos decir en mi caso es que <code>Fred Again..</code> es el artista que más escuché, casi el 12% de mi tiempo total de escucha lo consumía <code>Fred Again..</code>. También vemos que <code>Fred Again..</code> bajó un poco en 2024, pero <code>Jamie XX</code> creció considerablemente. Si comparamos solo el tamaño de las barras. También podemos notar que, aunque <code>Billie Eilish</code> se está tocando constantemente en 2024, el ancho del manillar. Esto significa que escuché más a <code>Billie Eilish</code> en 2024 que en 2023.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="Visualización del historial con Spotify Wrapped usando Kibana" /><h3>¿Y qué hay de las pistas principales por artista por tiempo de escucha frente al tiempo total de escucha?</h3><p>Es una pregunta larga. Déjame intentar explicar lo que quiero decir con eso. Spotify te dice cuál es la canción más destacada de un solo artista, o tus 5 canciones más populares en total. Bueno, eso es sin duda interesante, pero ¿qué pasa con la ruptura de un artista? ¿Todo mi tiempo lo consumo solo con una sola canción que pongo una y otra vez, o eso se distribuye de forma equitativa?</p><p>Crea un nuevo objetivo y selecciona <code>Treemap</code> como tipo. Para el <code>metric</code>, igual que antes: selecciona <code>sum</code> y usa <code>listened_to_ms</code> como campo. Para el <code>group by</code> necesitamos dos valores. El primero se <code>artist</code> y luego agrega otro con <code>title</code>. El resultado intermedio es así:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="Visualización del historial con Spotify Wrapped usando Kibana" /><p>Vamos a cambiar eso a los 100 mejores artistas y desseleccionar la <code>other</code> en el desplegable avanzado, además de activar el modo de precisión. Para el título, cambia eso a top 10 y activa el modo de precisión. El resultado final es así:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="Visualización en Spotify Wrapped usando Kibana" /><p>¿Qué nos dice esto ahora exactamente? Sin mirar ningún componente temporal, podemos decir que en todo mi historial de escuchas con Spotify, pasé un 5,67% escuchando <code>Fred Again..</code>. En individuo, pasé el 1,21% de ese tiempo escuchando <code>Delilah (pull me out of this)</code>. Es interesante ver si hay una sola canción que ocupe a un artista, o si hay otras canciones también. El propio mapa de árbol es una forma agradable para representar estas distribuciones de datos.</p><h3>¿Escucho en una hora y día concretos?</h3><p>Bueno, eso podemos responder de forma muy sencilla con una visualización de lentes aprovechando el <code>Heat Map</code>. Crea una nueva lente, selecciona <code>Heat Map</code>. Para el <code>Horizontal Axis</code> selecciona <code>dayOfWeek</code> campo y ponlo en <code>Top 7</code> en vez de Top 3. Para el <code>Vertical Axis</code> seleccionar el <code>hourOfDay</code> y para <code>Cell Value</code> simplemente un <code>Count of records</code>simple . Ahora esto dará lugar a este panel:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="Visualización de hábitos de escucha con Spotify Wrapped usando paneles de control" /><p>Hay un par de cosas molestas alrededor de esta lente que simplemente me molestan al interpretar. Intentemos limpiarlo un poco. Primero que nada, no me importa demasiado la leyenda, usa el símbolo de arriba con el triángulo, cuadrado, círculo y desactivarlo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Visualización con Spotify Wrapped " /><p>Ahora, la segunda parte que resulta molesta es la organización de los días. Es lunes, miércoles, jueves o cualquier otra cosa, dependiendo de los valores que tengas. El <code>hourOfDay</code> está correctamente ordenado. La forma de ordenar los días es un truco gracioso y eso se llama usar <code>Filters</code> en vez de <code>Top Values</code>. Haz clic en <code>dayOfWeek</code> y selecciona <code>Filters</code>, ahora debería ver así:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="Visualización del historial de Spotify Wrapped con Kibana Dashboards" /><p>Ahora empieza a escribir los días. Un filtro por cada día. <code>"dayOfWeek" : Monday</code> y ponle la etiqueta <code>Monday</code> y repite.</p><p>Una advertencia en todo esto es que Spotify proporciona los datos en UTC+0 sin ninguna información de zona horaria. Claro, también proporcionan la dirección IP y el país al que escuchaste, y podríamos deducir la información de la zona horaria a partir de eso, pero eso puede ser un poco raro y para países como EE. UU., que tienen múltiples zonas horarias, puede ser demasiado complicado. Esto es importante porque Elasticsearch y Kibana tienen soporte para zonas horarias y, al proporcionar la zona horaria correcta en el campo <code>@timestamp</code> , Kibana ajustaría automáticamente la hora a la hora de tu navegador.</p><p>Debería ver así cuando se finalice, y se nota que soy un oyente muy activo durante el horario laboral y menos los sábados y domingos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="Visualización en Spotify Wrapped usando Kibana Dashboards" /><h2>Conclusión</h2><p>En este blog, profundizamos un poco más en las complejidades que ofrecen los datos de Spotify. Mostramos algunas formas sencillas y rápidas de poner en marcha algunas visualizaciones. Es simplemente asombroso tener tanto control sobre tu propio historial de escucha. Echa un vistazo a las otras partes del serial:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">Parte 1: Cómo crear tu propio Spotify Wrapped in Kibana</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">Parte 3: Empleos de población para detección de anomalías</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">Parte 4: Detección de relaciones en los datos</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">Parte 5: Encontrar a tu mejor amigo musical con vectores</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[analíticas]]></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[Pruebas locales de DeepSeek R1 para RAG con Ollama y Kibana]]></title>
    <description><![CDATA[Aprende a ejecutar una instancia local de DeepSeek y conectarse a ella desde Kibana.]]></description>
    <content:encoded><![CDATA[<p>Todo el mundo está hablando de DeepSeek R1, el nuevo modelo de lenguaje grande del fondo de cobertura chino High-Flyer. Las noticias están llenas de especulaciones sobre lo que significa para la industria ahora que han introducido un LLM capaz de razonamiento en cadena de pensamiento con pesos abiertos. Para aquellos curiosos por probar este nuevo modelo con RAG y toda la inteligencia de la base de datos vectorial de Elasticsearch, aquí hay un tutorial rápido para comenzar a usar DeepSeek R1 mediante inferencia local. En el camino, utilizaremos la característica Playground de Elastic e incluso descubriremos algunas propiedades buenas y malas de DeepSeek R1 para RAG.</p><p>Aquí tienes un diagrama de lo que configuraremos en este tutorial:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3214cc505e3d4d06/6a17df98dbb4ff12bafb55da/8aafec9011e986cd85b10958544a4d77be81e518-739x419.png" alt="Configuración de Deepseek con Elasticsearch y Ollama" /><h2>Configuración de la inferencia local con Ollama</h2><p><a href="https://ollama.com/">Ollama</a> es una excelente forma de probar rápidamente un conjunto curado de modelos de open source para la inferencia local y es una herramienta popular para los desarrolladores de IA.</p><h3>Ejecutar Ollama en recursos físicos</h3><p>Una <a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama">instalación local</a> en Mac, Linux o Windows es la forma más sencilla de aprovechar cualquier capacidad de GPU local que tengas, especialmente para aquellos con chips Apple de la serie M. Una vez que tengas Ollama instalado, puedes descargar y ejecutar DeepSeek R1 con el siguiente comando.</p><p>Le recomendamos ajustar el tamaño del parámetro a algo que se adapte a su hardware. Los tamaños disponibles se pueden encontrar <a href="https://ollama.com/library/deepseek-r1">aquí</a>.</p>ollama run deepseek-r1:7b<p>Puede chatear con el modelo en la terminal, pero el modelo sigue ejecutándose cuando sale del comando con CTL+d o escribe “/bye”. Para ver que el modelo aún se está ejecutando, ingrese:</p>ollama ps<h3>Ejecutar Ollama en un contenedor</h3><p>Alternativamente, la manera más rápida de ejecutar Ollama es utilizando un motor de contenedores como Docker. Usar la GPU de su máquina local no siempre es tan sencillo, dependiendo de su entorno, pero obtener una configuración de prueba rápida no es difícil siempre que su contenedor tenga la RAM y el almacenamiento para adaptarse a los modelos de varios GB.</p><p>Para poner en marcha Ollama en Docker, solo tienes que ejecutar lo siguiente:</p>mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama
<p>Esto creará un directorio llamado “ollama” en el directorio actual y lo montará dentro del contenedor para almacenar la configuración de Ollama y también los modelos. Dependiendo de la cantidad de parámetros utilizados, pueden variar desde algunos GB hasta decenas de GB, así que asegúrese de elegir un volumen con suficiente espacio libre.</p><p>Nota: Si tienes una GPU Nvidia en tu máquina, asegúrate de instalar el <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation">Nvidia container toolkit</a> y agrega "--gpus=all" al comando docker ejecutar mencionado.</p><p>Una vez que el contenedor de Ollama esté en funcionamiento en su máquina, puede descargar un modelo como deepseek-r1 con:</p>docker exec -it ollama ollama pull deepseek-r1:7b<p>De manera similar al enfoque de hardware dedicado, es posible que desees ajustar el tamaño del parámetro a algo que se adapte a tu hardware. Los tamaños disponibles se pueden encontrar en <a href="https://ollama.com/library/deepseek-r1">https://ollama.com/library/deepseek-r1</a>.</p><p>Una vez que finalice la extracción del modelo, puede escribir “/bye” para salir de la indicación. Para comprobar que el modelo sigue ejecutándose:</p>docker exec -it ollama ollama ps<h2>Prueba de nuestra inferencia local con curl</h2><p>Para probar la inferencia local con curl, puedes ejecutar el siguiente comando. Usamos stream:false para poder leer fácilmente la respuesta narrativa JSON:</p>curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "prompt":"Why is Elastic so cool?"
}'<h2>Probar Ollama "Compatible con OpenAI" y un aviso RAG</h2><p>Convenientemente, Ollama también ofrece un endpoint REST que imita el comportamiento de OpenAI para compatibilidad con una amplia gama de herramientas, incluido Kibana.</p>curl http://localhost:11434/v1/chat/completions -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "messages": [
    { 
      "role": "system", 
      "content": "You are a helpful AI Assistant that uses the following context to answer questions only use the following context. \n\nContext:  The color of the sky today is purple. "},
    { "role": "user", 
      "content": "What does the sky look like today?" 
    }
  ]
}'<p>La prueba de esta indicación más compleja da como resultado un contenido que tiene una sección &lt;think&gt; en la que el modelo ha sido entrenado para razonar el problema.</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>Conectando Ollama a Kibana</h2><p>Una excelente manera de usar Elasticsearch es el script de desarrollo “<a href="https://github.com/elastic/start-local?tab=readme-ov-file#-try-elasticsearch-and-kibana-locally">start-local</a>”.</p><p>Asegúrate de que tu Kibana y Elasticsearch puedan llegar a tu Ollama en la red. Si estás utilizando una configuración de contenedor local de Elastic stack, quizás deberías reemplazar “localhost” por “host.docker.internal” o “host.containers.internal” para obtener una ruta de red a la máquina hospedada.</p><p>En Kibana, navegue a Stack Management &gt; Alertas e información &gt; Conectores.</p><h3>Qué debes hacer si ves que se trata de una advertencia de configuración común</h3><p>Necesitará asegurarse de que xpack.encryptedSavedObjects.encryptionKey <a href="https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html">esté configurado correctamente</a>. Este es un paso común que se omite al ejecutar una instalación local de Docker de Kibana, así que enumeraré los pasos para corregirlo en la sintaxis de Docker.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4f7b7be2e04afae/6a17df9a1d1b8391e293e393/b70b4b810bcac1d1599b07da90a98c5c744a38de-497x223.png" alt="" /><p>Asegúrate de mantener tu directorio kibana/config para que los cambios se guarden cuando el contenedor se apague. Mis volúmenes del contenedor de Kibana se ven así en docker-compose.yml:</p>services:
  kibana:
...
   volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
      - kibanaconfig:/usr/share/kibana/config
...
volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  kibanadata:
    driver: local
  kibanaconfig:
    driver: local<p>Ahora puede crear el almacén de claves y poner un valor para que las claves de Connector no se almacenen en texto plano.</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>Reinicie completamente todo el clúster para asegurarse de que los cambios surtan efecto.</p><h3>Creación del conector</h3><p>Desde la pantalla de configuración del conector (en Kibana, navega hasta Stack Management &gt; Alerts and Insights &gt; Connectors), crea un conector y selecciona el tipo “OpenAI”.</p><p>Configure el conector con las siguientes configuraciones</p><ul><li><p>Nombre del conector: DeepSeek (Ollama)</p></li><li><p>Seleccione un proveedor de OpenAI: otro (Servicio compatible con OpenAI)</p></li><li><p>URL: <a href="http://localhost:11434/v1/chat/completions">http://localhost:11434/v1/chat/completions</a></p><ul><li><p>Ajusta la ruta correcta hacia tu Ollama. Recuerda sustituir host.docker.internal o su equivalente si estás llamando desde dentro de un contenedor.</p></li></ul></li><li><p>Modelo predeterminado: deepseek-r1:7b</p></li><li><p>Clave API: invente algo, se necesita una entrada pero el valor no importa</p></li></ul><p>Ten en cuenta que la prueba de un conector personalizado para Ollama en la configuración del conector está rota en 8.17 en este momento, pero se ha corregido en la próxima versión 8.18 de Kibana.</p><p>Nuestro conector se ve así:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774e0793eb110f9d/6a17df9c445de981014d004d/4ce214aa953b4090ed112fbde40b01c01fb8f5c7-786x836.png" alt="" /><h2>Incorporación de datos de incrustaciones vectoriales en Elasticsearch</h2><p>Si ya estás familiarizado con Playground y tienes datos configurados, puedes saltar al paso de Playground que aparece a continuación, pero si necesitas algunos datos de prueba rápidos, debemos asegurarnos de que nuestras API de _inference estén configuradas. A partir de la versión 8.17, las asignaciones de machine learning son dinámicas. Por lo tanto, para descargar y activar el vector denso multilingüe e5, solo necesitaremos ejecutar lo siguiente en las herramientas de desarrollo de Kibana.</p>GET /_inference


POST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{
   "input": "are internet memes about deepseek sound investment advice?"
}<p>Si aún no lo has hecho, esto activará la descarga del modelo e5 desde los repositorios de modelos de Elastic.</p><p>A continuación, carguemos un libro de dominio público como nuestro contexto de RAG. Aquí hay un lugar para descargar “Las aventuras de Alicia en el país de las maravillas” del Proyecto Gutenberg: <a href="https://www.gutenberg.org/cache/epub/11/pg11.txt">enlace</a>. Guárdelo como un archivo .txt.</p><p>Navegue hasta Elasticsearch &gt; Inicio &gt; Cargar un archivo</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c594487844ecb4/6a17df9dfaa9137edb93c786/649042271f34a5e66789b17c39bfe95971c7f4ce-1360x629.png" alt="" /><p>Seleccione o arrastre y suelte su archivo de texto y luego pulse el botón "Importar".</p><p>En la pantalla “Importar datos” seleccione la pestaña “Avanzado” y luego establezca el nombre del índice como “book_alice”.</p><p>Selecciona la opción "Add additional field" (Agregar campo adicional), que está justo debajo de "Automatically created fields" (Campos creados de forma automática). Selecciona “Add semantic text field" (Agregar campo de texto semántico) y cambia el endpoint de inferencia a “.multilingual-e5-small-elasticsearch”. Selecciona "Add" (Agregar) y luego "Import" (Importar).</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9c22ccdaee8590/6a17df9f3e03d731f94f2b8e/e58d5c9a2d406d8e62eb96cab9ac98ca89414346-507x602.png" alt="" /><p></p><p>Cuando termine la carga y la inferencia, estaremos listos para dirigirnos a Playground.</p><h2>Prueba de RAG en Playground</h2><p>Navega hasta Elasticsearch &gt; Playground en Kibana.</p><p>En la pantalla de Playground, debería ver una marca de verificación verde y “LLM Connected” para indicar que un conector está presente. Este es el conector de Ollama que acabamos de crear arriba. Puede encontrar una guía más extensa para Playground <a href="https://www.elastic.co/guide/en/kibana/current/playground.html">aquí</a>.</p><p>Haga clic en el botón azul Agregar fuentes de datos y seleccione el índice book_alice que creamos anteriormente u otro índice que haya configurado previamente que utilice API de inferencia para incrustaciones.</p><p>Deepseek es un modelo de cadena de pensamiento con fuertes características de alineación. Esto es tanto bueno como malo desde la perspectiva del RAG. El entrenamiento de la cadena de pensamiento puede ayudar a Deepseek a racionalizar declaraciones aparentemente contradictorias en las citas, pero la fuerte alineación con el conocimiento de entrenamiento puede hacer que prefiera su propia versión de los hechos del mundo sobre nuestra base contextual. Si bien es bien intencionada, se sabe que esta fuerte alineación hace que los LLM sean difíciles de instruir cuando se discuten temas en los que nuestro conocimiento privado se contrae o no está bien representado en el conjunto de datos de entrenamiento.</p><p>En nuestra configuración de Playground, ingresamos el siguiente mensaje del sistema: “Eres un asistente para tareas de respuesta a preguntas que utiliza pasajes de texto relevantes del libro Alicia en el país de las maravillas” y aceptamos los otros valores predeterminados.</p><p>A la pregunta “¿Quién estuvo en la fiesta del té?” obtenemos la respuesta: “Respuesta: La Liebre de Marzo, el Sombrerero y el Lirón estaban en la fiesta del té. [Cita: posición 1 y 2]” lo cual es correcto.
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ce6a0facd972fdd/6a17dfa03e03d79aaa4f2b92/e8af3ff93a72e1f02de8e73f6c2606cbc19970e5-1296x813.png" alt="" /><p>Podemos ver en las etiquetas &lt;think&gt; que Deepseek definitivamente ponderó el contenido de las citas para responder a las preguntas.</p><h2>Prueba de limitaciones de alineación</h2><p>Creemos un escenario intelectualmente desafiante para Deepseek como prueba. Crearemos un índice de teorías de conspiración que los datos de entrenamiento de Deepseek saben que no son ciertas.</p><p>En las herramientas de desarrollo de Kibana, vamos a crear el siguiente índice y datos:</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>
Estas teorías de conspiración serán nuestro fundamento para el LLM. A pesar de introducir un mensaje agresivo en el sistema, Deepseek no aceptará nuestra versión de los hechos. Si estuviéramos en una situación en la que supiéramos que nuestros datos privados son más confiables, bien fundamentados o alineados con las necesidades de nuestra organización, esto no sería aceptable:</p><p>A la pregunta de prueba "¿Son reales los pájaros?" (explicación <a href="https://knowyourmeme.com/memes/birds-arent-real">conoce tu meme</a>) obtenemos la respuesta "En el contexto proporcionado, los pájaros no se consideran reales, pero en realidad, son animales reales. [Contexto: posición 1]". Esta prueba demuestra que DeepSeek R1 es poderoso, incluso en el nivel de parámetro 7B... sin embargo, puede que no sea la mejor opción para RAG, dependiendo de nuestro conjunto de datos.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e8dabf65ea200e1/6a17dfa2ec0f8982135a6541/67d5f6cdb97bfd3adb926cbd588c768f9d6730ae-1277x737.png" alt="" /><h2>Entonces, ¿qué aprendimos?</h2><p>En resumen:</p><ul><li><p>Ejecutar modelos localmente en herramientas como Ollama es una excelente opción para echar un vistazo al comportamiento del modelo.</p></li><li><p>DeepSeek R1 es un modelo de razonamiento, lo que significa que tiene ventajas y desventajas para casos de uso como RAG.</p></li><li><p>Playground puede conectarse a marcos de trabajo de alojamiento de inferencia como Ollama a través de una API REST similar a OpenAI, que se está convirtiendo en un estándar de facto en esta era inicial del alojamiento de IA.</p></li></ul><p>En general, estamos impresionados con lo lejos que ha llegado el RAG local aislado o "air gapped". Las herramientas de Elasticsearch, Kibana y los modelos de pesos abiertos disponibles han avanzado significativamente desde que escribimos por primera vez sobre <a href="https://www.elastic.co/search-labs/blog/privacy-first-ai-search-langchain-elasticsearch">búsqueda de IA que prioriza la privacidad</a> en 2023.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</guid>
    <category><![CDATA[AI]]></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[Ingirir datos geoespaciales en Elasticsearch con Kibana para su uso en ES|QL]]></title>
    <description><![CDATA[Cómo usar Kibana y el procesador de ingesta csv para ingirse datos geoespaciales en Elasticsearch para usarlos con la búsqueda en el lenguaje de consultas de Elasticsearch (ES|QL). Elasticsearch cuenta con poderosas características de búsqueda geoespacial, que ahora están llegando a ES|QL por una facilidad de uso mucho mejorada y familiaridad con el OGC. Pero para usar estas características, necesitamos datos geoespaciales.]]></description>
    <content:encoded><![CDATA[<p>Recientemente publicamos un blog describiendo cómo emplear las nuevas <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">características</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">de búsqueda geoespacial</a> <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">en ES|QL,</a> el nuevo y poderoso <a href="https://www.elastic.co/search-labs/blog/esql-piped-query-language-goes-ga">lenguaje de consultas por tubes</a> de Elasticsearch. Para usar estas características, necesitas tener datos geoespaciales en Elasticsearch. Así que en este blog, te mostraremos cómo ingerir datos geoespaciales y cómo usarlos en ES|Consultas QL.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" alt="Búsqueda Geoespacial ESQL" /><h2>Importación de datos geoespaciales usando Kibana</h2><p>Los datos que usamos para los ejemplos del blog anterior se basaban en datos que usamos internamente para pruebas de integración. Para tu comodidad, lo incluimos aquí en forma de algunos archivos CSV que se pueden importar fácilmente usando Kibana. Los datos son una mezcla de aeropuertos, ciudades y límites urbanos. Puedes descargar los datos desde:</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>Este contiene una fusión de tres conjuntos de datos:</p><ul><li><p>Aeropuertos (nombres, ubicaciones y datos relacionados) de <a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/">Natural Earth</a></p></li><li><p>Ubicaciones de las ciudades según <a href="https://simplemaps.com/data/world-cities">SimpleMaps</a></p></li><li><p>Elevaciones de aeropuertos según <a href="https://www.partow.net/miscellaneous/airportdatabase/">la base de datos global de aeropuertos</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>Esto contiene una fusión de nombres de aeropuertos y ciudades mencionados anteriormente con una fuente nueva:</p><ul><li><p>Límites de la ciudad según <a href="https://www.openstreetmap.org/">OpenStreetMap</a></p></li></ul></li></ul></li></ul><p>Como puedes imaginar, dedicamos un tiempo a combinar estas fuentes de datos en los dos archivos anteriores, con el objetivo de poder probar las características geoespaciales de ES|QL. Puede que esto no sea exactamente lo mismo que tus necesidades específicas de datos, pero espero que esto te dé una idea de lo que es posible. En individuo, queremos demostrar algunas cosas interesantes:</p><ul><li><p>Importación de datos con campos geoespaciales junto con otros datos indexables</p></li><li><p>Importar datos <code>geo_point</code> y <code>geo_shape</code> y usarlos juntos en consultas</p></li><li><p>Importación de datos en dos índices que pueden unir mediante una relación espacial</p></li><li><p>Crear una canalización de ingestión para facilitar futuras importaciones (más allá de Kibana)</p></li><li><p>Algunos ejemplos de procesadores de ingest, como <code>csv</code>, <code>convert</code> y <code>split</code></p></li></ul><p>Aunque en este blog hablaremos sobre cómo trabajar con datos CSV, es importante entender que existen <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">varias formas</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">de</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">agregar datos geográficos usando</a> <a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">Kibana</a>. Dentro de la aplicación de mapas puedes subir datos delimitados como archivos de forma CSV, GeoJSON y ESRI, y también puedes dibujar formas directamente en el mapa. Para este blog nos centraremos en importar archivos CSV desde la página principal de Kibana.</p><h3>Importación de aeropuertos</h3><p>El primer expediente <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">, airports.csv</a>, tiene algunas rarezas interesantes con las que tenemos que lidiar. En primer lugar, las columnas tienen espacios en blanco adicionales que las separan, algo que no es típico de los archivos CSV. En segundo lugar, el campo <code>type</code> es un campo de varios valores, que necesitamos separar en cuerpos separados. Por último, algunos campos no son cadenas y necesitan convertir al tipo correcto. Todo esto se puede hacer empleando la instalación de importación CSV de Kibana.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt393bc416bf425301/6a16f707839dfa1e86dcfca9/b1afd8c95973bec32f229a9adfaef14680b09a8e-1944x478.png" alt="Kibana Upload - Vista previa" /><p>Empieza en la página principal de Kibana. Hay una sección llamada "Empezar agregando integraciones", que tiene un enlace llamado "Subir un archivo":</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte12fc741edab20d3/6a16f709acf088600fbe98bf/996372bb3a52859cc840bd1d8f984a33a0e7ada3-1180x410.png" alt="Kibana Home - Sube un archivo" /><p>Haz clic en este enlace y serás llevado a la página "Subir archivo". Aquí puedes arrastrar y soltar el archivo <code>airports.csv</code> , y Kibana analizará el archivo y te mostrará una vista previa de los datos. Debería detectar automáticamente el delimitador como una coma, y la primera fila como la fila de cabecera. Sin embargo, probablemente no recortó el espacio en blanco extra entre las columnas, ni determinó los tipos de campos, suponiendo que todos los campos sean <code>text</code> o <code>keyword</code>. Tenemos que arreglar esto.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf65a09ec0c7a61ad/6a16f70ad7c0227aedde626f/1d9ffa6cdbc0d67a228be1a747ec1ebda6a63099-1800x538.png" alt="Kibana Upload - Vista previa" /><p>Haz clic <code>Override settings</code> y marca la casilla para <code>Should trim fields</code>y <code>Apply</code> para cerrar la configuración. Ahora necesitamos fijar los tipos de los campos. Esto está disponible en la página siguiente, así que adelante y haz clic <code>Import</code>.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda9a5f85d8e693dc/6a16f70c60084b72f53c4348/a97aceffb1858eae26a213336913505ae9923b03-1800x526.png" alt="Kibana Upload - Importación" /><p>Primero elige un nombre de índice y luego selecciona <code>Advanced</code> para acceder a la página de mapeo de campos e ingesta del procesador.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt56705083cdd9eb18/6a16f70d66c4f93350f8bdbb/058b0fb09da0b8d7f9c9b0a9c83b8b485ce43925-1440x629.png" alt="Kibana Upload - Mapeos de campos" /><p>Aquí necesitamos hacer cambios tanto en los mapeos de campos del índice como en la canalización de ingesta para importar los datos. En primer lugar, aunque Kibana probablemente detectó automáticamente el campo <code>scalerank</code> como <code>long</code>, percibió erróneamente los campos <code>location</code> y <code>city_location</code> como <code>keyword</code>. Edítalos para que <code>geo_point</code>, y acabes con mapeos que se ven algo así como:</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>Aquí tienes cierta flexibilidad, pero ten en cuenta que el tipo que elijas afectará a cómo se indexa el campo y qué tipo de consultas son posibles. Por ejemplo, si dejas <code>location</code> tal <code>keyword</code> no puedes realizar ninguna consulta de búsqueda geoespacial sobre él. De manera similar, si dejas <code>elevation</code> tal <code>text</code> no puedes realizar consultas numéricas por rango.</p><p>Ahora es el momento de arreglar la pipeline de ingest. Si Kibana detectó automáticamente <code>scalerank</code> como <code>long</code> anterior, también agregó un procesador para convertir el campo en un <code>long</code>. Necesitamos agregar un procesador similar para el campo <code>elevation</code> , esta vez convirtiéndolo a <code>double</code>. Edita la canalización para cerciorarte de que tienes esta conversión en marcha. Antes de almacenar esto, queremos una conversión más, para dividir el campo de <code>type</code> en varios campos. Agregar un procesador <code>split</code> a la canalización, con la siguiente configuración:</p>{
  "split": {
    "field": "type",
    "separator": ":",
    "ignore_missing": true
  }
}<p>La pipeline final de ingesta debería ser la siguiente:</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>Ten en cuenta que no agregamos un procesador de conversión para los campos <code>location</code> y <code>city_location</code> . Esto se debe a que el tipo <code>geo_point</code> en el mapeo de campos ya entiende el formato WKT de los datos en estos campos. El tipo <code>geo_point</code> puede comprender una variedad de formatos, incluyendo <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html">WKT, GeoJSON y más</a>. Si tuviéramos, por ejemplo, dos columnas en el archivo CSV para <code>latitude</code> y <code>longitude</code>, tuvimos que agregar un procesador <code>script</code> o un <code>set</code> para combinarlas en un solo campo <code>geo_point</code> (por ejemplo, <code>"set": {"field": "location", "value": "{{lat}},{{lon}}"}</code>).</p><p>Ahora estamos listos para importar el archivo. Haz clic <code>Import</code> y los datos se importarán al índice con los mapeos y la pipeline de ingesta que acabamos de definir. Si hay errores al absorber los datos, Kibana los reportará aquí, así que puedes editar los datos fuente o la pipeline de ingesta y volver a intentarlo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte81621425c7289c5/6a16f70f839dfaf608dcfcad/55dde2940c7aba66ce8257d15007ef797b8a5107-1440x415.png" alt="Kibana Upload - Importación" /><p>Fíjate que se creó una nueva canalización de ingestión. Esto puede comprobar yendo a la sección <code>Stack Management</code> de Kibana y seleccionando <code>Ingest pipelines</code>. Aquí puedes ver la canalización que acabamos de crear y editarla si es necesario. De hecho, la sección <code>Ingest pipelines</code> puede usar para crear y probar canalizaciones de ingest, una función muy útil si planeas hacer ingestas aún más complejas.</p><p>Si quieres explorar estos datos inmediatamente, baja a las secciones posteriores, pero si también quieres importar los límites de la ciudad, sigue leyendo.</p><h3>Importación de los límites de la ciudad</h3><p>El archivo de límites de la ciudad disponible en <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> es un poco más sencillo de importar que el ejemplo anterior. Contiene un campo <code>city_boundary</code> que es una representación WKT del límite de la ciudad como <code>POLYGON</code>y un campo <code>city_location</code> que es una representación <code>geo_point</code> de la ubicación de la ciudad. Podemos importar estos datos de forma similar a los datos del aeropuerto, pero con algunas diferencias:</p><ul><li><p>Tuvimos que seleccionar la opción de anulación <code>Has header row</code> ya que no se detectó automáticamente</p></li><li><p>No fue necesario recortar campos, ya que los datos ya estaban limpios de espacio en blanco extra</p></li><li><p>No tuvimos que editar la tubería de ingesta porque todos los tipos eran de cadena o de tipos espaciales</p></li><li><p>Sin embargo, tuvimos que editar los mapeos de campos para establecer el campo <code>city_boundary</code> a <code>geo_shape</code> y el campo <code>city_location</code> a <code>geo_point</code></p></li></ul><p>Nuestros mapeos finales de campo eran los siguientes:</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>Como con la importación <code>airports.csv</code> anterior, simplemente haz clic <code>Import</code> para importar los datos al índice. Los datos se importarán junto con los mapeos que editamos y la pipeline de ingesta que Kibana definió.</p><h3>Explorando datos geoespaciales con herramientas de desarrollo</h3><p>En Kibana es habitual explorar los datos indexados con "Descubrir". Sin embargo, si tu intención es crear tu propia app usando ES|Consultas QL, podría ser más interesante intentar acceder a la API en bruto de Elasticsearch. Kibana tiene una consola práctica para experimentar escribiendo consultas. Esto se llama la consola <code>Dev Tools</code> y se puede encontrar en la barra lateral de Kibana. Esta consola se comunica directamente con el clúster Elasticsearch y puede usar para ejecutar consultas, crear índices y más.</p><p>Prueba lo siguiente:</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>Esto debería proporcionar los siguientes resultados:</p><p>distancia</p><p>Abbrev</p><p>nombre</p><p>Ubicación</p><p>país</p><p>ciudad</p><p>elevación</p><p>273418.05776847183</p><p>JAMÓN</p><p>Hamburgo</p><p>POINT (10.005647830925 53.6320011640866)</p><p>Alemania</p><p>Norderstedt</p><p>17.0</p><p>337534.653466062</p><p>TXL</p><p>Berlin-Tegel Int'l</p><p>POINT (13.2903090925074 52.5544287044101)</p><p>Alemania</p><p>Hohen Neuendorf</p><p>38.0</p><p>483713.15032266214</p><p>OSL</p><p>Oslo Gardermoen</p><p>POINT (11.0991032762581 60.1935783171386)</p><p>Noruega</p><p>Oslo</p><p>208.0</p><p>522538.03148094116</p><p>BMA</p><p>Bromma</p><p>POINT (17.9456175406145 59.3555902065112)</p><p>Suecia</p><p>Estocolmo</p><p>15.0</p><p>522538.03148094116</p><p>ARN</p><p>Arlanda</p><p>POINT (17.9307299016916 59.6511203397372)</p><p>Suecia</p><p>Estocolmo</p><p>38.0</p><p>624274.8274399083</p><p>DUS</p><p>Düsseldorf Int'l</p><p>POINT (6.76494446612174 51.2781820420774)</p><p>Alemania</p><p>Düsseldorf</p><p>45.0</p><p>633388.6966435644</p><p>PRG</p><p>Ruzyn</p><p>POINT (14.2674849854076 50.1076511703671)</p><p>Chequia</p><p>Praga</p><p>381.0</p><p>635911.1873311149</p><p>AMS</p><p>Schiphol</p><p>PUNTO (4.76437693232812 52.3089323889822)</p><p>Países Bajos</p><p>Hoofddorp</p><p>-3.0</p><p>670864.137958866</p><p>FRA</p><p>Nt'l de Frankfurt</p><p>POINT (8.57182286907608 50.0506770895207)</p><p>Alemania</p><p>Fráncfort</p><p>111.0</p><p>683239.2529970079</p><p>WAW</p><p>Okecie Int'l</p><p>POINT (20.9727263383587 52.171026749259)</p><p>Polonia</p><p>Piaseczno</p><p>111.0</p><h2>Visualización de datos geoespaciales con Kibana Maps</h2><p>Kibana Maps es una herramienta poderosa para visualizar datos geoespaciales. Puede emplear para crear mapas con múltiples capas, cada capa representando un conjunto de datos diferente. Los datos pueden filtrar, agregar y estilizar de diversas maneras. En esta sección, te mostraremos cómo crear un mapa en Kibana Maps usando los datos que importamos en la sección anterior.</p><p>En el menú Kibana, navega hasta <code>Analytics</code>-&gt;<code>Maps</code> para abrir una nueva vista del mapa. Haz clic en <code>Add Layer</code> y selecciona <code>Documents</code>, eligiendo el <code>airports</code> de vista de datos y luego editando el estilo de capa para colorear los marcadores usando el campo <code>elevation</code> , para que podamos ver fácilmente la altura de cada aeropuerto.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcc4736d88c1abc9/6a16f7102b835f7353f4afca/9e63726d7c059331e6e20e474f8abee53dc2cbb4-840x388.png" alt="Kibana Maps - Estilo de Capa de Aeropuertos" /><p>Haz clic en 'Conservar cambios' para almacenar el mapa:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ec3cc535b5c21d8/6a16f71375879ec091fe15dc/32ad1dadb5d341a2b66662c58638b781122fc22c-2852x1528.png" alt="Kibana Maps - Aeropuertos" /><p>Ahora agrega una segunda capa, esta vez seleccionando la vista de datos <code>airport_city_boundaries</code> . Esta vez, usaremos el campo <code>city_boundary</code> para estilizar la capa y pondremos el color de relleno en azul claro. Esto mostrará los límites de la ciudad en el mapa. Cerciórate de reordenar las capas para que los marcadores del aeropuerto estén encima.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2932d7ff4a7206c9/6a16f7156f7f0409f09145c7/53dd65026f9a98c13f2cc4f9328a79242f0b70de-2854x1510.png" alt="Kibana Maps - Estilo de capa de límites de ciudades" /><h2>Unirías espaciales</h2><p>ES|QL no soporta comandos <code>JOIN</code>, pero puedes lograr un caso especial de unión usando el <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich">comando</a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich"><code>ENRICH</code></a>. Este comando funciona de forma similar a una 'unión por la izquierda' en SQL, permitiéndote enriquecer resultados de un índice con datos de otro índice basar en una relación espacial entre los dos conjuntos de datos.</p><p>Por ejemplo, enriquezcamos los resultados de una tabla de aeropuertos con información adicional sobre la ciudad a la que sirven encontrando el límite de la ciudad que contiene la ubicación del aeropuerto, y luego realicemos algunas estadísticas sobre los resultados:</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>Si ejecutas esta consulta sin preparar primero el índice de enriquecimiento, recibirás un mensaje de error como:</p>cannot find enrich policy [city_boundaries]<p>Esto se debe a que, como mencionamos antes, ES|QL no soporta comandos de <code>JOIN</code> verdadero. Una razón importante para ello es que Elasticsearch es un sistema distribuido, y las uniones son operaciones costosas que pueden ser difíciles de escalar. Sin embargo, el comando <code>ENRICH</code> puede ser bastante eficiente, ya que emplea índices de enriquecimiento especialmente preparados que se duplican a lo largo del clúster, permitiendo realizar uniones locales en cada nodo.</p><p>Para entender mejor esto, centrémonos en el comando <code>ENRICH</code> de la consulta anterior:</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary<p>Este comando instruye a Elasticsearch para enriquecer los resultados recuperados del índice de <code>airports</code> y realizar una unión <code>intersects</code> entre el campo <code>city_location</code> del índice original y el campo <code>city_boundary</code> del índice de <code>airport_city_boundaries</code> , que usamos en algunos ejemplos anteriores. Pero parte de esta información no es claramente visible en esta consulta. Lo que sí vemos es el nombre de una política de enriquecimiento <code>city_boundaries</code>, y la información que falta está encapsulada dentro de esa definición de política.</p>{
  "geo_match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>Aquí podemos ver que realizará una consulta <code>geo_match</code> (<code>intersects</code> es el valor predeterminado), el campo a emparejar es <code>city_boundary</code>, y los <code>enrich_fields</code> son los campos que queremos agregar al documento original. Uno de esos campos, el <code>region</code> , se usó como clave de agrupación para el comando <code>STATS</code> , algo que no podríamos hacer sin esta capacidad de 'unión izquierda'. Para más información sobre las pólizas de enriquecimiento, consulte la <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/enrich-setup.html">documentación de enriquecimiento</a>.</p><p>Los índices y políticas de enriquecimiento en Elasticsearch fueron diseñados originalmente para enriquecer datos en el momento del índice, empleando datos de otro índice de enriquecimiento preparado. En ES|QL, sin embargo, el comando <code>ENRICH</code> funciona en el momento de la consulta y no requiere el uso de pipelines de ingest. Esto lo hace efectivamente bastante similar a un <code>LEFT JOIN</code>SQL, excepto que no puedes unir dos índices cualquiera, solo un índice normal a la izquierda con un índice enrich especialmente preparado a la derecha.</p><p>En cualquier caso, ya sea para canalizaciones de ingesta o para su uso en ES|QL, es necesario realizar algunos pasos preparatorios para establecer el índice de enriquecimiento y la póliza. Ya importamos el índice de <code>airport_city_boundaries</code> arriba, pero este no se puede usar directamente como índice de enriquecimiento en el comando <code>ENRICH</code> . Primero necesitamos realizar dos pasos:</p><ul><li><p>Crea la política de enriquecimiento descrita anteriormente para definir el índice fuente, el campo en el índice fuente para coincidir y los campos que devolver una vez emparejados.</p></li><li><p>Ejecuta esta política para crear el índice enriquecido. Esto construirá un índice interno especial, leyendo el índice original en una estructura de datos más eficiente que se copia a través del clúster.</p></li></ul><p>La política de enriquecimiento puede crear usando el siguiente comando:</p>PUT /_enrich/policy/city_boundaries
{
  "match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>Y la política puede ejecutar usando el siguiente comando:</p>POST /_enrich/policy/city_boundaries/_execute<p>Ten en cuenta que si alguna vez cambias el contenido del índice de <code>airport_city_boundaries</code> , tendrás que volver a ejecutar esta política para ver los cambios reflejados en el índice de enriquecimiento. Ahora vamos a ejecutar el ES| originalConsulta QL de nuevo:</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>Esto devuelve las 5 regiones con más aeropuertos, junto con el centroide de todos los aeropuertos que tienen regiones coincidentes, y el rango en longitud de la representación WKT de los límites de la ciudad dentro de esas regiones:</p><p>centroide</p><p>Recuento</p><p>región</p><p>POINT (-12.139086859300733 31.024386116624648)</p><p>126</p><p>nulo</p><p>POINT (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Detroit</p><p>POINT (39.74537850357592 47.21613017376512)</p><p>3</p><p>городской округ Батайск</p><p>POINT (-156.80986787192523 20.476673701778054)</p><p>3</p><p>Hawai</p><p>POINT (-73.94515332765877 40.70366442203522)</p><p>3</p><p>Ciudad de Nueva York</p><p>POINT (-83.10398317873478 42.300230911932886)</p><p>3</p><p>Detroit</p><p>POINT (-76.66873019188643 24.306286952923983)</p><p>2</p><p>Nueva Providencia</p><p>POINT (-3.0252167768776417 51.39245774131268)</p><p>2</p><p>Cardiff</p><p>POINT (-115.40993484668434 32.73126147687435)</p><p>2</p><p>Municipio de Mexicali</p><p>POINT (41.790108773857355 50.302146775648)</p><p>2</p><p>Центральный район</p><p>POINT (-73.88902732171118 45.57078813901171)</p><p>2</p><p>Montréal</p><p>También puede que notes que la región más común era <code>null</code>. ¿Qué podría implicar esto? Recuerda que comparé este comando con un 'left join' en SQL, lo que significa que si no se encuentra ningún límite de ciudad coincidente para un aeropuerto, el aeropuerto sigue devolver pero con valores <code>null</code> para los campos del índice de <code>airport_city_boundaries</code> . Resulta que hubo 125 aeropuertos que no encontraron <code>city_boundary</code>coincidentes, y un aeropuerto con un  coincidente donde el campo de <code>region</code> estaba <code>null</code>. Esto llevó a un recuento de 126 aeropuertos sin <code>region</code> en los resultados. Si tu caso de uso requiere que todos los aeropuertos puedan coincidir con un límite de ciudad, eso requeriría buscar datos adicionales para cubrir los huecos. Sería necesario determinar dos cosas:</p><ul><li><p>qué registros en el índice de <code>airport_city_boundaries</code> no tienen campos <code>city_boundary</code></p></li><li><p>qué registros en el índice de <code>airports</code> no coinciden usando el comando <code>ENRICH</code> (es decir, no intersectar)</p></li></ul><h2>Usando ES|QL para datos geoespaciales en Kibana Maps</h2><p>Kibana agregó soporte para Spatial ES|QL en la aplicación de Mapas. Esto significa que ahora puedes usar ES|QL para buscar datos geoespaciales en Elasticsearch y visualizar los resultados en un mapa.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91922eb4ef43d290/6a16f7161949f737bfe7a7b5/bd78470bd8a4bc60f0db7006bd804b8fe87e2fea-1440x683.png" alt="Kibana Layers ES|QL" /><p>Hay una nueva opción de capa en el menú de agregar capas, llamada "ES|QL". Como todas las características geoespaciales descritas hasta ahora, esto está en "vista previa técnica". Seleccionar esta opción te permite agregar una capa al mapa basada en los resultados de un ES|Consulta QL. Por ejemplo, podrías agregar una capa al mapa que muestre todos los aeropuertos del mundo.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5185ef7461d7e81d/6a16f718839dfa1559dcfcb1/1dd28d3d0509f92d26b0bb5320a2925f7a54c5d9-1440x736.png" alt="Kibana ES|QL - Aeropuertos" /><p>O podrías agregar una capa que muestre los polígonos del índice de <code>airport_city_boundaries</code> , o mejor aún, ¿qué tal esa compleja consulta de <code>ENRICH</code> arriba que genera estadísticas sobre cuántos aeropuertos hay en cada región?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt51ee3543bb811d98/6a16f71a8b73cbbe63189df1/679a0a401faa613c7cedddd07c64f614ac2b7144-1440x727.png" alt="Kibana ES|QL - Estadísticas de la región" /><h2>¿Qué sigue ahora?</h2><p>El anterior blog de <a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">búsqueda geoespacial</a> se centraba en el uso de funciones como <code>ST_INTERSECTS</code> para realizar búsquedas, disponibles en Elasticsearch desde la versión 8.14. Y este blog te muestra cómo importar los datos que usamos para esas búsquedas. Sin embargo, Elasticsearch 8.15 venía con una función especialmente interesante: <code>ST_DISTANCE</code> que puede usar para realizar búsquedas espaciales eficientes, ¡y este será el tema del próximo blog!</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Craig Taverner]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>