<?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/cn/search-labs/blog/category/kibana</link>
    </image>
    <link>https://www.elastic.co/cn/search-labs/blog/category/kibana</link>
    <atom:link href="https://www.elastic.co/cn/search-labs/rss/category/kibana.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[cn]]></language>
    <lastBuildDate>Tue, 29 Sep 2026 04:52:06 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Kibana 仪表板 API：为每种面板类型提供稳定的 API 规范，正式发布前已经过 50 多个团队测试]]></title>
    <description><![CDATA[以代码形式管理 Kibana 仪表板：提交至 Git、跨环境发布，并借助 Kibana API 和 Terraform 实现部署自动化。]]></description>
    <content:encoded><![CDATA[<p><a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">Kibana 仪表板和可视化 API</a> 在 Elastic 9.5 中已可用于生产环境，所有订阅级别均可使用，并提供完全向后兼容性。以 JSON 格式定义仪表板，将其提交到 Git，然后使用持续集成和持续部署 (CI/CD) 管道、<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Terraform</a> 或您现有的任何工具，将其部署到不同环境。在 <a href="https://www.elastic.co/search-labs/blog/kibana-dashboards-as-code-terraform-api">9.4 技术预览期间</a>，50 多个团队测试了该 API，其中一些团队已将其用于生产环境。9.5 版本还新增了用于<a href="https://dashboardsapispec.kibana.dev/tags.html">标签</a>的终端（技术预览阶段）；<a href="https://dashboardsapispec.kibana.dev/markdowns.html">Markdown</a> 和<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links">链接</a>面板终端现已在 Elastic Cloud Serverless 中提供，并将在 9.6 中推出。</p><h2>Kibana 仪表板 API 中的向后兼容性意味着什么</h2><p>在技术预览期间，API 结构可能会随版本发生变化。[1]现在已不再如此。正式发布 (GA) 意味着：</p><ul><li><p><strong>完全向后兼容。</strong>新字段和面板类型将陆续添加，但现有字段和行为保持不变。未来如需引入任何破坏性变更，都会经过慎重评估，并且只会在新的 Elastic Stack 主版本中引入。</p></li><li><p><strong>可用于生产环境，并提供全面支持。</strong>该 API 享有 Elastic 提供的全面支持保障。您可以放心地在生产环境中使用该 API，进行自动化部署、跨环境发布以及以编程方式管理仪表板。</p></li></ul><h2>Kibana 新增用于标签、Markdown 和链接面板的 API 终端</h2><p>Elastic 9.5 还新增了一个用于<a href="https://dashboardsapispec.kibana.dev/tags.html"><strong>标签</strong></a>的独立终端，让您可以对仪表板进行分类和筛选。现在，您可以通过专用 CRUD 终端以编程方式管理这些标签，从而更轻松地跨环境大规模组织仪表板。	</p><p>新的 <a href="https://dashboardsapispec.kibana.dev/markdowns.html"><strong>Markdown</strong></a> 和<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"><strong>链接</strong></a>面板终端现已在 Serverless 中提供，并将在下一个 Elastic Stack 版本 (9.6) 中推出。</p><h2>Kibana 仪表板 API 支持哪些面板类型？</h2><p>仪表板 API 支持 9.5 中的所有<em>按值</em>面板（即直接在仪表板中定义的面板，而非保存以供重复使用的库面板）。每种受支持的面板类型都有一个类型化且经过验证的架构。</p><p><strong>面板类型</strong></p><p><strong>状态</strong></p><p>XY 图表</p><p>支持</p><p>指标</p><p>支持</p><p>饼图</p><p>支持</p><p>仪表盘图</p><p>支持</p><p>热图</p><p>支持</p><p>数据表</p><p>支持</p><p>树状图</p><p>支持</p><p>Discover 会话</p><p>支持</p><p>控件</p><p>支持</p><p>Markdown</p><p>支持</p><p>链接</p><p>支持</p><p>ML 面板</p><p>支持</p><p>Observability 面板</p><p>支持</p><p>Maps</p><p>即将推出</p><p>Vega</p><p>即将推出</p><h2>如何以代码形式管理 Kibana 仪表板</h2><p>仪表板 API 支持一套完整的以代码形式管理仪表板的工作流：将仪表板导出为简洁、可进行差异比较的 JSON，将其提交到 Git 并作为唯一可信来源，在拉取请求中审查更改，然后将同一定义部署到开发、预发布和生产环境。一旦以代码形式管理仪表板，就应将 Git 作为唯一可信来源：下次部署会覆盖直接在 UI 中所做的更改。</p><p>在空间、集群或阶段之间迁移仪表板时，主要挑战在于仪表板会按 ID 引用 Data view、库可视化等对象。由于这些 ID 是自动生成的，且不同环境中的 ID 各不相同，因此从一个环境导出的仪表板可能会引用另一个环境中不存在的对象。有三种方法可以处理这个问题，以下按自动化程度从高到低列出：</p><ul><li><p><strong>使用 Terraform。</strong><a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Elastic Stack Terraform 提供程序</a>会跟踪每项资源，并自动映射各环境中的 ID，因此当您将仪表板从开发环境发布到生产环境时，引用可保持一致。</p></li><li><p><strong>定义按值的 </strong><a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"><strong>Elasticsearch 查询语言 (ES|QL) 面板</strong></a><strong>。</strong>构建面板时，可移植性最高的方法是在仪表板中直接使用 ES|QL 定义其可视化。<a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql-kibana">ES|QL</a> 查询会从查询中指定的索引读取数据，因此面板不会包含对 Data view 或库对象的外部引用。这样便可获得一个完全自包含、可移植的仪表板。</p></li><li><p><strong>分配一致的 ID。</strong>如果您引用 Data view、库可视化等已保存对象，请使用 PUT (upsert) 并指定 ID 来创建这些对象，而不要使用会自动生成 ID 的 POST。使用易读的 ID（例如 logs-prod），这样更便于在不同环境中重复使用和识别。</p></li></ul><p><a href="https://www.elastic.co/docs/explore-analyze/dashboards/manage-dashboards-as-code#dashboards-as-code-portability">有关这些可移植性模式以及完整的以代码形式管理仪表板的工作流的详细介绍，请参阅“以代码形式管理仪表板”文档。</a></p><h3>使用 PUT 通过仪表板 API 创建 Kibana 仪表板</h3><p>下面是一个简单示例：使用 PUT 而非 POST 创建包含指标面板的仪表板，并以仪表板名称 (service-health-overview) 作为自定义 ID。同样的逻辑也适用于创建保存到库中的独立可视化。</p>PUT kbn:/api/dashboards/service-health-overview
{
  "title": "服务运行状况概览",
  "description": "通过 API 管理的关键服务指标",
  "tags": [
    "production",
    "sre-team"
  ],
  "panels": [
    {
      "type": "vis",
      "grid": {
        "x": 0,
        "y": 0,
        "w": 12,
        "h": 8
      },
      "config": {
        "title": "错误率 (5xx)",
        "type": "metric",
        "data_source": {
          "type": "esql",
          "query": "FROM logs-* | WHERE http.response.status_code &gt;= 500 | STATS error_rate=count(*) BY host.name"
        },
        "metrics": [
          {
            "type": "primary",
            "column": "count"
          }
        ]
      }
    }
  ]
}<h2>Kibana 仪表板 API 路线图：Maps、Vega 和独立终端</h2><p>我们正在积极扩展 API 的功能范围。下一步将支持 Maps 和 Vega 面板，并为其添加类型化架构。我们还在为 Discover 会话（除了现有的仪表板面板支持之外）、Vega、Maps 和注释构建独立的 CRUD 终端，使其与仪表板生命周期解耦。</p><p>有关完整的架构定义，请参阅<a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">仪表板 API 文档</a>。对于 Terraform 用户，<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Elastic Stack Terraform 提供程序</a>支持正式发布 (GA) 的仪表板 API。</p><h2>注意</h2><ol><li><p>核心终端自技术预览以来未发生变化。如果您基于 9.4 构建了集成，这些集成在 9.5 中也可正常运行。仅有两项轻微的破坏性变更，分别影响仪表板列表和时长单位格式，详见<a href="https://www.elastic.co/docs/release-notes/kibana/breaking-changes">此处</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[开发者体验]]></category>
    <category><![CDATA[集成]]></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[不到一分钟即可提示进入仪表板，价格便宜 5 倍：Kibana 中的 AI 仪表板和自定义 Vega-Lite 图表]]></title>
    <description><![CDATA[用自然语言描述您的指标，Kibana 的 AI 聊天功能即可生成 ES|QL 支持的仪表板和 Vega-Lite 图表，从散点图到条件格式和自定义工具提示，应有尽有。]]></description>
    <content:encoded><![CDATA[<p>Kibana 的<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat"> AI 聊天功能</a>现在可以在不到一分钟的时间内根据自然提示构建完整的 <a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">Elasticsearch 查询语言 (ES|QL) 支持的</a>仪表板。在 Elastic 9.5 中，这转向了正式可用性 (GA)（<a href="https://www.elastic.co/cn/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana">9.4 的技术预览版</a>），错误恢复可重试失败的查询，通过分层模型路由和交互式筛选控件将 ES|QL 生成成本降低 5 倍。此版本还增加了通过自然语言创建 <a href="https://www.elastic.co/docs/explore-analyze/visualize/custom-visualizations-with-vega">Vega-Lite</a> 图表的功能，包括散点图、箱形图、条件格式和通常需要在 JSON 中手动编码的自定义工具提示。</p><h2>Kibana AI 仪表板创建的新增功能</h2><p><strong>功能</strong></p><p><strong>技术预览版 (9.4)</strong></p><p><strong>GA (9.5)</strong></p><p>错误处理能力</p><p>无法重试失败的 ES|QL 查询</p><p>自动重试最多三次，并进行查询检查和调整</p><p>ES|QL 生成成本</p><p>所有查询均通过主模型路由</p><p>分层模型路由，价格最多可降低 5 倍</p><p>时间范围</p><p>固定默认窗口</p><p>基于数据时间分布的自动选择</p><p>筛选控件</p><p>不支持</p><p>自动为相关性最高的字段添加</p><p>Vega-Lite 图表</p><p>不支持</p><p>自然语言创建，包括散点图、箱形图、条件格式、自定义工具提示</p><p>图表编辑</p><p>不支持</p><p>通过自然语言编辑现有的 Vega-Lite 面板</p><h3>AI 仪表板生成的自动错误恢复</h3><p>在技术预览版中，代理不会重试失败的 ES|QL 查询。在 9.5 中，它检测查询错误并重试最多三次，检查每个错误并调整查询，然后再放弃。实际上，这消除了大部分空面板问题，并生成首次尝试即可正确渲染的仪表板。</p><h3>为什么在 Elastic 9.5 中创建 AI 仪表板更便宜？</h3><p>并非仪表板生成过程中的每一步都需要同等程度的推理。在 9.5 中，ES|QL 生成默认使用较轻量级模型，仅在需要时才回退到主模型。如果您的<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/connectors">连接器</a>使用 Anthropic 的 Claude Opus 4.8，这意味着所有面板的 ES|QL 生成成本将降低 5 倍。</p><h3>根据您的数据自动选择时间范围</h3><p>仪表板只有在显示正确的数据窗口时才有用。现在，代理会应用改进的逻辑来选择适配查询数据的合理时间范围，除非用户要求特定的时间范围。它会考虑数据的时间分布并进行相应的调整，无论是实时事件的最后一小时，还是趋势分析的过去 90 天，而不是默认使用固定的时间窗口。</p><h3>AI 生成的仪表板上的自动筛选控件</h3><p>仪表板创建现在支持控件；也就是说，交互式筛选器允许查看者按字段值缩小仪表板范围，而无需编辑底层查询。生成仪表板时，代理会自动在顶部添加控件，用于筛选最相关的字段。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a5520e66ae76001/6a719a218a155220ed6498e7/image3.png" alt="Kibana AI chat generating an ES|QL-backed host metrics dashboard with automatic filter controls in 71 seconds" /><h2>使用自然语言创建 Vega-Lite 图表：图表类型和默认之外的格式</h2><p><a href="https://vega.github.io/vega/">Vega</a> 和 <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> 支持 Kibana 中的各种图表类型和自定义功能。使用 9.5，您可以直接用纯语言构建它们，而无需自己编写代码。</p><h3>散点图、箱形图以及更多 Vega-Lite 图表类型</h3><p>散点图、箱形图、分面小倍数、气泡图和组成图（类似将直方图与热图结合）等多种图表均由 <a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a> 支持。类似“<em>向我显示响应时间与请求大小的散点图，按服务名称着色</em>”这样的提示会生成一个具有正确数据映射的 Vega-Lite 面板。他们使用 Kibana 的默认调色板与仪表板的其余部分融为一体。</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>标准图表上的条件格式、自定义工具提示和标签</h3><p>即使对于仪表板中已有的图表类型（如柱形图、折线图或面积图），有时您也需要比默认功能提供的更多控制。Vega-Lite 通过聊天功能填补了这一空白。一些示例包括：</p><ul><li><p><strong>条件颜色格式：</strong>以不同的颜色标记高于阈值的数据点；例如，当某些指标的峰值超过您的服务级别目标 (SLO) 时，将折线或柱状图中的数据点标记为红色。您可以向代理提出类似的问题：<em>将折线图中所有高于 500 毫秒的点都变成红色。</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>自定义标记和标签：</strong>向数据点添加表情符号、符号或行内文本标签，使状态指示器一目了然。</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>自定义工具提示：</strong>使用不属于图表轴的其他指标、上下文或计算值来丰富悬停状态。可以提出类似这样的问题：<em>添加一个工具提示，显示总记录数和每条柱状图的百分比。</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>这也适用于编辑现有的 Vega 图表。如果您的 Vega-Lite 面板需要进行一些调整，例如更改颜色标度、调整坐标轴或切换标记类型，请在聊天中描述更改，而不是深入研究 JSON 代码。</p><h2>我们如何在 Kibana 中构建自然语言 Vega-Lite 生成</h2><p>从句子生成 Vega-Lite 图表并不是一次性 <em>向模型请求 JSON</em> 提示。我们构建了一个小型的代理管道，将自然语言意图转化为经过验证、数据支持的图表。</p><p>当收到请求时，代理首先确定 Vega-Lite 是否合适。对于 Vega-Lite 请求，它将可视化建立在针对 Elasticsearch 的真实 ES|QL 查询之上，然后使用模型生成 Vega-Lite 代码。在渲染之前，结果会经过一个规范化层，纠正模式并绑定规范查询。它还应用了渲染安全转换。 </p><p>有几个设计选择使该工作流可靠：</p><ul><li><p><strong>类型化工具调用</strong>：图表创建是一个结构化的工具调用，而不是将自由格式的 Vega-Lite 粘贴到对话中。</p></li><li><p><strong>受限生成</strong>：模型在定义的模式内生成 Vega-Lite 代码，使输出更可预测且易于验证。</p></li><li><p><strong>精选示例：</strong>结构模式（如分面、分层标记和热图）可在不复制底层数据的情况下提供指导。</p></li><li><p><strong>执行和验证循环</strong>：在图表创作之前执行查询，验证失败会触发 ES|QL 生成的纠正性重试。</p></li></ul><h2>尝试在 Kibana 中创建 AI 仪表板和 Vega-Lite 图表</h2><p>要尝试使用自然语言仪表板创建和 Vega-Lite 图表，请升级到 <strong>Elastic 9.5</strong>（或<a href="https://cloud.elastic.co/registration">开始免费试用</a>），然后在 Kibana 中打开<strong>聊天</strong>。然后要求它根据您的数据构建仪表板。对于 Vega-Lite，您可以尝试请求创建想要但从未创建过的图表类型，例如散点图或气泡图。如果结果不完全准确，请告诉代理需要修改的内容。它会与您一起迭代。</p><p>这需要企业许可证。<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">开始使用</a>。</p><p><em>本文中描述的任何功能或功能性的发布和时间均由 Elastic 自行决定。当前尚未发布的任何功能或功能性可能无法按时提供或根本无法提供。</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 人，零人工决策：依托 Elasticsearch 实现智能体灾害应急响应]]></title>
    <description><![CDATA[了解当飓风来袭时，Kibana 检测规则、工作流和 AI 智能体如何自动安排转移七处设施中的 137,000 名军事人员，全程无需人工调度。]]></description>
    <content:encoded><![CDATA[<p>Elastic 刚刚协调完成了七处设施中 137,000 名军事人员的自动化疏散，全程无需人工干预。当 4 级飓风袭击汉普顿锚地海岸线时，Elasticsearch 的地理空间数据富化功能在索引数据入库时便已识别出受影响区域内的每一处设施。一条 Kibana 检测规则被触发。工作流启动了 AI 智能体对话。智能体根据容量、距离和分支兼容性进行了推理，然后一次性发送了 16 条疏散和接收通知。从接收原始 GDACS 事件到生成协同动作，全程自动完成。</p><p>每年，自然灾害都迫使应急管理人员、军事指挥官和公共安全官员在紧迫的时间内做出关乎重大利益的高风险决策。在传统模式下，这些决策依赖于电话联络网、电子表格以及散落分布在数十人脑海中的机构知识。单单是多头协调带来的沟通成本就会白白消耗掉极其宝贵的黄金救援时间。</p><p>本文旨在展示 Elastic 如何驱动一套具备敏捷响应能力的智能体灾害应急协调系统，该系统能够检测威胁、推理后勤逻辑并自动采取行动。为了具体说明，我们构建了一个模拟：一场虚构的 4 级飓风威胁着汉普顿锚地海岸线，触发了七个军事设施中超过 137,000 多名人员的自动转移。</p><p><strong>免责声明：</strong><strong>这是完全为演示目的而构建的虚构场景。</strong>飓风 ELARA-26 并不存在。设施位置基于真实的公开地理数据（美国国防部 [DoD] 军事设施、靶场和训练区 [MIRTA] 数据集），但所有业务运行数据（如人员数量、安置容量、资产、联系电子邮件以及任务概况）完全纯属虚构。本演示中的任何内容均不反映实际的战备状态、作战能力或行动规程。</p><h2>为什么自动化灾害应急响应需要地理空间与智能体协调</h2><p>当自然灾害威胁到关键基础设施时，协调方面的挑战会立即显现：</p><ul><li><p>哪些设施位于受影响区域内？</p></li><li><p>需要转移多少人员？</p></li><li><p>人员可以转移到哪里，那里的设施是否具有容载能力？</p></li><li><p>目前需要通知哪些人？</p></li></ul><p>这些问题刻不容缓，获取答案也不能有片刻拖延。</p><h2>部署管道：准备工作和设置</h2><p>请按照<a href="https://github.com/tehbooom/elastic_natural_disaster/blob/main/README.md">此处示例存储库</a>中的说明，通过 <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> 部署带有 Elastic 推理服务 (EIS) 的本地 Elastic 集群。</p><h2>Elasticsearch 智能体灾害响应管道如何运作</h2><p>该管道包含七个端到端协同工作层：</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>数据摄取：</strong>全球灾害警报与协调系统 (GDACS) 灾害事件发送至 Elasticsearch</p></li><li><p><strong>摄取管道</strong>：GeoJSON 被摄取并规范化为 Elastic Common Schema (ECS)。</p></li><li><p><strong>地理空间富化：</strong>事件的受影响区域多边形与已建索引的军事设施边界进行匹配。</p></li><li><p><strong>警报通知：</strong>当灾害与任何设施交叉重合时，Kibana 检测规则将触发。</p></li><li><p><strong>工作流自动化：</strong>警报会触发一个 Kibana 工作流，从而启动 AI 智能体对话。</p></li><li><p><strong>AI 推理：</strong>智能体对受影响的设施、其资产以及最近的支持设施进行推理，以确定所有资产和人员的转移方案。</p></li><li><p><strong>电子邮件通知</strong>：智能体会针对进出人员和/或资产向所有收件人发送电子邮件。</p></li></ol><p>让我们逐层进行分析。</p><h2>第 1 步：为具有地理边界的军事设施编制索引</h2><p>其基础是来自 <a href="https://source.coop/seerai/hifld/military-installations-ranges-and-training-areas-mirta-dod-sites---boundaries">source.coop/seerai/hifld</a> 的 DoD MIRTA 数据集。该数据集为每个设施提供 Point 类型的 geo_shape；即质心坐标，而非完整的边界多边形。</p><p>在 mitra-facilities 索引中，每个设施的文档除了包含 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>正是这种包含丰富信息的索引，使 AI 智能体能够做出明智的分配决策——它不仅能识别“附近的基地”，还能筛选出那些具备可用安置容量、兼容任务类型以及能够接收迁入资产的后勤保障能力的基地。</p><h2>第 2 步：采集和规范化 GDACS 事件</h2><p>GDACS 发布关于地震、热带气旋、洪水、野火、火山和干旱的实时 GeoJSON 数据。我们使用自定义采集管道将此数据源采集到数据流 (logs-gdacs.events-*)，并将原始 GeoJSON 规范化为 ECS 字段。</p><p>GDACS 采集管道有几个值得注意的功能：</p><p><strong>几何提取：</strong>质心作为 geo_point 存储以用于地图显示，而影响范围多边形则作为 geo_shape 存储在 gdacs.affected_area 中，该字段后续将用于相交查询。</p><p><strong>严重性归一化：</strong>每种灾害类型都有不同的严重性等级。例如热带气旋按风速 (km/h) 衡量；地震则按里氏震级衡量。管道将它们全部映射到一个归一化的 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>归一化后的严重性分数随后会映射为相应的 severity_level 标签（低、中、高、极高），该标签用于检测规则中的警报严重性映射。</p><p><strong>ECS 对齐：</strong>event.kind 设为 alert，event.category 设为 threat，时间戳映射到 event.start/event.end，并使用基于指纹的稳定 _id 实现去重。</p><h2>第 3 步：地理空间信息富化：在索引时查找受影响的设施</h2><p>Elasticsearch 的 geo_match 富化策略会在索引阶段将灾害影响区域多边形与各个设施边界进行匹配，无需在查询时执行连接操作。我们无需在搜索时进行查询，而是在采集管道中利用<strong>富化处理器</strong>，<em>在文档被索引时</em>将灾害影响区域多边形与各个设施的边界进行匹配。</p><p>该富化策略属于一种 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>该处理器在采集管道末端运行：</p>{
  "enrich": {
    "policy_name": "facilities-geo",
    "field": "gdacs.affected_area",
    "target_field": "affected_facilities",
    "shape_relation": "INTERSECTS",
    "max_matches": 128
  }
}<p>INTERSECTS 可捕获边界与灾害影响区域多边形相接或重叠的任何设施，包括部分相交的情况。因此，每个 GDACS 事件文档都会存储一个 affected_facilities 嵌套数组，该数组会准确告诉我们哪些设施位于影响区域内。这个过程无需进行连接查询。</p><h2>第 4 步：检测规则：针对设施受影响情况发出警报</h2><p>Kibana 检测规则会监测 logs-gdacs.events-* 数据流，当某个 GDACS 事件包含至少一个受影响设施的信息时，该规则即触发警报：</p>查询条件：affected_facilities: { entity_name: * }<p>该规则按小时运行（覆盖从 now-1h 到 now 的时间窗口），并使用动态严重性映射机制；由采集管道计算得出的 gdacs.severity_level 字段会自动决定警报的严重性。</p><p>此外，警报严重性还会通过字段映射影响风险评分：</p>"risk_score_mapping": [
  {
    "field": "gdacs.normalized_severity",
    "operator": "equals",
    "value": ""
  }
]<p>规则触发时，会将完整的警报上下文（包括包含设施名称、类型和位置的富化 affected_facilities 数组）向下游传递给 Kibana 工作流。</p><h2>第 5 步：工作流自动化：连接警报与智能体</h2><p>Kibana 工作流处理从检测到响应的交接过程。自然灾害响应工作流由警报触发：</p>triggers:
  - type: alert
steps:
  - name: start_convo
    type: kibana.request
    with:
      method: "POST"
      path: "/api/agent_builder/converse"
      body:
        agent_id: "mitra.response"
        input: "New Natural Disaster Alert: {{ event.alerts | json }}"<p>完整的警报负载信息（灾害类型、严重性、受影响区域以及受影响设施列表）会作为初始上下文转发给 AI 智能体，随后由智能体接手后续处理。</p><h2>第6 步：AI 智能体：从数据到协同行动</h2><p>mitra.response 智能体接收完整的警报负载信息，并在单次智能体循环中评估影响范围、查找接收设施、调配人员，以及发送疏散和接收通知，整个过程无需人工干预。</p><p>智能体有两个可用工具：</p><ul><li><p><strong>mitra.nearest_facility</strong>使用 geo_shape 查询来检索 mitra-facilities 索引，并按距指定坐标的距离进行排序，返回最多 50 个具有可用容量的周边活跃设施；</p></li><li><p><strong>mitra.send_email</strong> 遍历设施对象的 JSON 数组并发送格式化的疏散或接收通知。</p></li></ul><p>智能体的指令集定义了清晰的工作流：</p><ol><li><p><strong>评估状况。</strong>解析警报，识别受影响的设施，并确定灾难范围。</p></li><li><p><strong>盘点需要迁移的人员与资产。</strong>统计各设施的人员数量、关键资产及安置需求。</p></li><li><p><strong>查找目标设施。</strong>针对每个受影响设施调用 mitra.nearest_facility，并排除仍处于危险区域的设施。</p></li><li><p><strong>制定分配决策。</strong>权衡单一设施与多设施安置方案，考量所属分支兼容性、安置容量及资产支持能力。</p></li><li><p><strong>发送协调电子邮件。</strong>向源设施发送疏散指令，向接收设施发送接收通知。</p></li><li><p><strong>生成摘要报告。</strong>生成简要报告，汇总受影响设施、总人数、转移资产、目标设施及相关注意事项，并发送至聊天中以供审查。</p></li></ol><p>智能体的分配逻辑遵循现实世界的约束条件：不超过安置容量，尽可能优先进行同分支转移，使用联合基地应对多分支溢出需求，并优先考虑距离以尽量缩短运输时间。</p><h3>最近设施工具</h3><p>底层工作流查询使用带有圆形过滤器的 geo_shape 和 _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>可用容量是在查询时通过脚本字段计算得出的，该字段计算容纳容量减去当前人员数量。智能体利用该数据在各目的地之间分配人员，同时确保不超过容量限制。</p><h2>飓风 ELARA-26：137,000 名人员的端到端智能体协同</h2><p>飓风 ELARA-26 是一场 4 级风暴（最大风速 213 公里/小时），预计将在弗吉尼亚州的汉普顿锚地区域登陆。当系统接收到 GDACS 事件数据时，受影响区域的多边形与该地区的七个主要军事设施发生重叠。检测规则随之触发。工作流随即启动了智能体对话。</p><p>在单次智能体循环中，智能体执行了以下操作：</p><ul><li><p>识别出受影响区域内的七处设施，共涉及 137,372 名人员。</p></li><li><p>调用 mitra.nearest_facility 查找风暴路径之外的接收设施。</p></li><li><p>根据可用安置容量和距离，将人员分配到九个接收设施。</p></li><li><p>生成并向所有七个受影响的设施发送疏散命令。</p></li><li><p>生成并向所有九个接收设施发送接收通知。</p></li><li><p>生成完整的协调摘要（如下所示）：</p></li></ul><p><strong>已疏散设施：</strong></p><p>设施</p><p>人员</p><p>诺福克海军基地</p><p>50,000</p><p>小河堡-故事堡联合远征基地</p><p>18,000</p><p>欧西安纳海军航空站</p><p>15,355</p><p>欧西安纳海军航空站丹姆奈克分部</p><p>17,509</p><p>弗吉尼亚州国民警卫队彭德尔顿营基地</p><p>9,707</p><p>兰利-尤斯蒂斯联合基地</p><p>15,000</p><p>约克敦海军武器站</p><p>11,801</p><p><strong>接收设施：</strong></p><p>设施</p><p>距离</p><p>迁入人员</p><p>格雷格-亚当斯堡</p><p>97 公里</p><p>~40,000</p><p>匡提科海军陆战队基地</p><p>148 公里</p><p>~30,000</p><p>印第安黑德海军支援设施</p><p>151 公里</p><p>~30,000</p><p>安德鲁斯联合基地</p><p>180 公里</p><p>~30,000</p><p>帕图森特河海军航空站</p><p>141 公里</p><p>~10,000</p><p>国民警卫队巴特纳军营训练中心</p><p>174 公里</p><p>~5,000</p><p>国民警卫队贝瑟尼海滩训练基地</p><p>209 公里</p><p>~4,707</p><p>里瓦娜基地</p><p>140 公里</p><p>~7,500</p><p>国防通用物资供应中心</p><p>22 公里</p><p>~6,000</p><p>转移的资产包括运输车辆、直升机、巡逻艇、医疗单元、工程车辆、发电机、拖挂式水罐车、避难所套件以及通信系统。</p><h3>自动化电子邮件通知</h3><p>智能体确定分配方案后，便调用 mitra.send_email 并一次性发送了 16 封电子邮件；即向所有七个受影响设施发送疏散指令，向所有九个接收设施发送接收通知。每封邮件均包含目标设施、迁入人员数量、待转移资产以及协调联系人。原本需要耗费数小时通过电话逐级通知才能完成的工作，在智能体完成推理的那一刻便已自动处理完毕。</p><h3>借助 RAG 和策略锚定增强智能体灾害应急响应</h3><p>此演示纯粹基于结构化数据构建，例如容量数值、距离和运行状态。Elastic 的语义搜索和检索增强生成 (RAG) 功能可以通过两项新增功能使智能体变得更加智能：</p><p><strong>历史响应检索：</strong>将以往的行动后报告、联邦紧急事务管理局 (FEMA) 事件摘要以及灾害响应记录作为向量嵌入编入索引。当新事件触发时，智能体能够从语义层面检索类似事件的处置方式，从而利用积累的机构经验（而非仅仅依赖容量计算）来指导分配决策。</p><p><strong>策略与条令依据：</strong>索引 DoD 应急管理指令、设施业务连续性计划以及指挥官指导。智能体可以检索并引用指导响应的实际策略，确保每项决策都基于条令而非推断。</p><p>这两项功能都遵循相同的 Elastic 原生方法：推理管道会在索引时生成嵌入向量，并向智能体提供语义搜索工具。协调管道保持不变，智能体则变得更智能。</p><h2>为什么 Elasticsearch 是公共部门智能体响应的理想平台</h2><p>Elasticsearch 不是聊天机器人，也不是仪表板。它是具备响应能力的智能体工作流系统：它能够自主检测威胁、分析复杂的物流难题，并协调 137,000 人的转移工作，全程无需人工干预。之所以能实现这样的结果，是因为它所依赖的每项功能都集中在一个统一的平台中。</p><p>Elasticsearch 的地理空间支持功能（geo_point、geo_shape、富化策略以及基于距离的排序）能够处理空间推理，使大规模的相交检测和设施查询成为可能。语义搜索和向量嵌入技术确保了智能体的决策基于事实，即 AI 的推理建立在实际数据之上，而非凭空产生的“幻觉”假设。Kibana 的检测引擎、工作流、Agent Builder 以及 Agent Builder 工具将这一切无缝连接成一条管道，实现从原始事件到协同行动的完整流程，且无需任何外部粘合代码。</p><p>没有其他平台能像 Elastic 这样将这一切整合在一起。将实时索引、地理空间精度、语义检索和智能体编排全部集于单一堆栈中，并内置企业级安全和可观测性，这正是 Elastic 与其他工具的区别所在——那些工具或许在单一领域表现出色，但需要用户自行拼凑其余功能。</p><h2>面向应急管理、消防、执法和公共卫生的智能体地理空间响应</h2><p>凡是人员、设施和实时事件发生交集的场景，都可以应用同样的架构。具体的数据会发生变化，但处理流程不变。</p><p><strong>应急管理：</strong>FEMA 和各州应急管理部门可以将避难所位置、集结区域和脆弱人群分布与美国国家气象局 (NWS) 发布的恶劣天气影响区域多边形进行对照映射，从而在风暴登陆前自动触发资源预置。</p><p><strong>消防与紧急医疗服务：</strong>消防部门可以将救援力量位置和响应辖区叠加到野火蔓延范围或建筑火灾密集区，自动将互助请求指派给配备合适设备且距离最近的可用救援力量。</p><p><strong>执法部门：</strong>执法机构可以将正在发生的事件位置与学校区域、关键基础设施和警员位置相关联，从而触发基于地理位置的封锁通知或资源调度，无需等待人工分类。</p><p><strong>公立学校安全：</strong>学校区域可以监测校园边界内的实时威胁源。当威胁越过学校边界时，智能体立即通知管理部门、启动封锁通讯并协调执法部门响应，这一切均可以在调度员接听电话之前完成。</p><p><strong>公共卫生：</strong>卫生部门可以将疾病监测数据或环境危险区域与诊所位置、人口密度图层和物资仓库库存进行比对，从而将资源调配至最需要的地方。</p><p>领域</p><p>用例</p><p>Elastic 功能</p><p>应急管理</p><p>将避难所位置与 NWS 发布的恶劣天气影响区域多边形进行匹配</p><p>geo_shape 富化 + Kibana 工作流</p><p>消防与紧急医疗服务</p><p>将救援力量位置与野火边界进行叠加</p><p>地理空间路径规划 + 最近设施查询</p><p>执法</p><p>将事件与学校区域和警员位置关联</p><p>基于地理位置的警报规则 + 智能体调度</p><p>公立学校安全</p><p>针对校园边界监测威胁源</p><p>检测规则 + 自动通知</p><p>公共卫生</p><p>将危险区域与诊所位置和物资仓库进行匹配</p><p>语义搜索 + 地理空间富化</p><p>尽管不同场景中的数据各不相同，但其底层模式——即数据采集、索引时富化、检测交集、触发智能体响应以及执行操作——是一样的。Elastic 为公共部门组织提供了一个平台，使其能够一次构建，多处适配。</p><p><em>本文中描述的任何功能或功能性的发布和时间均由 Elastic 自行决定。当前尚未发布的任何功能或功能性可能无法按时提供或根本无法提供。</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]]></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[Kibana 中的 AI Chat 现已原生支持呈现仪表板]]></title>
    <description><![CDATA[Kibana 中的 Elastic AI Chat 现在可根据自然语言构建仪表板，将可视化内容和分析保留在同一对话线程中，并支持将其保存为可重复使用的 Kibana 对象。]]></description>
    <content:encoded><![CDATA[<p>Kibana 中的 <a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Elastic AI Chat</a> 现在可以将自然语言问题转换为基于 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a> 的<strong>可视化内容</strong>或完整<strong>仪表板</strong>，所有操作均可直接在<strong>对话</strong>中完成。您可以描述所需指标，边调查边细化，并在分析脉络清晰成形后保存。在您准备保存之前，所有内容都会<strong>保留在对话中</strong>；<strong>保存</strong>后，它们会成为正式的 Kibana 对象，您的团队可以打开、编辑并重复使用。在 Elastic 9.4 中作为技术预览版提供</p><p>该智能体可以从零开始构建仪表板，也可以与您已有的内容配合使用。查看仪表板时打开 AI Chat 侧边栏，它就会<strong>自动</strong><strong>关联</strong>当前仪表板。您可以询问某项指标为何激增，按区域对其进行细分，或添加对比面板。您现有的仪表板会成为分析<strong>起点</strong>，而不只是最终产物。</p><h2>幕后解析：我们如何在 AI Chat 中构建仪表板</h2><p>我们通过<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-skills">“技能”</a>让智能体学会特定任务；技能是说明如何处理特定问题的结构化描述。但是，构建仪表板技能意味着要教 LLM 生成有效的 Kibana 仪表板，而旧版 Saved Object API 使这一过程变得非常棘手：JSON 深度嵌套、版本之间存在细微差异，引用关系也很脆弱。我们需要一种全新的方法</p><h3>专为以编程方式构建仪表板而打造的 API</h3><p>新的<a href="https://dashboardsapispec.kibana.dev/dashboards.html">仪表板 API</a> 正是为这种场景而构建的。它没有暴露原始内部状态，而是为每种面板类型提供类型化、验证过的模式。API 负责在干净的外部结构与 Kibana 内部表示之间进行转换，因此代理可以专注于仪表板应包含的内容，而不是如何格式化它。</p><h3>一个技能、一个工具、多种操作</h3><p><code>dashboard-management</code> 技能提供一个 <code>manage_dashboard</code> 工具，该工具接受有序的<strong>操作</strong>数组。每项操作都是一个独立动作：设置元数据、添加 Markdown 面板、根据自然语言创建基于 ES|QL 的可视化内容、编辑现有面板、将面板分组到可折叠分区，或重新定位网格中的项目。</p><p>智能体可以通过一次调用描述整个仪表板：标题、描述、分区，以及其中的每个面板：</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>操作按顺序执行，因此后面的步骤可以参考前面的步骤并在此基础上进行扩展。这种设计使对话始终集中在意图上，而不是实施细节上。</p><h3>可视化管道：从自然语言到 ES|QL 再到可视化</h3><p></p><p>当您请求生成仪表板时，智能体会探查您的数据，包括索引、字段映射和类型，然后规划可视化内容并调用 manage_dashboard。</p><p>每个面板都会经过各自的流水线：图表类型选择、ES|QL 生成、可视化配置和验证。我们将这一步从主智能体线程中隔离出来；每个面板的可视化构建都需要多次模型调用，如果混入主上下文，就会撑大上下文窗口，并干扰推理过程。</p><p>在 manage_dashboard 内部，所有面板会并发构建，然后按顺序重新组装。最终生成的是一个包含内嵌面板的完整仪表板，不会产生孤立的可视化内容，也不会出现同步问题。</p><h3>为何将可视化创建纳入仪表板工具中</h3><p>我们最初的方法是使用一个独立的 create_visualization 工具：每个面板调用一次，然后将每个附件移交给仪表板工具处理。这种方法确实可行，但每个可视化内容都需要单独的工具调用、独立的生命周期，以及明确的移交过程。更糟糕的是，在对话中编辑可视化内容并不会同步更新仪表板面板，容易让用户感到困惑。</p><p>我们将可视化创建直接纳入 manage_dashboard。同样的并行工作流仍会运行，但面板会直接组装到仪表板结构中，无需中间附件。调用更少，没有同步问题，生命周期也更统一。</p><p>独立可视化内容仍然可用；您可以通过附件引用将现有图表添加到仪表板中。但如果要从头开始构建，内联创建是更简洁的路径</p><h2>面向安全团队</h2><p>SOC 分析师和检测工程师在调查中途无法承受来回切换到仪表板编辑器的时间成本。借助 AI Chat，您可以按规则类型、主机或 MITRE 战术统计告警量，并在约一分钟内在对话线程中看到结果。随着威胁搜寻推进，您可以在不中断上下文的情况下逐步添加面板，例如进程执行异常、网络连接和时间线对比。</p><p>完成后即可保存。该仪表板可作为事件后复盘的参考、下一位分析师的起点，或每周威胁简报的基础，无需重复说明。</p><p>阅读这篇<a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">博客文章</a>，详细了解安全团队如何使用仪表板创建功能以及近期推出的其他 AI Chat 功能。</p><h2>面向可观测性和站点可靠性工程师 (SRE)</h2><p>当服务在凌晨 2 点出现性能下降时，您没有时间从头开始构建仪表板。借助 AI Chat，SRE 可以描述所需指标（按服务划分的 p99 延迟、与部署事件相关的错误率、过去一小时的 Pod 重启次数），并在约一分钟内在调查对话线程中获得完整仪表板。随着排查思路逐渐清晰，智能体可以逐步细化仪表板：添加面板、更改时间窗口，或按区域细分。</p><p>保存仪表板后，它会立即在战情室中供所有加入事件处理会议的成员使用，并保持相同的面板和分析框架。事件结束后，它会成为事件后复盘的基础。</p><h2>未来发展</h2><p>我们正在推进 token 优化、更丰富的全屏交互、更广泛的面板支持，并持续提升质量。技术预览阶段正是确定开发优先事项的合适时机；如果有任何缺失，请通过顶部菜单中的<strong>“提交反馈”</strong>图标告知我们。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6783ac3a6540ba5b/6a17dd804b055d813e4320e0/1bb71a01a12641961134f2231778344a6249e8f4-1490x634.png" alt="仪表板管理页面显示一个列表，其中包含一个标题为“[OTel] 主机详情 — 概览”的条目，旁边有筛选器、搜索栏、“创建仪表板”按钮以及提交反馈的选项。" /><h2>试用</h2><p>升级到 <strong>Elastic 9.4</strong>（或开始试用），以全屏模式打开 <strong>AI Chat</strong>，并在真实调查场景中试用。您可以让智能体为您正在查看的指标生成图表，然后要求它继续细分。当分析脉络清晰成形后，即可保存并分享：相同的面板，相同的分析框架，无需重复说明。需要企业许可证（<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">开始使用</a>）。<em>本文中描述的任何特性或功能，其发布及发布时间均由 Elastic 自行决定。当前尚未推出的任何特性或功能可能无法按时交付，甚至可能不会交付。</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 将仪表板加载时间最多缩短了 25%——以下是其背后的轮询策略]]></title>
    <description><![CDATA[了解 Kibana 如何使用连续轮询和浏览器端 HTTP/2 检测将仪表板加载时间减少多达 25%，并自动回退到 HTTP/1。]]></description>
    <content:encoded><![CDATA[<p>由于采用了连续轮询，Kibana 仪表板和 Discover 的加载速度现在最多可提升 25%。现在，Kibana 不再在定期检查之间休眠，而是保持 HTTP 连接开放，并在 Elasticsearch 查询结果准备就绪时立即提供。在 HTTP/2+（Kibana 默认从 9.0 开始使用）上，此功能会自动启动，无需任何配置。在 HTTP/1 上，Kibana 会回退到传统轮询以防止连接池耗尽。</p><h2>Kibana 在加载仪表板时如何获取数据</h2><p>打开仪表板后，大部分面板（我们在内部称之为<em>嵌入式</em>面板）都会启动一个或多个 Elasticsearch 查询。但我们使用的不是同步 (sync) 搜索的简单调用和响应，而是异步 (async) 搜索（<a href="https://www.elastic.co/docs/solutions/search/async-search-api">文档</a>）的强大功能。</p><p>使用异步搜索，查询结果会保存在 Elasticsearch 中，而无需依赖任何特定的 HTTP 请求。这非常重要，因为它</p><ul><li><p>使数据加载不受网络动荡的影响</p></li><li><p>为我们的<a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">后台搜索功能</a>提供支持，让用户在等待长时间运行的仪表板或 Discover 会话时，仍能在 Kibana 中处理其他任务</p></li></ul><p>提交初始查询后，Kibana 会监测搜索，以检测搜索何时完成并检索结果集。</p><h3>传统轮询如何影响 Kibana 仪表板的加载时间</h3><p>在传统轮询中，Kibana 会提交查询，关闭初始连接，然后定期检查 Elasticsearch 是否完成。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Kibana 中的传统轮询示意图。Kibana 时间线显示，提交查询后，有一段短暂的连接开放期，随后是长时间的休眠期，然后是短暂的状态轮询，最后才交付结果。Elasticsearch 时间线运行的查询在 Kibana 的休眠期中途完成，这说明了导致时间损失的协调问题。" /><p>我们确实会在查询提交后给 Elasticsearch 一小段时间来完成搜索并返回结果。如果搜索完成得这么快，那就相当于一次简单的请求与响应。但是对于较长的搜索，初始连接会关闭，Kibana 开始定期检查搜索是否完成。这被称为<em>轮询</em>。</p><h4>传统轮询的性能缺陷</h4><p>从上图可以看出，这种方法的性能缺陷是：搜索很可能在 Kibana 的某个休眠间隔期间完成，从而造成时间损失。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="显示传统轮询性能成本的时间线图。Kibana 时间线显示了连接打开阶段、一个较长的休眠阶段、一次状态轮询，然后交付结果。Elasticsearch 时间线显示，查询在 Kibana 休眠中途完成，随后出现一段红色的损失时间——即 Kibana 唤醒并检索结果之前被浪费的时间。" /><p>在最坏的情况下（搜索在休眠期开始时完成），整个轮询间隔的时间都将浪费。</p><h4>退避策略的影响</h4><p>在进行轮询时，采用退避策略是一种标准做法。这意味着搜索时间越长，我们的轮询频率越低。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="水平条形图显示了 Kibana 按查询持续时间划分的轮询间隔退避计划。1.5 秒以下的查询使用大约 0.5 秒的间隔；1.5——5 秒的查询使用 1 秒间隔；5——20 秒的查询使用大约 2.5 秒间隔；20 秒以上的查询使用 5 秒的轮询间隔。" /><p>然而，这也意味着潜在的损失时间会随着搜索持续时间的增加而扩展。</p><h4>轮询间隔如何产生锯齿延迟模式</h4><p>将这些因素综合起来，我们损失的时间就成了一个阶梯状的锯齿函数。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="折线图显示了以秒为单位的损失时间与以秒为单位的查询完成时间之间的关系，呈现出锯齿状模式，即损失时间反复上升然后下降到零，随着查询持续时间从 0 秒增加到 30 秒，损失时间峰值从不到 1 秒增至 5 秒。" /><p>在这里，峰值是最坏的情况，峰谷是最好的情况。这表明，传统轮询的成本取决于搜索持续时间（以及网络状况），可能从零到整个轮询间隔的全部时长不等。</p><h2>持续轮询：Kibana 如何消除等待时间</h2><p>传统轮询的问题在于 Kibana 和 Elasticsearch 之间缺乏基本的协调。理想情况下，Kibana 能够立即知道结果是否可用。那么，如果我们将轮询模式颠倒，使几乎所有时间都用于检查 Elasticsearch，而不再有任何休眠时间，会怎么样？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="显示 Kibana 中连续轮询的时间线图。Kibana 时间线完全是蓝色的——从查询提交到两次连接刷新，连接一直保持打开状态，直到结果交付，没有休眠期。Elasticsearch 时间轴显示了查询的完成情况和立即交付的结果。图例中被划掉的“损失时间”表示该选项已排除。" /><p>通过这种长轮询和取消睡眠间隔，因此一旦准备就绪，就能立即获得结果。</p><h3>HTTP/1 降级</h3><p>这个理论很可靠。那么，为什么启用连续轮询后，Kibana 部署的性能会下降这么多？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="显示 Kibana 仪表板加载“示例日志数据”数据集的的动态屏幕录制，展示了多个面板依次填充的过程，包括响应代码时间序列、美国地图上的总请求数、唯一访客数量、HTTP 错误率指标，以及机器操作系统与目标数据的桑基图。" /><p>关键在于，此部署通过 HTTP/1 运行。在 HTTP/1 中，HTTP 请求与 TCP 连接一一对应。因此，多个长期轮询请求占用了浏览器有限的连接池，导致其他请求排队等待。</p><p>另一方面，在 HTTP/2+ 中，网络请求可以通过多路复用共享 TCP 连接，因此我们不会遇到这个问题。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Kibana 连续轮询的 HTTP/1 与 HTTP/2 的对比图。HTTP/1 每次请求都需要一个 TCP 连接，这样浏览器的连接池就会被六个连接耗尽。HTTP/2 通过单个 TCP 连接多路复用多个轮询请求，避免池耗尽并保持性能。" /><p>因此，在 HTTP/2+ 中，持续轮询是一种优点，但在 HTTP/1 中，它却变成了一种缺点。</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>TCP 连接</p><p>每个 HTTP 请求均有一个</p><p>多路复用（多个请求共享连接）</p><p>连续轮询行为</p><p>性能下降（连接池耗尽）</p><p>全面获益（立即见效）</p><h4>Kibana 如何检测 HTTP 协议以优化轮询</h4><p>HTTP/2 是推荐使用的协议，而且自 9.0 版起已成为 Kibana 的默认协议，因此不提供这项性能提升将是一大遗憾。另一方面，HTTP/1 体验已严重下降，任何尚未升级协议的本地部署均不应冒险使用该协议。答案显而易见：我们需要检测正在使用的协议，并采用最佳轮询策略。</p><p>Kibana 服务器当然有可能知道它使用的是哪种协议。但有一个问题：限制因素是浏览器的连接池。这意味着，真正重要的是<em>浏览器</em>所传达的信息。</p><p>由于代理的存在，这些并不总是相同的。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="架构图显示了三个水平连接的组件：左侧是 Kibana 服务器，中间是可选的代理，右侧是 Kibana 客户端。服务器到代理的跳转由 kibana.yml server.protocol 标记，表示已知的协议。代理到客户端的跳转被标记为三个问号，表示该最终跳转所使用的协议未知，可能有所不同。" /><p>如果我们基于服务器协议进行优化，可能会有两种原因出错。</p><ol><li><p>在不应进行连续轮询的情况下进行轮询，会降低体验。</p></li><li><p>未能在需要时应用连续轮询，就会错过优化机会。</p></li></ol><p>幸运的是，现代浏览器提可以通过使用 <code>PerformanceObserver</code> 来检测任何已完成请求的最后一个网络跳转的协议。因此，我们会关注首次提交查询的协议，并在此基础上进行优化。</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>实验室结果：Kibana 中的连续轮询与传统轮询的对比</h2><p>为了验证连续轮询，我们创建了查询延迟时间为 1 至 23 秒的仪表板，并测量了已启用和未启用优化的加载时间。然后，我们加载了带连续轮询和不带连续轮询的仪表板，以衡量收益（我们在 <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="条形图显示了 Kibana 连续轮询的实验室测试结果：与传统轮询相比，在 1 至 23 秒的查询持续时间内节省的时间。根据查询完成时间相对于轮询间隔边界的位置不同，节省的时间在接近零到 4.9 秒之间变化，这证实了退避计划所预测的锯齿状延迟模式。" /><p>该模式与我们最初的锯齿状图相呼应。对于某些查询时长，收益很小，而对于其他查询时长，收益可达数秒。</p><h2>结论</h2><p>这一优化成功地用更高效的连续轮询策略取代了传统轮询固有的延迟。主要挑战在于有条件地实施此优化，以防止 HTTP/1 部署的性能下降。我们使用浏览器的 <code>PerformanceObserver</code> 来可靠地检测最终网络跳转所使用的协议，从而解决了这个问题。</p><p>实验室测试验证了这一理论，表明连续轮询可以在结果准备就绪后立即提供结果。平均而言，这将显著改善用户体验，使数据加载速度提高 25%。</p><p>这项工作是我们致力于缩短用户获得见解时间的最新举措。通过使 Kibana 成为 Elasticsearch 数据的更透明代理，我们推动了自身影响范围内的性能极限。更多精彩，敬请期待！</p><p>(在 2025 年，Thomas Neirynk 对提升 Kibana 仪表板性能的方法和动机进行了<a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">精彩的概述</a>。这是该计划的最新进展。）</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[用描述代替手动绘制：通过 MCP 和 ES|QL 构建 AI 原生 Kibana 仪表板。]]></title>
    <description><![CDATA[从提示词到仪表板了解如何使用 example-mcp-dashbuilder 通过自然语言构建 Kibana 仪表板：这是一款开源 MCP 应用，能够编写 ES|QL 查询、创建交互式图表，并将功能完整的仪表板直接导出到 Kibana。]]></description>
    <content:encoded><![CDATA[<p>example-mcp-dashbuilder 是一款开源 MCP 应用，可将简单英文提示词转换为实时、交互式 Kibana 仪表板，所有操作都在编辑器的聊天窗口中完成。描述您想要实现的仪表板，AI 会探查您的索引结构，为每个可视化内容编写正确的 ES|QL 聚合，并在运行过程中以内联方式渲染预览。完成后，只需一条命令即可导出功能完整的 Kibana 仪表板：真实的 Lens 可视化内容、精确的网格布局和自定义颜色都会保留下来。目前支持六种图表类型，完整的 Kibana Lens 图表集已列入路线图。</p><h2>Kibana 仪表板构建器是什么？</h2><p>想象一下：您只需用简单英文描述所需仪表板，就能看着它逐步呈现，并配有交互式图表、拖放式布局以及一键导出到 Kibana 的功能。</p><p>这正是 <a href="https://github.com/elastic/example-mcp-dashbuilder.git"><strong>example-mcp-dashbuilder</strong></a> 的作用。它是一款开源 MCP（Model Context Protocol，模型上下文协议）应用，可将 AI 助手连接到 Elasticsearch，让您通过对话创建完整的 Kibana 仪表板。无需在菜单间反复点击。无需手动编写可视化配置。只需描述您的需求，AI 就会探查您的数据、编写 ES|QL 查询、构建图表，并在编辑器的聊天窗口中交付实时交互式仪表板。</p><h2><strong>从提示词到仪表板，仅需数秒</strong></h2><p>实际运行效果如下。您可以输入类似这样的内容：</p><p>“为我构建一个基于 logstash-* 的 Web 流量仪表板，包含总请求数、随时间变化的传输字节数、主要地理来源以及响应代码细分”</p><p>随后，AI 会：</p><ol><li><p><strong>探查您的数据：</strong>列出索引并检查字段映射。</p></li><li><p><strong>编写 ES|QL 查询：</strong>根据您的架构量身定制，并使用正确的聚合。</p></li><li><p><strong>创建可视化内容：</strong>条形图、折线图、带迷你图的指标图、热力图、饼图。</p></li><li><p><strong>组织所有内容：</strong>可折叠分区、有意义的标题、合理的布局。</p></li><li><p><strong>渲染交互式预览：</strong>直接显示在聊天中，并配有工具提示、时间选择器和拖放功能。</p></li></ol><p>每个图表在创建时都会内联显示，因此您可以实时查看进度。随后，<code>view_dashboard</code> 会显示完整的仪表板，所有面板都会按照 Kibana 的 48 列网格完成布局。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75af5d9042d141b5/6a17e99dbe608675a4004792/dcbf47c4f17bf1a184fb0167408ebeb861ef6c9d-1404x1568.png" alt="example-mcp-dashbuilder 界面中显示了两个图表。第一个是标题为“主要地理来源”的垂直条形图，按国家/地区代码显示请求数。第二个是标题为“HTTP 响应代码细分”的饼图，显示 200、404 和 503 响应的分布。" /><p><em>单个图表的内联预览</em></p><h2><strong>由 ES|QL 提供支持</strong></h2><p>所有数据检索均使用 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>，即 Elasticsearch 的管道式查询语言。AI 不只是传递原始查询，还会利用其对 ES|QL 语法的内置知识，并结合您的数据结构信息，为每种可视化类型编写正确且高效的查询。</p><p>该服务器包含一份全面的 ES|QL 参考文档，并将其作为 MCP 资源提供。在编写任何查询之前，AI 会先读取这份参考文档，以了解可用的命令、函数和模式。结合数据可视化最佳实践指南（同样作为资源提供），AI 不仅知道<em>如何</em>查询，还懂得<em>什么样</em>的可视化效果更好：</p><ul><li><p>针对时间序列使用 <code>BUCKET(@timestamp, 1 day)</code>；始终按时间字段 <code>SORT</code> 排序。</p></li><li><p>使用 <code>| SORT value DESC | LIMIT 6</code> 将饼图限制为最多六个扇区。</p></li><li><p>类别比较选用条形图，趋势分析选用折线图，关键绩效指标 (KPI) 选用指标图。</p></li></ul><h2><strong>AI 驱动的数据探索，支持开放式分析</strong></h2><p>在脑海中设计好一个仪表板并将其构建出来是一回事。询问“这个索引中有哪些值得关注的内容？”并获得有用答案则更难；这要求 AI 懂得如何<em>探索</em>数据，而不仅仅是绘制图表。</p><p>example-mcp-dashbuilder 提供了一个 <code>analysis://guidelines</code> 资源，用于定义结构化探索流程：剖析数据、运行有针对性的聚合、呈现值得调查的模式、为最值得关注的发现构建图表，并提出用户接下来可能需要的下钻查询。“分析我的日志”或“在这个索引中寻找模式”等触发短语，会促使 AI 在执行任何其他操作前先读取该操作手册。因此，开放式提示词生成的是逻辑连贯的分析过程，而不是一堆随机图表。</p><p>结果是：您可以将一个陌生索引交给 AI，并获得一个起点，包括一个仪表板，以及一组简短提示，例如“以下是我注意到的情况，需要我深入分析其中某一项吗？”</p><h2><strong>Kibana 仪表板的导出与导入：完整闭环</strong></h2><p>导出/导入闭环让 example-mcp-dashbuilder 对已经在 Kibana 中工作的团队真正显现价值。example-mcp-dashbuilder 是一个独立工具，也是位于编辑器内的对话式仪表板界面，但它不会让您的工作局限于此。在这里构建的仪表板可以在需要时导入 Kibana；现有 Kibana 仪表板也可以反向导入，以便进行 AI 辅助编辑。</p><h3><strong>导出到 Kibana</strong></h3><p>当您对仪表板满意后，只需一条命令即可导出：</p><p>将此仪表板导出到 Kibana</p><p>每个面板都会转换为 Kibana Lens 原生可视化内容。转换过程会保留：</p><ul><li><p><strong>ES|QL 查询：</strong>直接作为 Lens ES|QL 数据源传输。</p></li><li><p><strong>网格位置：</strong>沿用 Kibana 使用的 48 列系统，因此您的布局看起来完全一致。</p></li><li><p><strong>自定义颜色：</strong>系列调色板、指标背景、热力图色带。</p></li></ul><p>最终生成的是一个功能完整的 Kibana 仪表板。不是屏幕截图。不是嵌入内容。而是一个真实的仪表板，您可以在 Kibana 中分享并继续编辑。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1921c74c2833cabe/6a17e99f6864a4a712b687da/5e27777bc0a82cafb373943f65298bdb21d66176-1999x902.png" alt="两个仪表板并排显示。左侧仪表板标题为“编辑 Web 流量 — Logstash (Dashbuilder)”，显示近期流量指标，以及流量统计面板、地理来源条形图和响应代码饼图。右侧仪表板显示类似布局，但总量更高，并包含流量统计面板、地理来源条形图和响应代码饼图。" /><p><em>Kibana 仪表板与 Cursor 聊天中的仪表板并排显示。</em></p><h3><strong>从 Kibana 导入</strong></h3><p>该闭环同样支持反向操作：</p><p>“导入 ID 为 abc-123 的 Kibana 仪表板”</p><p>这会获取现有 Kibana 仪表板，将其 Lens 可视化内容转换回可编辑的图表配置，保留网格布局和分区，并将所有内容加载到 example-mcp-dashbuilder 中。之后，您可以使用自然语言修改该仪表板并重新导出。</p><p>这使得 AI 成为您现有 Kibana 工作流程中的协作者，而不是替代品。</p><h2><strong>自定义主题和颜色</strong></h2><p>想要品牌化仪表板？直接提出需求：</p><p>“创建一个粉色主题的仪表板，并使用自定义颜色”</p><p>所有可视化类型都支持自定义颜色配置：</p><ul><li><p><strong>图表：</strong><code>palette</code> 接受用于系列和扇区的十六进制颜色数组。</p></li><li><p><strong>指标：</strong><code>color</code> 设置背景颜色。</p></li><li><p><strong>热力图：</strong><code>colorRamp</code> 定义从低值到高值的颜色渐变。</p></li></ul><p>AI 能自然理解主题请求。输入“海洋主题”，它会选择蓝色和蓝绿色。输入“匹配我们的品牌颜色”并提供十六进制值，这些颜色会在导出时一并带入 Kibana。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2bc7cddbdef81354/6a17e9a1ec0f89ee155a665e/4aceba013ac9cbb4a541109efd6acddf8a6ec47d-1562x1568.png" alt="采用自定义粉色配色的电商主题仪表板。该布局在顶部显示收入和订单 KPI，中间是一个折叠的趋势分区，下方是两个基于类别的图表：按类别显示收入的条形图，以及按类别显示订单的饼图。" /><p><em>采用自定义颜色的主题仪表板。</em></p><p><strong>example-mcp-dashbuilder 的工作原理：MCP 架构</strong></p><p>example-mcp-dashbuilder 基于 <a href="https://modelcontextprotocol.io/">MCP</a> 构建；MCP 是用于连接 AI 助手与外部工具和数据的开放标准。以下是其高层级架构概览：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c0cd879646e9947/6a17e9a36864a4c408b687df/cbfeabe151ec1ee2b0655f4d17468c9bb358df7e-1024x559.png" alt="该架构图显示 MCP Host 连接到 MCP Server，后者包含工具、资源和指令。下方的 MCP App 框包含 Elastic Charts 和 Kibana 网格布局。Elasticsearch 和 Kibana 显示在底部，并通过箭头连接到 MCP App。" /><p><strong>MCP 服务器</strong>提供 25 个可由 AI 直接调用的工具，涵盖从运行 ES|QL 查询到导出仪表板的各类操作。同时，它还提供少量仅供应用内部调用的工具，供内联预览用于获取数据、持久化布局更改和检测时间字段。它提供三类资源：数据可视化最佳实践指南、ES|QL 参考文档，以及会在遇到开放式提示词（如“分析我的日志”“这个索引中有哪些值得关注的内容？”）时触发的深度分析操作手册。它既可以通过 stdio 运行，也可以通过 HTTP 运行；HTTP 传输支持流式响应和会话管理，因此多个客户端可以连接到同一台服务器。</p><p><strong>MCP App</strong> 是交互式预览界面。它使用 React、<a href="https://elastic.github.io/elastic-charts">Elastic Charts</a> 和 <a href="https://eui.elastic.co/">Elastic UI</a> 构建，并打包成一个独立且自包含的 HTML 文件。当 AI 调用 <code>view_dashboard</code> 或创建图表时，宿主程序会在沙盒化 iframe 中渲染此 HTML。该应用完全通过 <a href="https://modelcontextprotocol.io/extensions/apps/overview">MCP Apps 协议</a>与服务器通信，并通过 postMessage 使用 <code>callServerTool()</code> 来获取数据、保存布局和检测时间字段。无需 localhost 服务器，无需配置端口，也没有外部网络依赖。</p><p>这意味着它可以与任何兼容 MCP 的客户端配合使用：Cursor、Claude Desktop、Claude.ai、VS Code with Copilot 等。</p><h2><strong>example-mcp-dashbuilder 支持哪些图表类型？</strong></h2><p>在撰写本文时，支持六种图表类型，涵盖了最常见的仪表板场景：</p><p>类型</p><p>适用场景</p><p>示例</p><p>条形图</p><p>类别比较</p><p>按地理来源划分的请求数</p><p>折线图</p><p>随时间变化的趋势</p><p>每小时传输的字节数</p><p>区域</p><p>随时间变化的数据量</p><p>随时间变化的请求量</p><p>饼图</p><p>局部与整体的比例关系（最多六个扇区）</p><p>响应代码分布</p><p>指标</p><p>带迷你图的单一 KPI</p><p>总请求数及每小时趋势</p><p>热力图</p><p>跨两个维度的模式</p><p>按星期几和小时划分的请求数</p><p>仪表板支持用于组织内容的可折叠分区、可自动检测时间字段的时间选择器，以及保存多个仪表板并在其间切换的功能；并行聊天会话通过贯穿每次工具调用的 <code>dashboardId</code> 保持相互隔离。</p><h2><strong>如何安装和运行 example-mcp-dashbuilder</strong></h2><p>example-mcp-dashbuilder 是开源项目，可直接使用。您需要 Node.js 22+、一个 Elasticsearch 实例（本地或 Elastic Cloud），以及一个兼容 MCP 的客户端。</p><p><strong>Claude Desktop：</strong>从 <a href="https://github.com/elastic/example-mcp-dashbuilder/releases">GitHub Releases</a> 下载最新 <code>.mcpb</code> 文件，然后双击安装。Claude Desktop 会提示您输入 Elasticsearch 凭据。</p><p><strong>Cursor / Claude Code / VS Code Copilot：</strong>将您的 MCP 配置指向已发布的 tarball 压缩包；无需克隆，也无需 <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>将 <code>ES_NODE, ES_API_KEY</code>（或 <code>ES_USERNAME / ES_PASSWORD</code>）和 <code>KIBANA_URL</code> 设置为环境变量。如果您更倾向于基于源代码运行，请克隆仓库并运行 <code>npm run setup</code>，以启动交互式向导；该向导可处理本地 Elasticsearch 和 Elastic Cloud（Cloud ID + API 密钥）。</p><p>然后开始构建：</p><p>“探索 logs 索引，并尽可能为我构建最具洞察力的仪表板”</p><p>剩下的交给 AI 即可。😉</p><h2><strong>路线图：example-mcp-dashbuilder 即将推出的功能</strong></h2><p>这是一个早期版本，我们正在积极开发中。我们专注的一些领域：</p><ul><li><p><strong>更多图表类型：</strong>仪表图、环形图、树状图、数据表和标签云，以覆盖 Lens 的完整功能。</p></li><li><p><strong>将仪表板推送到 Git：</strong>将仪表板配置写入代码仓库，用于版本控制和代码审查工作流。</p></li><li><p><strong>更友好的错误处理体验：</strong>当 ES|QL 查询失败时提供更详细的反馈，并给出常见修复建议。</p></li><li><p><strong>更丰富的分析流程：</strong>扩展深度分析操作手册，以覆盖更多数据形态（日志、指标、链路追踪）。</p></li></ul><p>我们很期待看到您用它构建出的成果。欢迎试用、提交 issue，并告诉我们哪些可视化内容和工作流对您的团队最有帮助。</p><p><a href="https://github.com/elastic/example-mcp-dashbuilder">GitHub：elastic/example-mcp-dashbuilder</a></p><h3>致谢</h3><p>感谢 <a href="mailto:walter.rafelsberger@elastic.co">Walter Rafelsberger</a> 和 <a href="mailto:tim.schnell@elastic.co">Tim Schnell</a> 在实现方面作出的贡献。</p><h3>常见问题解答</h3><p><strong>什么是 example-mcp-dashbuilder？</strong>example-mcp-dashbuilder 是一款开源 MCP (Model Context Protocol) 应用，用于将 AI 助手连接到 Elasticsearch。它让您可以用简单英文描述 Kibana 仪表板，并自动生成 ES|QL 查询、创建可视化内容，在编辑器的聊天窗口中交付实时交互式仪表板。</p><p><strong>example-mcp-dashbuilder 使用哪种查询语言来检索数据？</strong>所有数据检索均使用 ES|QL，即 Elasticsearch 的管道式查询语言。MCP 服务器包含一份内置 ES|QL 参考文档，AI 在编写任何查询之前都会先阅读该参考文档，从而确保每种可视化类型都具备正确语法和高效聚合。</p><p><strong>我可以将使用 example-mcp-dashbuilder 构建的仪表板导出到 Kibana 吗？</strong>可以。运行“将此仪表板导出到 Kibana”会将每个面板转换为真正的 Kibana Lens 可视化内容，并保留 ES|QL 查询、48 列网格布局、自定义颜色和系列调色板。最终呈现的是一个功能完整的 Kibana 仪表板，而不是屏幕截图或嵌入内容。</p><p><strong>我可以将现有 Kibana 仪表板导入 example-mcp-dashbuilder，以便进行 AI 辅助编辑吗？</strong>可以。只需提供 Kibana 仪表板 ID，系统便会获取现有仪表板，将其 Lens 可视化内容转换为可编辑的图表配置，并加载到 example-mcp-dashbuilder 中。之后，您可以使用自然语言修改仪表板，并重新导出到 Kibana。</p><p><strong>哪些 MCP 客户端与 example-mcp-dashbuilder 兼容？</strong>example-mcp-dashbuilder 可与任何兼容 MCP 的客户端配合使用，包括 Cursor、Claude Desktop、Claude.ai 和 VS Code with Copilot。它同时支持 stdio 和 HTTP 传输，无需 localhost 服务器或端口配置。</p><p><strong>example-mcp-dashbuilder 支持哪些图表类型？</strong>当前版本支持六种图表类型：条形图、折线图、面积图、饼图、指标图（带迷你图）和热力图。计划新增仪表图、环形图、树状图、数据表和标签云，以覆盖 Kibana Lens 的完整功能。</p><p><strong>运行 example-mcp-dashbuilder 需要什么？</strong>您需要 Node.js 22 或更高版本、一个 Elasticsearch 实例（本地或 Elastic Cloud），以及一个兼容 MCP 的客户端。设置环境变量 ES_NODE、ES_API_KEY（或 ES_USERNAME/ES_PASSWORD）和 KIBANA_URL。对于 Claude Desktop，请从 GitHub Releases 下载 .mcpb 文件，然后双击安装。</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[使用变量控件来提高 Kibana 仪表板的交互性]]></title>
    <description><![CDATA[了解如何在 Kibana 8.18+ 中使用变量控件来筛选单个可视化内容、调整时间间隔，并在 Kibana 仪表板中按不同字段分组。]]></description>
    <content:encoded><![CDATA[<p>我们很高兴地宣布，<strong>从 8.18 版本和所有 9.x 系列开始，Kibana 仪表板现在可以使用变量控件</strong>。这一功能是仪表盘用户一直以来最为频繁要求新增的内容之一。如今，它终于上线啦 🎉 在过去的几个月里，我们持续拓展并优化<a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#add-variable-control">变量控件</a>，此刻正是为它们单独撰写一篇专题博客文章的绝佳时机。</p><h2>变量控件是什么？</h2><p>如果您以前用过 Kibana 仪表板，您可能知道我们经典的仪表板控件。那些方便的下拉菜单可以显示数据中的数值，让您只需点击几下就能筛选。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7405fbff7584b1b/6a17ee5cfbc5f8aea1491b5d/b82c1b25a0b38661e5ce4552f763be487d5074aa-1600x701.png" alt="" /><p>可变控件表面上看起来很相似，但却有巧妙的变化：它们并非自动筛选仪表板上的每个面板，而是可以直接插入<a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">单个可视化内部的 ES|QL 查询中</a>。</p><p>这意味着<em>您</em>可以决定每个控件的适用范围。更妙的是，您可以将它们用于各种创意技巧，例如实时调整时间间隔、切换细分字段，或更改可视化参数。简而言之，它们为您的仪表板提供了真正的交互式体验，使您能够更快、更轻松地获得见解。</p><h2>变量控件用例</h2><p>好吧，变量控件听起来很有用，但您实际上能用它们做些什么？下面举例说明它们如何提升仪表盘的功能性：</p><h3>筛选已选择的可视化内容</h3><p>想要筛选<em>部分</em>可视化内容，但保留其他内容不变？变量控件功能可以让您做到这一点。选择要响应的面板，并在可视化的 ES|QL 查询中将它们连接起来。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd014bba50a3a61e/6a17ee5e14d90c006d79b69a/efa367363830b03bc67028aceafe78c4b44e578f-1440x562.gif" alt="" /><h3>选择不同的时间间隔</h3><p>让用户可以在“5 分钟”、“1 小时”、“1 天”或任何合理的时间间隔之间切换。构建有预定义时间间隔的变量控件，并将其连接到时间序列查询。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt237797ddea95ce08/6a17ee602f4a5cfd65fa8996/62aa9f4e728036f8c70213b76b1cf131f36f5b4d-1440x606.gif" alt="" /><h3>更改函数</h3><p>与其为每个操作创建多个图表，不如让仪表板用户选择自己想要查看最大值、平均值、不同百分位数或任何其他聚合器。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4c856460132fb604/6a17ee627b54f920838b3991/f6a2b4c73dc35efe462c2924a153d7b3fa3a7922-1436x606.gif" alt="" /><h3>按不同字段分组</h3><p>有时，您需要在调查过程中按不同维度对数据进行细分。通过变量控件，您可以定义多个“分组依据”字段，让仪表板用户选择有助于他们发现见解的字段。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbf1a24038dde55b8/6a17ee646864a413b6b6884c/fe8745a6fddccadba0666686b8ebc67fdaf64158-1438x606.gif" alt="" /><h2>如何创建？</h2><p>创建变量控件的最简单（可能也是最有趣）方法是直接从可视化中的 <strong>ES|QL 查询编辑器</strong>中创建。只需开始输入查询，使用自动完成菜单，Kibana 就会帮助您创建。</p><p>但是如果您更喜欢以变量本身为基础开始创建，也可以前往：<strong>添加面板 → 控件 → 变量控件</strong>，然后在创建控件后将变量添加到可视化中。</p><h3>示例 1：具有多值选择的筛选控件</h3><p>1. 选择由 ES|QL 查询驱动的可视化，并在 WHERE 条件中单击“创建控件”。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1356c9ac1ffce732/6a17ee661d1b83104a93e4f3/46cb6f2a6775aee152d42eb5ee85170f1bdf26cb-1600x668.png" alt="" /><p>2. 您将自动被重定向至变量创建弹出面板，此时“来自查询的值”这一类型已自动选定，并且变量的名称已经预填。请记住，控件的名称必须以“?...”开头，以便在可视化查询中使用。</p><p>您通常需要这样的查询来获取字段中的值，并根据仪表板中选择的时间范围进行更新：</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. 保存控件时，您会看到它出现在仪表盘的顶部，可视化查询也会用变量控件名称进行更新。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte03c74e0c60bdb42/6a17ee6a0b0bed13cddd3636/5fc434c8951889e9769652b675191711d126a685-1600x653.png" alt="" /><p>4. 如果要在控件中添加<a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#esql-multi-values-controls">多值选择</a>，则需要在查询中使用<code>MV_CONTAINS</code>函数，并在步骤 2 创建控件时选择“允许多选”（9.3 及更高版本可用）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt218a166f7a1dc52c/6a17ee6ca2929979a9d02d27/1f237cea0a37cb25a7917a2a683707a269adae8e-1600x670.png" alt="" /><h3>示例 2：时间间隔控制</h3><p>如果您正在构建时间序列，可轻松地为日期直方图间隔添加一个变量控制：</p><p>1. 为时间序列编写 ES|QL 查询时，单击“创建控件”。为时间间隔创建变量时，最好使用 <code>TBUCKET</code> 而非 <code>BUCKET</code>，这样它就可以接受更具可读性的间隔，例如“1 小时”、“1 天”等。我们也会很快推出 <code>TBUCKET</code> 自动选项，以便自动适应时间范围。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta6f32acf5ed19697/6a17ee6e6864a4a32fb68850/b0ad53d790ff9bdd42db5e77477318319f423534-1600x664.png" alt="" /><p>2. 确定用于填充下拉菜单选项的时间间隔。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf08d6a75afe87314/6a17ee6f25daab58fe08a2fa/f3bd83f530cfa4698c1a3b1ae60d08d0414043b5-1600x757.png" alt="" /><p>3. 在下拉菜单中选择不同的时间间隔，查看可视化如何变化。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ecd5f376b096063/6a17ee7196142a0f77eb1b9b/0f928d9c70929f64926e065059188d140cd48943-1600x671.png" alt="" /><h3>示例 3：函数变量</h3><ol><li><p>用“静态值”类型控件构建一个变量，并在下拉菜单的值中添加函数名。为了替换函数，请使用以“??...”开头的变量名。</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6bdc0c817465f3f0/6a17ee73505ac3268cad8bea/531444237b7e152d3c8a6f3ca7e464f954f9e856-1600x663.png" alt="" /><p>2. 在 ES|QL 查询中包含变量名称。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd631ad49bbb93c3e/6a17ee75e9ea87708ea9c6aa/9858442abb26d8d266d464852871b139fde63b89-1600x665.png" alt="" /><h3>示例 4：字段变量</h3><ol><li><p>您可以使用“静态值”类型的控件，并填入所需字段的名称。为了让变量名在字段中生效，使用以“??...”开头的变量名非常重要。</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29079f2b85c7239c/6a17ee77b1e113328f79f30b/33534c3df2fae024b25c28b4aed5d742e54202a2-1600x710.png" alt="" /><p>2. 在可视化查询中引用想要的变量。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ca73c08dfa27319/6a17ee780b0bed31e8dd363a/71cdf3e9df72c59d957628a3aa6e4aa9bd60d6d5-1600x676.png" alt="" /><h2>Discover 中的变量控件</h2><p>变量控件不仅仅是仪表盘的功能，还可以直接在 Discover 的 ES|QL 编辑器中使用。您可以在 Discover 中构建控件，以获得更快的数据探索体验，并将其引入仪表盘，反之亦然。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40c9ce5eed7ded45/6a17ee7b420229747b29f684/fdddeec902d0bc746caed9276d01d7d48793dd85-1600x709.png" alt="" /><h2>技术细节</h2><p>到现在为止，您可能已经注意到变量控件有一些规则，比如它们可以引用查询的哪些部分，以及您需要使用的命名前缀（“?...”用于值，“??...”用于字段或函数）。这是因为变量不仅仅是在客户端进行简单的字符串替换。它们实际上是查询语言本身最重要的因素（<a href="https://www.elastic.co/docs/solutions/search/agent-builder/tools/esql-tools#parameter-types">在 ES|QL 中称为</a>参数）。</p><p></p><p>这种设计具有一些很大的优势。首先，Kibana 可以理解每个变量的上下文，这使我们能够自动为您生成并预先填充其配置。它也更加安全：由于该语言严格验证变量输入，因此可以防止恶意注入，并在出现异常时轻松处理错误。此外，它将复杂的验证和错误处理转移到服务器而不是客户端，从而提高了性能和稳定性。关于性能，最佳做法是创建包含快速查询的变量，因为它们在仪表盘之前加载，所以慢速查询会影响整个仪表盘的性能。</p><p>当然，这种架构暂时也有一些<a href="https://www.elastic.co/docs/solutions/search/agent-builder/limitations-known-issues#esql-limitations">限制</a>。变量尚不支持用于筛选的“Any”选项，目前也不能与<code>LIKE</code>或 <code>FROM</code>（用于切换数据源）等操作符结合使用。好消息是什么？我们正在着手添加这些功能。</p><h2>控件的未来发展趋势</h2><p>我们不会就此止步！我们所关注的一些改进包括：</p><p>✨ 在仪表板上随处放置控件的能力</p><p>✨ 控件链式连接：意味着一个控件的输出成为下一个控件的输入。</p><p>✨ 选择选项更理想，比如变量的“任意”选择</p><p>✨ 新控件类型（搜索类型控件和数据源变量）</p><p>✨ 以及更多您一直要求的生活质量改进，比如预筛选常规控件</p><p>如果您有任何想法或反馈，欢迎向我们提出。</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[分析]]></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[人工智能驱动的仪表盘：从设想到 Kibana]]></title>
    <description><![CDATA[使用 LLM 生成仪表盘，处理图像并将其转化为 Kibana 仪表盘。
]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/kibana/kibana-lens">Kibana Lens</a>让仪表盘的拖放变得非常简单，但当你需要几十个面板时，点击次数就会增加。如果你能勾画出一个仪表盘，截图后让法律硕士为你完成整个过程，那会怎么样？</p><p>在本文中，我们将实现这一目标。我们将创建一个应用程序，它可以获取仪表盘的图像，分析映射，然后生成仪表盘，而无需接触 Kibana！</p><p><strong>步骤</strong>：</p><ol><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#background-&amp;-application-workflow">后台&amp; 应用程序工作流程</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#prepare-data">准备数据</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#llm-configuration">LLM 配置</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#application-functions">应用功能</a></p></li></ol><h2>后台&amp; 应用程序工作流程</h2><p>我首先想到的是让 LLM 生成整个 NDJSON 格式的 Kibana<a href="https://www.elastic.co/docs/explore-analyze/find-and-organize/saved-objects">保存对象</a>，然后将它们导入 Kibana。</p><p>我们尝试了几种型号：</p><ul><li><p>双子座 2.5 pro</p></li><li><p>GPT o3 / o4-mini-high / 4.1</p></li><li><p>克劳德 4 号十四行诗</p></li><li><p>Grok 3</p></li><li><p>Deepseek (Deepthink R1)</p></li></ul><p>至于提示语，我们从最简单的开始：</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 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.">一些简单的示例</a>，并详细解释了如何建立每种可视化，但我们还是一无所获。如果您对这项实验感兴趣，请<a href="https://gist.github.com/TomasMurua/a78dc283e115624731beffc98984b70b">点击此处</a>了解详情。</p><p>采用这种方法的结果是，在尝试将 LLM 生成的文件上传到 Kibana 时看到了这些信息：</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>这意味着生成的 JSON 无效或格式不当。最常见的问题是 LLM 生成不完整的 NDJSON、产生参数幻觉，或者返回普通 JSON 而非 NDJSON，无论我们如何努力去执行其他操作。</p><p>受<a href="https://www.elastic.co/search-labs/blog/llm-functions-elasticsearch-intelligent-query">这篇文章</a>的启发--<a href="https://www.elastic.co/docs/solutions/search/search-templates">搜索模板</a>比 LLM 自由式更有效--我们决定给 LLM 提供模板，而不是要求它生成完整的 NDJSON 文件，然后我们在代码中使用 LLM 给出的参数来创建适当的可视化。</p><p>申请工作流程如下：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f7738a4c7ddd0cd/6a1707d52b835f0a25f4b166/52c587cf0cf3517fdd4ee7ab95581dd4f2bce030-725x668.png" alt="" /><p></p><p><em>为简单起见，我们将省略一些代码，但您可以在 </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>本</strong></em></a><em> 笔记本</em>上找到完整应用程序的工作代码  。</p><h2>准备工作</h2><p>在开始开发之前，您需要具备以下条件：</p><ol><li><p>Python 3.8 或更高版本</p></li><li><p><a href="https://docs.python.org/3/library/venv.html">Venv</a>Python 环境</p></li><li><p>运行的 Elasticsearch 实例及其端点和 API 密钥</p></li><li><p>存储在环境变量 OPENAI_API_KEY 下的 OpenAI API 密钥：</p></li></ol>export OPENAI_API_KEY="your-openai-api-key"<h2>准备数据</h2><p>在数据方面，我们将保持简单，使用 Elastic 样本网络日志。您可以<a href="https://www.elastic.co/docs/manage-data/ingest/sample-data#add-sample-data-sets">在此</a>了解如何将这些数据导入群集。</p><p>每份文档都包含向应用程序发出请求的主机的详细信息，以及请求本身及其响应状态的信息。下面是一个文件示例：</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>现在，让我们抓取刚刚加载的索引的映射，<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>我们将把映射与稍后加载的图像一起传递。</p><h2>LLM 配置</h2><p>让我们对 LLM 进行配置，使其使用<a href="https://python.langchain.com/docs/concepts/structured_outputs/">结构化输出</a>来输入图像，并接收包含我们需要传递给函数的信息的 JSON，以生成 JSON 对象。</p><p>我们安装依赖项：</p>pip install elasticsearch pydantic langchain langchain-openai -q<p>Elasticsearch 将帮助我们检索<a href="https://www.elastic.co/docs/manage-data/data-store/mapping">索引映射</a>。Pydantic 允许我们在 Python 中定义模式，然后要求 LLM 遵循这些模式，而<a href="https://www.elastic.co/search-labs/integrations/langchain">LangChain</a>框架则有助于更轻松地调用 LLM 和人工智能工具。</p><p>我们将创建一个 Pydantic 模式，以定义我们希望从 LLM 得到的输出。我们需要从图片中了解图表类型、字段、可视化标题和仪表盘标题：</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>对于图像输入，我们将发送一个我刚刚画好的仪表盘：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7870f6421986d11d/6a1707d78b73cb3408189fa3/36441d7b5dc1f3ff2ac2a30710208d57ad41c716-1600x898.jpg" alt="" /><p>现在我们声明 LLM 模型调用和图像加载。该函数将接收 Elasticsearch 索引的映射和我们要生成的仪表盘图像。</p><p>通过<code>with_structured_output</code> ，我们可以使用 Pydantic<code>Dashboard</code> 模式作为 LLM 生成的响应对象。通过<a href="https://docs.pydantic.dev/latest/">Pydantic</a>，我们可以定义带有验证功能的数据模型，从而确保 LLM 输出与预期结构相匹配。</p><p>要将图像转换为 base64 并作为输入发送，可以使用<a href="https://www.base64-image.de/">在线转换器</a> <a href="https://www.geeksforgeeks.org/python-convert-image-to-string-and-vice-versa/">或用代码</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>LLM 已经掌握了 Kibana 面板的上下文，因此我们不需要在提示中解释所有内容，只需提供一些细节，确保它不会忘记自己正在使用 Elasticsearch 和 Kibana。</p><p>让我们来分析一下提示：</p><p>部门</p><p>原因</p><p>您是根据 Kibana 9.0.0 版本的图像分析 Kibana 仪表板的专家。</p><p>通过强化 Elasticsearch 和 Elasticsearch 版本，我们降低了 LLM 产生旧参数/无效参数的可能性。</p><p>您将获得一个仪表盘图像和一个 Elasticsearch 索引映射。</p><p>我们解释说，图片是关于仪表盘的，以避免法律硕士做出任何错误的解释。</p><p>下面是仪表盘所基于的索引的索引映射，使用它可以帮助你理解数据和可用字段。索引映射： {index_mappings}</p><p>提供映射至关重要，这样 LLM 才能动态选择有效字段。否则，我们就可能在这里硬编码映射，这太死板了，或者依靠图像包含正确的字段名，这也不可靠。</p><p>根据图像中可见的内容，只包含与每个可视化相关的字段。</p><p>我们必须添加这一增强功能，因为有时它会尝试添加与图像无关的字段。</p><p>这将返回一个包含要显示的可视化数组的对象：</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>处理 LLM 答复</h2><p>我们在上创建了一个 2x2 面板仪表盘示例，然后使用 "<a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-get-dashboards-dashboard">获取仪表盘 API "</a>将其导出为 JSON 格式，然后将面板存储为可视化模板（饼状、条状、度量），在这些模板中，我们可以替换部分参数，根据问题创建带有不同字段的新可视化。</p><p>您可以<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>在此处</strong></a>查看模板 JSON 文件。请注意我们是如何用 {<code>variable_name</code>} 更改我们稍后要替换的对象值的。
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc55d69d84a08e668/6a1707d8a2929903acd00fb8/ec7e1ac0cd8b470df13e60940162b56778acb386-315x234.png" alt="" /><p>根据 LLM 提供的信息，我们可以决定使用哪个模板，替换哪些值。</p><p><code>fill_template_with_analysis</code> 将接收单个面板的参数，包括可视化的 JSON 模板、标题、字段和可视化在网格上的坐标。</p><p>然后，它会替换模板的值，并返回最终的 JSON 可视化。</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>为了简单起见，我们将为 LLM 决定创建的面板分配静态坐标，并生成如上图所示的 2x2 网格仪表盘。</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>根据 LLM 决定的可视化类型，我们将选择一个 JSON 文件模板，并使用<code>fill_template_with_analysis</code> 替换相关信息，然后将新面板追加到稍后用于创建仪表盘的数组中。</p><p>仪表盘准备就绪后，我们将使用<a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-dashboards-dashboard-id"> 创建 仪表盘 API</a> 将新的 JSON 文件推送到 Kibana 以生成仪表盘：
</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>要执行脚本并生成仪表盘，请在控制台中运行以下命令：</p>python &lt;file_name&gt;.py<p>最终结果将是这样的</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ceffed004153a4f/6a1707d9a929cf9147ae0901/e909afbf0e47d9a6e0f7bd07dfb2efcfa5cf06ac-921x715.png" alt="" /><h2>结论</h2><p>在将文本转化为代码或将图像转化为代码时，LLM 展示了其强大的视觉能力。仪表盘 API 还能将 JSON 文件转化为仪表盘，而通过 LLM 和一些代码，我们就能将图片转化为 Kibana 仪表盘。</p><p>下一步是通过使用不同的网格设置、仪表盘大小和位置来提高仪表盘视觉效果的灵活性。此外，为更复杂的可视化和可视化类型提供支持也是对该应用程序的有益补充。</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 第 2 部分：数据分析和可视化]]></title>
    <description><![CDATA[我们将比以往任何时候都更深入地研究您的 Spotify 数据，探索您甚至不知道的联系。]]></description>
    <content:encoded><![CDATA[<p>在 Iulia Feroli 撰写的本系列<a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">第一部分中</a>，我们谈到了如何获取 Spotify Wrapped 数据并在 Kibana 中对其进行可视化。在第二部分中，我们将深入研究数据，看看还能发现什么。为此，我们将采用一种不同的方法，使用<a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify to Elasticsearch</a>将数据索引到 Elasticsearch 中。这个工具比较先进，需要更多的设置，但它是值得的。数据更加结构化，我们可以提出更复杂的问题。</p><h2>与第一次 Spotify Wrapped 分析的不同之处</h2><p>在第一篇博客中，我们直接使用 Spotify 导出，没有执行任何规范化任务或其他数据处理。这一次，我们将使用相同的数据，但我们将对数据进行一些处理，使数据更加可用。这将使我们能够回答更复杂的问题，例如：.....：</p><ul><li><p>排名前 100 的歌曲的平均时长是多少？</p></li><li><p>排名前 100 的歌曲平均受欢迎程度是多少？</p></li><li><p>一首歌曲的中位收听时长是多少？</p></li><li><p>我跳得最多的曲目是什么？</p></li><li><p>我什么时候喜欢跳过曲目？</p></li><li><p>我是否在一天中的某个时段比其他时段听得更多？</p></li><li><p>我是否在一周中的某一天比其他日子听得更多？</p></li><li><p>是特别感兴趣的月份吗？</p></li><li><p>聆听时间最长的艺术家是谁？</p></li></ul><p>Spotify Wrapped 每年都会给你带来有趣的体验，向你展示今年你都听了些什么。它不会提供每年的变化情况，因此你可能会错过一些曾在你的前十名中，但现在已经消失的艺术家。</p><h2>处理 Spotify Wrapped 数据以供分析</h2><p>在第一个和第二个职位中，我们处理数据的方式有很大不同。如果您想继续使用第一篇文章中的数据，您需要考虑一些字段名称的变化，还需要恢复到 ES|QL 来进行某些提取，如<code>hour of day</code> on the fly。</p><p>不过，大家应该都能跟上这个帖子。在<a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify 到 Elasticsearch</a>存储库中进行的数据处理包括向 Spotify API 询问歌曲的持续时间、受欢迎程度，以及重命名和增强某些字段。例如，Spotify 导出中的<code>artist</code> 字段本身只是一个字符串，并不代表功能或多艺术家曲目</p><h2>使用仪表盘可视化 Spotify Wrapped 数据</h2><p>我在 Kibana 中创建了一个仪表盘，将数据可视化。仪表板可<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">在此处</a>获取，您可以将其导入到您的 Kibana 实例中。仪表盘的内容相当广泛，可以回答上述许多问题。</p><p>让我们一起来了解一些问题以及如何回答这些问题！</p><h3>排名前 100 的歌曲的平均时长是多少？</h3><p>要回答这个问题，我们可以使用 Lens 或 ES|QL。让我们来探讨这三种方案。让我们用 Elasticsearch 的方式来正确表述这个问题。我们要找出排名前 100 的歌曲，然后计算所有这些歌曲加在一起的平均持续时间。用 Elasticsearch 术语来说，就是两个聚合：</p><ol><li><p>找出排名前 100 的歌曲</p></li><li><p>计算这 100 首歌曲的平均持续时间。</p></li></ol><p><strong>Lens</strong></p><p>在 Lens 中，这非常简单：创建一个新的 Lens，切换到表格，然后将<code>title</code> 字段拖放到表格中。然后点击<code>title</code> 字段，将大小设置为 100，并设置<code>accuracy</code> 模式。然后将<code>duration</code> 字段拖放到表中，并使用<code>last value</code> ，因为我们只需要每首歌曲持续时间的最后一个值。同一首歌只有一个持续时间。在<code>last value</code> 聚合的底部有一个摘要行下拉菜单，选择<code>average</code> ，它就会显示出来。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="使用 Lens 获取 Spotify 封装数据" /><p><strong>ES|QL</strong></p><p>与 DSL&amp; 聚合语言相比，ES|QL 是一种相当新鲜的语言，但它非常强大且易于使用。要在 ES|QL 中回答同样的问题，您需要编写以下查询：</p><p>让我带您逐步了解这个 ES|QL 查询：</p><ol><li><p><code>from spotify-history</code> - 这就是我们使用的索引模式。</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - 这是第一次汇总，我们正在计算每首歌曲的最长持续时间和每首歌曲的计数。我们使用<code>max</code> 而不是 Lens 中使用的<code>last value</code> ，这是因为 ES|QL 目前没有首字母或末字母。</p></li><li><p><code>sort count desc</code> - 我们按照每首歌曲的收听次数进行排序，因此收听次数最多的歌曲排在最前面。</p></li><li><p><code>limit 100</code> - 我们将结果限制在前 100 首歌曲中。</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - 我们计算歌曲的平均持续时间。</p></li></ol><h3>我是否对某个月份特别感兴趣？</h3><p>要回答这个问题，我们可以借助运行时字段和 ES|QL 使用 Lens。我们马上就会发现，数据中没有直接表示<code>month</code> 的字段，而是需要从<code>@timestamp</code> 字段中计算出来。有多种方法可以做到这一点：</p><ol><li><p>使用运行时场，为透镜供电</p></li><li><p>ES|QL</p></li></ol><p>我个人认为，ES|QL 是更整洁、更快捷的解决方案。</p><p>我们可以利用<code>DATE_EXTRACT</code> 函数从<code>@timestamp</code> 字段中提取月份，然后对其进行汇总。使用 ES|QL 可视化功能，我们可以将其放到仪表盘上。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Spotify Wrapped 每月明细可视化" /><h3>每位艺术家每年的收听时长是多少？</h3><p>这样做的目的是要看艺术家是否只是一朝一夕的事，或者是否会再次出现。如果我没记错的话，Spotify 只显示年度包装前 5 名的艺术家。也许你的第 6 位艺术家一直保持不变，或者他们在第 10 位之后发生了很大变化？</p><p>最简单的表示方法之一就是百分比柱形图。为此，我们可以使用透镜。跟着步骤走：</p><p>拖放<code>listened_to_ms</code> 字段。该字段以毫秒为单位表示您聆听一首歌曲的时间。默认情况下，Lens 将创建<code>median</code> 聚合，我们不希望这样，请将其更改为<code>sum</code> 。在顶部选择<code>percentage</code> ，而不是<code>stacked</code> 作为条形图类型。细目请选择<code>artist</code> ，并注明前 10 名。在<code>Advanced</code> 下拉菜单中，不要忘记选择<code>accuracy mode</code> 。现在，每一个色块都代表了你对这位艺术家的聆听程度。根据时间选择器的不同，条形图可能代表从天、周、月到年的数值。如果需要每周细分，请选择<code>@timestamp</code> ，并将<code>mininum interval</code> 设为<code>year</code> 。从我的情况来看，<code>Fred Again..</code> 是我听得最多的艺术家，我的总收听时间中有近 12% 被<code>Fred Again..</code> 占用。我们还看到，2024 年，<code>Fred Again..</code> 略有下降，但<code>Jamie XX</code> 很大程度上有所增长。如果我们只比较条形图的大小。我们还可以看出，在<code>Billie Eilish</code> 不断播放的同时，2024 酒吧也在不断扩大。这意味着我在 2024 年比 2023 年收听了更多的<code>Billie Eilish</code> 。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="使用 Kibana 实现 Spotify Wrapped 历史可视化" /><h3>每位艺术家每次收听时间与总体收听时间相比，收听率最高的曲目是什么？</h3><p>这真是一个令人咂舌的问题。让我试着解释一下我想说的话。Spotify 会告诉你某位艺术家的热门歌曲，或你的 5 首热门歌曲。这确实很有趣，但艺术家的细分情况又如何呢？我的所有时间都被一首反复播放的歌曲消耗掉了，还是平均分配？</p><p>创建一个新镜头，选择<code>Treemap</code> 作为类型。对于<code>metric</code> ，与之前相同：选择<code>sum</code> 并使用<code>listened_to_ms</code> 作为字段。对于<code>group by</code> ，我们需要两个值。第一个是<code>artist</code> ，然后添加第二个<code>title</code> 。中间结果是这样的</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="使用 Kibana 实现 Spotify Wrapped 历史可视化" /><p>让我们将其更改为前 100 名艺术家，并取消选择高级下拉菜单中的<code>other</code> ，同时启用精确度模式。标题改为前 10 名，并启用精确度模式。最终结果是这样的</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="使用 Kibana 实现 Spotify Wrapped 可视化" /><p>这究竟说明了什么？在不考虑任何时间成分的情况下，我们可以知道，在我所有的 Spotify 收听记录中，我花了 5.67% 收听<code>Fred Again..</code> 。其中，我花了 1.21% 来收听<code>Delilah (pull me out of this)</code> 。有趣的是，是否有一首歌占据了一位艺术家的位置，或者是否还有其他歌曲。树状地图本身就是一种很好的数据分布表现形式。</p><h3>我是否在特定的时间和日期收听？</h3><p>那么，我们可以利用<code>Heat Map</code>.Lens 可视化来回答这个超级简单的问题。创建新透镜，选择<code>Heat Map</code> 。对于<code>Horizontal Axis</code> ，选择<code>dayOfWeek</code> 字段，并将其设置为<code>Top 7</code> ，而不是 Top 3。<code>Vertical Axis</code> 选择<code>hourOfDay</code> ，<code>Cell Value</code> 选择简单的<code>Count of records</code> 。现在，这将产生这个面板：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="使用仪表盘实现 Spotify Wrapped 收听习惯可视化" /><p>在这本《透镜》中有几处恼人的地方，让我在口译时感到不安。让我们试着清理一下。首先，我不太在意图例，请使用顶部的三角形、方形和圆形符号，并禁用它。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Spotify 包装可视化 " /><p>现在，令人讨厌的第二部分是日期排序。周一、周三、周四或其他任何时间，取决于你的价值观。<code>hourOfDay</code> 已正确排序。对日期进行排序的方法是一种有趣的黑客手段，即使用<code>Filters</code> 而不是<code>Top Values</code> 。点击<code>dayOfWeek</code> 并选择<code>Filters</code> ，现在应该是这样的：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="利用 Kibana 仪表板实现 Spotify Wrapped 历史可视化" /><p>现在开始输入日期。每天一个过滤器。<code>"dayOfWeek" : Monday</code> 并给它贴上标签<code>Monday</code> ，然后冲洗并重复。</p><p>但需要注意的是，Spotify 以 UTC+0 为单位提供数据，不包含任何时区信息。当然，他们也会提供 IP 地址和您收听的国家，我们可以从中推断出时区信息，但这可能会很复杂，而且对于像美国这样有多个时区的国家来说，这可能太麻烦了。这一点很重要，因为 Elasticsearch 和 Kibana 都支持时区，只要在<code>@timestamp</code> 字段中提供正确的时区，Kibana 就会自动根据浏览器时间调整时间。</p><p>我们可以看出，我在工作时间是一个非常活跃的倾听者，而在周六和周日就不那么活跃了。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="使用 Kibana 仪表板实现 Spotify 包裹式可视化" /><h2>结论</h2><p>在这篇博客中，我们对 Spotify 数据所提供的错综复杂的信息进行了深入探讨。我们展示了一些简单快捷的方法来启动和运行一些可视化功能。能对自己的收听历史拥有如此大的控制权，实在令人惊叹。查看该系列的其他部分：</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">第 1 部分：如何在 Kibana 中制作自己的 Spotify 包裹</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">第 3 部分：异常检测人口工作</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">第 4 部分：检测数据中的关系</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">第 5 部分：用矢量找到最好的音乐朋友</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[分析]]></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[在本地使用 Ollama 和 Kibana 测试 DeepSeek R1 的 RAG 功能]]></title>
    <description><![CDATA[了解如何运行 DeepSeek 的本地实例，并从 Kibana 内部连接到它。]]></description>
    <content:encoded><![CDATA[<p>大家都在谈论 DeepSeek R1，这是中国对冲基金 High-Flyer 的全新大型语言模型。如今他们推出了一款具备完整思维链推理能力的大型语言模型 (LLM)，对此业界众说纷纭，新闻报道中对此也是猜测不断。对于那些想尝试这个结合 RAG 和 Elasticsearch 向量数据库智能功能的新模型的人，这里有一个快速教程，帮助您使用本地推理开始使用 DeepSeek R1。在此过程中，我们将使用 Elastic 的 Playground 功能，甚至还会发现适用于 RAG 的 Deepseek R1 的一些优缺点。</p><p>以下是我们将在本教程中配置的内容的示意图：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3214cc505e3d4d06/6a17df98dbb4ff12bafb55da/8aafec9011e986cd85b10958544a4d77be81e518-739x419.png" alt="使用 Elasticsearch 和 Ollama 进行 Deepseek 配置" /><h2>使用 Ollama 设置本地推理</h2><p><a href="https://ollama.com/">Ollama</a> 是快速测试一组精选的用于本地推理的开源模型的绝佳方法，深受 AI 开发者的欢迎。</p><h3>在裸机上运行 Ollama</h3><p>在 Mac、Linux 或 Windows 上进行<a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama">本地安装</a>是利用您可能拥有的任何本地 GPU 功能的最简单方法，尤其是对于拥有 M 系列 Apple 芯片的用户而言。安装 Ollama 后，您可以使用以下命令下载并运行 DeepSeek R1。</p><p>您可能需要调整参数大小，使其适合您的硬件。可用的大小可以在<a href="https://ollama.com/library/deepseek-r1">此处</a>找到。</p>ollama run deepseek-r1:7b<p>您可以在终端中与模型聊天，但当您按下 Ctrl+D 退出命令或输入“/bye”时，模型仍会继续运行。要查看模型仍在运行，请输入：</p>ollama ps<h3>在容器中运行 Ollama</h3><p>或者，运行 Ollama 的最快方法是使用 Docker 这样的容器引擎。使用本地计算机的 GPU 并不总是那么简单，具体取决于环境，但只要容器具备足够的 RAM 和存储空间以运行多 GB 的模型，就能轻松完成快速测试设置。</p><p>在 Docker 中启动并运行 Ollama 就像执行以下命令一样简单：</p>mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama
<p>这将在当前目录中创建一个名为“ollama”的目录，并将其挂载到容器内以存储 Ollama 配置和模型。根据所使用的参数数量，它们的大小可能从几 GB 到几十 GB 不等，因此请确保选择拥有足够可用空间的卷。</p><p>注意：如果您的计算机上有 Nvidia GPU，请确保安装 <a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation">Nvidia 容器工具包</a>，并在上面的 docker 运行命令中添加“--gpus=all”。</p><p>一旦 Ollama 容器在您的机器上运行起来，您就可以拉取一个类似 deepseek-r1 的模型：</p>docker exec -it ollama ollama pull deepseek-r1:7b<p>与裸机方法类似，您可能需要调整参数大小以适合您的硬件。可用的大小可以在 <a href="https://ollama.com/library/deepseek-r1">https://ollama.com/library/deepseek-r1</a> 中找到。</p><p>模型拉取完成后，您可以输入“/bye”退出提示符。要验证模型是否仍在运行：</p>docker exec -it ollama ollama ps<h2>使用 curl 测试我们的本地推理</h2><p>要使用 curl 测试本地推理，您可以运行以下命令。我们使用 stream:false 以便可以轻松读取 JSON 叙事性响应：</p>curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "prompt":"Why is Elastic so cool?"
}'<h2>测试“OpenAI 兼容”的 Ollama 和 RAG 提示</h2><p>方便的是，Ollama 还提供一个 REST 终端，可模仿 OpenAI 的行为，以便与包括 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>测试这个更复杂的提示会生成包含 &lt;think&gt; 部分的内容，模型在该部分经过训练以推理解决问题。</p>&lt;think&gt; 
Okay, so I need to figure out what the user is asking for here. They provided a context where the sky is described as purple today and then asked about how the sky looks. At first glance, it seems straightforward—maybe they just want confirmation or more details on why the sky is that color.
Wait, but maybe there's something deeper. Purple skies aren't something I encounter every day. It usually happens at certain times of the year, like during sunrise or sunset with the sun setting in pink or orange. Could this be a hint about the time of day? Or perhaps it's just an unusual natural phenomenon? 
I should consider if \"purple\" is a typo. Maybe they meant something else like blue or gray. But since they specifically said purple, I'll go with that. Purple skies can happen when there are atmospheric conditions that scatter light differently, maybe due to pollution or cloud cover affecting the sunset.

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

The color of the sky today is described as purple. This unusual shade can occur due to atmospheric conditions affecting light scattering, such as during sunrise/sunset with pollution or cloud cover influencing the sunset's hues.<h2>将 Ollama 连接到 Kibana</h2><p>使用 Elasticsearch 的一个好方法是“<a href="https://github.com/elastic/start-local?tab=readme-ov-file#-try-elasticsearch-and-kibana-locally">start-local</a>”开发脚本。</p><p>确保您的 Kibana 和 Elasticsearch 能够通过网络访问您的 Ollama。如果您使用的是 Elastic stack 的本地容器设置，则可能需要将“localhost”替换为“host.docker.internal”。或“host.containers.internal”。以获取到主机的网络路径。</p><p>在 Kibana 中，导航至“堆栈管理&gt;警报和见解&gt;连接器”。</p><h3>如果您看到此常见设置警告，该怎么办</h3><p>您需要确保 xpack.encryptedSavedObjects.encryptionKey <a href="https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html">已正确设置</a>。这是在本地 Docker 安装 Kibana 时经常遗漏的一个步骤，因此我将在 Docker 语法中列出修复步骤。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4f7b7be2e04afae/6a17df9a1d1b8391e293e393/b70b4b810bcac1d1599b07da90a98c5c744a38de-497x223.png" alt="" /><p>确保持久化 kibana/config 目录，以便在容器关闭时保存更改。我的 Kibana 容器卷在 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>现在，您可以创建密钥库，并输入一个值，这样连接器密钥就不会以明文形式存储。</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>完全重启整个集群以确保更改生效。</p><h3>创建连接器</h3><p>在连接器配置屏幕（在 Kibana 中，导航到“堆栈管理&gt;警报和见解&gt;连接器”）中，创建一个连接器并选择“OpenAI”类型。</p><p>用以下设置配置连接器</p><ul><li><p>连接器名称：Deepseek（Ollama）</p></li><li><p>选择一个 OpenAI 提供商：其他（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>调整为指向 Ollama 的正确路径。请记住，如果您从容器内调用，请替换 host.docker.internal 或等效项。</p></li></ul></li><li><p>默认模型：deepseek-r1:7b</p></li><li><p>API 密钥：可随意填写，需输入一个值，但具体内容无关紧要</p></li></ul><p>请注意，在连接器设置中测试连接到 Ollama 的自定义连接器目前在 8.17 版中已损坏，但在即将发布的 Kibana 8.18 版本中已修复。</p><p>我们的连接器如下所示：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774e0793eb110f9d/6a17df9c445de981014d004d/4ce214aa953b4090ed112fbde40b01c01fb8f5c7-786x836.png" alt="" /><h2>将向量嵌入数据导入 Elasticsearch</h2><p>如果您已熟悉 Playground 并设置了数据，可以跳转到以下 Playground 步骤，但如果您需要一些快速测试数据，我们需要确保已设置 _inference API。从 8.17 版开始，机器学习分配是动态的，因此要下载并打开 e5 多语言密集向量，我们只需在 Kiban 开发工具中运行以下程序。</p>GET /_inference


POST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{
   "input": "are internet memes about deepseek sound investment advice?"
}<p>如果您尚未执行此操作，这将触发从 Elastic 的模型存储库下载 e5 模型。</p><p>接下来，让我们加载一本公共领域的书籍作为 RAG 上下文。这里有一个从 Project Gutenberg 下载《爱丽丝漫游奇境记》的链接：<a href="https://www.gutenberg.org/cache/epub/11/pg11.txt">链接</a>。将此保存为 .txt 文件。</p><p>导航到 Elasticsearch &gt; 主页 &gt; 上传文件</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c594487844ecb4/6a17df9dfaa9137edb93c786/649042271f34a5e66789b17c39bfe95971c7f4ce-1360x629.png" alt="" /><p>选择或拖放您的文本文件，然后点击“导入”按钮。</p><p>在“导入数据”屏幕上选择“高级”选项卡，然后将索引名称设为“book_alice”。</p><p>选择“添加其他字段”选项，它位于“自动创建字段”的正下方。选择“添加语义文本字段”，将推理终端更改为“.multilingual-e5-small-elasticsearch”。选择“添加”，然后选择“导入”。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9c22ccdaee8590/6a17df9f3e03d731f94f2b8e/e58d5c9a2d406d8e62eb96cab9ac98ca89414346-507x602.png" alt="" /><p></p><p>加载和推理过程完成后，我们就可以前往 Playground。</p><h2>在 Playground 中测试 RAG</h2><p>在 Kibana 中，导航至“Elasticsearch &gt; Playground”。</p><p>在 Playground 屏幕上，您应该会看到一个绿色复选标记和“LLM 已连接”，以指示连接器存在。这就是我们刚刚在上面创建的 Ollama 连接器。可以在<a href="https://www.elastic.co/guide/en/kibana/current/playground.html">此处</a>找到有关 Playground 的更长指南。</p><p>点击蓝色的“添加数据源”，然后选择我们之前创建的 book_alice 索引或你之前配置的使用推理 API 的其他索引。</p><p>Deepseek 是一种具有强一致性特征的链式思维模型。从 RAG 的角度来看，这既有好处也有坏处。思维链训练可能有助于 Deepseek 理解引文中看似矛盾的陈述，但由于与训练知识的强烈一致性，它可能更倾向于其自身版本的世界事实，而非我们的上下文基础。尽管出发点是好的，但这种强烈的一致性众所周知会使 LLM 在讨论我们的私人知识与训练数据集有冲突或未得到很好体现的主题时难以指导。</p><p>在 Playground 设置中，我们输入了以下系统提示：“您是使用《爱丽丝梦游仙境》一书中的相关文本段落回答问题的助手”，并接受了其他默认设置。</p><p>对于“谁参加了茶话会？”这个问题，我们得到的答案是：“答案：三月兔、帽匠和睡鼠参加了茶话会。[引用：位置 1 和 2]”，这是正确的。
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ce6a0facd972fdd/6a17dfa03e03d79aaa4f2b92/e8af3ff93a72e1f02de8e73f6c2606cbc19970e5-1296x813.png" alt="" /><p>我们可以在 &lt;think&gt; 标签中看到，Deepseek 确实仔细考虑了引用内容以回答问题。</p><h2>测试对齐限制</h2><p>让我们为 Deepseek 创建一个具有智力挑战性的场景来进行测试。我们将创建一个索引，包含 Deepseek 的训练数据已知不属实的阴谋论。</p><p>在 Kibana 开发工具中，我们来创建以下索引和数据：</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>
这些阴谋论将作为我们为 LLM 提供的上下文依据。尽管采用了激进的系统提示，Deepseek 仍不会接受我们的事实版本。如果我们处于一种情况，知道我们的私有数据更值得信赖、更有根据或更符合我们组织的需求，这将是不可接受的：</p><p>对于测试问题“鸟是真实存在的吗？”（解释<a href="https://knowyourmeme.com/memes/birds-arent-real">了解你的梗</a>），我们得到的答案是“在提供的上下文中，鸟不被视为真实存在的，但在现实中，它们是真实存在的动物。[上下文：位置 1]”。这项测试证明了 DeepSeek R1 的强大功能，即使是在 7B 参数级别......不过，根据我们的数据集，它可能并非 RAG 的最佳选择。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e8dabf65ea200e1/6a17dfa2ec0f8982135a6541/67d5f6cdb97bfd3adb926cbd588c768f9d6730ae-1277x737.png" alt="" /><h2>那么我们学到了什么？</h2><p>总而言之：</p><ul><li><p>在 Ollama 等工具中本地运行模型是窥探模型行为的绝佳选择。</p></li><li><p>DeepSeek R1 是一种推理模型，这意味着它在 RAG 等用例中各有利弊。</p></li><li><p>Playground 能够通过类似于 OpenAI 的 REST API 连接到 Ollama 等推理托管框架，这种方式正逐渐成为 AI 托管早期阶段的事实标准。</p></li></ul><p>总之，我们对本地“隔离网络”RAG 的发展程度印象深刻。自 2023 年我们首次撰写有关<a href="https://www.elastic.co/search-labs/blog/privacy-first-ai-search-langchain-elasticsearch">隐私优先 AI 搜索</a>的文章以来，Elasticsearch、Kibana 中的工具以及可用的开放权重模型都有了长足的进步。</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[使用 Kibana 将地理空间数据输入 Elasticsearch，以便在 ES|QL 中使用]]></title>
    <description><![CDATA[如何使用 Kibana 和 csv 摄取处理器将地理空间数据摄取到 Elasticsearch 中，以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能，ES|QL 将大幅提高易用性和 OGC 熟悉度。但要使用这些功能，我们需要地理空间数据。]]></description>
    <content:encoded><![CDATA[<p>我们最近发布了一篇博客，介绍了如何使用 Elasticsearch 新的强大<a href="https://www.elastic.co/search-labs/blog/esql-piped-query-language-goes-ga"> 管道式查询语言</a><a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one"> ES|QL</a><a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one"> 中 的新</a><a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one"> 地理空间搜索 功能</a> 。要使用这些功能，您需要在 Elasticsearch 中保存地理空间数据。因此，在本博客中，我们将向您展示如何获取地理空间数据，以及如何在 ES|QL 查询中使用这些数据。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" alt="ESQL 地理空间搜索" /><h2>使用 Kibana 导入地理空间数据</h2><p>我们在上一篇博客的示例中使用的数据是基于我们内部用于集成测试的数据。为方便起见，我们在此以 CSV 文件的形式提供了这些信息，您可以使用 Kibana 轻松导入这些信息。数据包括机场、城市和城市边界。您可以从以下网址下载数据</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">机场.csv</a></p><ul><li><p>其中包含三个数据集的合并：</p><ul><li><p>来自<a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/">Natural Earth</a>的机场（名称、位置和相关数据</p></li><li><p>来自<a href="https://simplemaps.com/data/world-cities">SimpleMaps</a>的城市位置</p></li><li><p><a href="https://www.partow.net/miscellaneous/airportdatabase/">全球机场数据库</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>其中包含上述机场和城市名称与一个新来源的合并：</p><ul><li><p>来自<a href="https://www.openstreetmap.org/">OpenStreetMap</a>的城市边界</p></li></ul></li></ul></li></ul><p>您可以猜到，我们花了一些时间将这些数据源合并到上述两个文件中，目的是测试 ES|QL 的地理空间特性。这可能与您的具体数据需求不尽相同，但希望这能让您对可能的情况有所了解。我们特别想展示几件有趣的事情：</p><ul><li><p>将包含地理空间字段的数据与其他可索引数据一起导入</p></li><li><p>同时导入<code>geo_point</code> 和<code>geo_shape</code> 数据并在查询中一起使用</p></li><li><p>将数据导入可使用空间关系连接的两个索引中</p></li><li><p>创建摄取管道以促进未来的导入（超越 Kibana）</p></li><li><p>摄取处理器的一些示例，如<code>csv</code> 、<code>convert</code> 和 <code>split</code></p></li></ul><p><a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">虽然我们将在本博客中讨论 如何</a><a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html"> 使用</a> CSV 数据，但重要的是要了解 使用<a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html"> Kibana</a><a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html"> 添加地理数据的 几种方法</a> 。在地图应用程序中，您可以上传 CSV、GeoJSON 和 ESRI ShapeFiles 等分隔数据，还可以直接在地图中绘制图形。在本博客中，我们将重点介绍从 Kibana 主页导入 CSV 文件。</p><h3>导入机场</h3><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>、我们需要处理一些有趣的怪癖。首先，列之间有额外的空白分隔，这不是 CSV 文件的典型特征。其次，<code>type</code> 字段是一个多值字段，我们需要将其分割成不同的字段。最后，有些字段不是字符串，需要转换为正确的类型。所有这些都可以使用 Kibana 的 CSV 导入功能来完成。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt393bc416bf425301/6a16f707839dfa1e86dcfca9/b1afd8c95973bec32f229a9adfaef14680b09a8e-1944x478.png" alt="Kibana 上传 - 预览" /><p>从 Kibana 主页开始。有一个名为"添加集成入门" 的部分，其中有一个名为"上传文件" 的链接：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte12fc741edab20d3/6a16f709acf088600fbe98bf/996372bb3a52859cc840bd1d8f984a33a0e7ada3-1180x410.png" alt="Kibana 主页 - 上传文件" /><p>点击该链接，您将进入"Upload file" 页面。在此，您可以拖放<code>airports.csv</code> 文件，Kibana 将分析该文件并为您提供数据预览。它应该会自动检测到分隔符是逗号，第一行是标题行。但是，假设所有字段都是<code>text</code> 或<code>keyword</code> ，它可能没有修剪列之间多余的空白，也没有确定字段的类型。我们需要解决这个问题。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf65a09ec0c7a61ad/6a16f70ad7c0227aedde626f/1d9ffa6cdbc0d67a228be1a747ec1ebda6a63099-1800x538.png" alt="Kibana 上传 - 预览" /><p>单击<code>Override settings</code> 并选中<code>Should trim fields</code> 复选框 ，然后<code>Apply</code> 关闭设置。现在，我们需要确定字段的类型。可在下一页查看，请点击<code>Import</code> 。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda9a5f85d8e693dc/6a16f70c60084b72f53c4348/a97aceffb1858eae26a213336913505ae9923b03-1800x526.png" alt="Kibana 上传 - 导入" /><p>首先选择一个索引名称，然后选择<code>Advanced</code> ，进入字段映射和摄取处理器页面。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt56705083cdd9eb18/6a16f70d66c4f93350f8bdbb/058b0fb09da0b8d7f9c9b0a9c83b8b485ce43925-1440x629.png" alt="Kibana 上传 - 字段映射" /><p>在此，我们需要对索引的字段映射和导入数据的摄取管道进行更改。首先，虽然 Kibana 可能会将<code>scalerank</code> 字段自动检测为<code>long</code> ，但却误将<code>location</code> 和<code>city_location</code> 字段视为<code>keyword</code> 。将它们编辑为<code>geo_point</code> ，最后得到类似的映射：</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>您在这里有一定的灵活性，但要注意的是，您选择的类型会影响字段的索引方式和可能的查询类型。例如，如果将<code>location</code> 设置为<code>keyword</code> ，则无法对其执行任何地理空间搜索查询。同样，如果将<code>elevation</code> 设置为<code>text</code> ，则无法对其执行数值范围查询。</p><p>现在是修复摄取管道的时候了。如果 Kibana 自动检测到<code>scalerank</code> 如上所示<code>long</code> ，它还会添加一个处理器，将字段转换为<code>long</code> 。我们需要为<code>elevation</code> 字段添加一个类似的处理器，这次将其转换为<code>double</code> 。编辑管道，确保您已将此转换到位。在保存之前，我们还需要进行一次转换，将<code>type</code> 字段分成多个字段。在管道中添加<code>split</code> 处理器，配置如下</p>{
  "split": {
    "field": "type",
    "separator": ":",
    "ignore_missing": true
  }
}<p>最终的摄取管道应该是这样的</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>请注意，我们没有为<code>location</code> 和<code>city_location</code> 字段添加转换处理器。这是因为字段映射中的<code>geo_point</code> 类型已经了解这些字段中数据的WKT格式。<code>geo_point</code> 类型可以理解一系列格式，包括<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html">WKT、GeoJSON 等</a>。例如，如果我们在 CSV 文件中有<code>latitude</code> 和<code>longitude</code> 两列，我们就需要添加<code>script</code> 或<code>set</code> 处理器，将这两列合并为一个<code>geo_point</code> 字段（例如。<code>"set": {"field": "location", "value": "{{lat}},{{lon}}"}</code>).</p><p>现在我们可以导入文件了。点击<code>Import</code> ，数据就会按照我们刚刚定义的映射和摄取管道导入索引。如果在摄取数据时出现任何错误，Kibana 会在这里报告，这样你就可以编辑源数据或摄取管道，然后再试一次。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte81621425c7289c5/6a16f70f839dfaf608dcfcad/55dde2940c7aba66ce8257d15007ef797b8a5107-1440x415.png" alt="Kibana 上传 - 导入" /><p>请注意，新的摄取管道已经创建。可进入 Kibana 的<code>Stack Management</code> 部分，选择<code>Ingest pipelines</code> 查看。在这里，您可以看到我们刚刚创建的管道，如有必要，还可以对其进行编辑。事实上，<code>Ingest pipelines</code> 部分可用于创建和测试摄取管道，如果你计划进行更复杂的摄取，这是一项非常有用的功能。</p><p>如果您想立即探索这些数据，请跳到后面的章节，但如果您还想导入城市边界，请继续阅读。</p><h3>导入城市边界</h3><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>中的城市边界文件导入更为简单。它包含一个<code>city_boundary</code> 字段和一个<code>city_location</code> 字段，前者是城市边界的 WKT 表示法，如<code>POLYGON</code> ，后者是城市位置的<code>geo_point</code> 表示法。我们可以用与机场数据类似的方式导入这些数据，但有一些不同之处：</p><ul><li><p>我们需要选择覆盖设置<code>Has header row</code> ，因为这不是自动检测到的</p></li><li><p>我们不需要修剪字段，因为数据中已经没有多余的空白了</p></li><li><p>由于所有类型都是字符串或空间类型，因此我们无需编辑采集管道</p></li><li><p>不过，我们必须编辑字段映射，将<code>city_boundary</code> 字段设置为<code>geo_shape</code> ，将<code>city_location</code> 字段设置为 <code>geo_point</code></p></li></ul><p>我们最终的字段映射如下</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>与之前的<code>airports.csv</code> 导入一样，只需单击<code>Import</code> 即可将数据导入索引。数据将通过我们编辑的映射和 Kibana 定义的摄取管道导入。</p><h3>使用开发工具探索地理空间数据</h3><p>在 Kibana 中，通常使用"Discover" 探索索引数据。不过，如果您打算使用 ES|QL 查询编写自己的应用程序，尝试访问原始 Elasticsearch API 可能会更有趣。Kibana 有一个方便的控制台，可用于尝试编写查询。这就是所谓的<code>Dev Tools</code> 控制台，可以在 Kibana 侧边栏中找到。该控制台直接与 Elasticsearch 集群对话，可用于运行查询、创建索引等。</p><p>试试以下方法：</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>结果如下</p><p>距离</p><p>缩写</p><p>名字</p><p>位置</p><p>国家</p><p>城市</p><p>标高</p><p>273418.05776847183</p><p>火腿</p><p>汉堡</p><p>点 (10.005647830925 53.6320011640866)</p><p>德国</p><p>诺德施泰特</p><p>17.0</p><p>337534.653466062</p><p>TXL</p><p>柏林泰格尔国际机场</p><p>点 (13.2903090925074 52.5544287044101)</p><p>德国</p><p>霍恩诺恩多夫</p><p>38.0</p><p>483713.15032266214</p><p>OSL</p><p>奥斯陆加德尔莫尼</p><p>点 (11.0991032762581 60.1935783171386)</p><p>挪威</p><p>奥斯陆</p><p>208.0</p><p>522538.03148094116</p><p>BMA</p><p>Bromma</p><p>点（17.9456175406145 59.3555902065112）</p><p>瑞典</p><p>斯德哥尔摩</p><p>15.0</p><p>522538.03148094116</p><p>ARN</p><p>阿尔兰达</p><p>点 (17.9307299016916 59.6511203397372)</p><p>瑞典</p><p>斯德哥尔摩</p><p>38.0</p><p>624274.8274399083</p><p>DUS</p><p>杜塞尔多夫国际机场</p><p>点 (6.76494446612174 51.2781820420774)</p><p>德国</p><p>杜塞尔多夫</p><p>45.0</p><p>633388.6966435644</p><p>PRG</p><p>鲁兹恩</p><p>点 (14.2674849854076 50.1076511703671)</p><p>捷克</p><p>布拉格</p><p>381.0</p><p>635911.1873311149</p><p>AMS</p><p>史基浦机场</p><p>点 (4.76437693232812 52.3089323889822)</p><p>荷兰</p><p>霍夫多尔普</p><p>-3.0</p><p>670864.137958866</p><p>法国</p><p>法兰克福国际机场</p><p>点 (8.57182286907608 50.0506770895207)</p><p>德国</p><p>法兰克福</p><p>111.0</p><p>683239.2529970079</p><p>WAW</p><p>奥克西国际机场</p><p>点 (20.9727263383587 52.171026749259)</p><p>波兰</p><p>Piaseczno</p><p>111.0</p><h2>使用 Kibana 地图可视化地理空间数据</h2><p>Kibana 地图是可视化地理空间数据的强大工具。它可用于创建具有多个图层的地图，每个图层代表不同的数据集。数据可以通过各种方式进行过滤、汇总和样式化。在本节中，我们将向您展示如何使用上一节导入的数据在 Kibana 地图中创建地图。</p><p>在 Kibana 菜单中，导航至<code>Analytics</code>-&gt;<code>Maps</code> ，打开新的地图视图。单击<code>Add Layer</code> ，选择<code>Documents</code> ，选择数据视图<code>airports</code> ，然后编辑图层样式，使用<code>elevation</code> 字段为标记着色，这样我们就可以很容易地看到每个机场的高度。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcc4736d88c1abc9/6a16f7102b835f7353f4afca/9e63726d7c059331e6e20e474f8abee53dc2cbb4-840x388.png" alt="Kibana 地图 - 机场图层样式" /><p>单击 "保持更改 "保存地图：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ec3cc535b5c21d8/6a16f71375879ec091fe15dc/32ad1dadb5d341a2b66662c58638b781122fc22c-2852x1528.png" alt="Kibana 地图 - 机场" /><p>现在添加第二个图层，这次选择<code>airport_city_boundaries</code> 数据视图。这次，我们将使用<code>city_boundary</code> 字段对图层进行样式设置，并将填充颜色设为淡蓝色。这将在地图上显示城市边界。确保对图层重新排序，以确保机场标记位于顶部。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2932d7ff4a7206c9/6a16f7156f7f0409f09145c7/53dd65026f9a98c13f2cc4f9328a79242f0b70de-2854x1510.png" alt="Kibana 地图 - 城市边界图层样式" /><h2>空间连接</h2><p>ES|QL 不支持<code>JOIN</code> 命令，但可以使用<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich"><code>ENRICH</code></a> <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich">命令</a>实现连接的特殊情况。该命令的操作类似于 SQL 中的 "左连接"，允许您根据两个数据集之间的空间关系，用另一个索引中的数据来丰富一个索引的结果。</p><p>例如，我们可以通过查找包含机场位置的城市边界，用机场服务城市的附加信息来丰富机场表的结果，然后对结果进行一些统计：</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>如果不先准备 enrich 索引就运行该查询，将会收到类似的错误信息：</p>cannot find enrich policy [city_boundaries]<p>如前所述，这是因为 ES|QL 不支持真正的<code>JOIN</code> 命令。其中一个重要原因是 Elasticsearch 是一个分布式系统，而连接是一种昂贵的操作，很难扩展。不过，<code>ENRICH</code> 命令的效率相当高，因为它利用了专门编制的在整个集群中复制的丰富索引，从而可以在每个节点上执行本地连接。</p><p>为了更好地理解这一点，让我们把重点放在上面查询中的<code>ENRICH</code> 命令上：</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary<p>该命令指示 Elasticsearch 丰富从<code>airports</code> 索引中获取的结果，并在原始索引的<code>city_location</code> 字段和<code>airport_city_boundaries</code> 索引的<code>city_boundary</code> 字段之间执行<code>intersects</code> 连接，我们在前面的几个示例中使用了该连接。但其中一些信息在该查询中并不清晰。我们看到的是丰富策略的名称<code>city_boundaries</code> ，缺失的信息被封装在该策略定义中。</p>{
  "geo_match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>在这里我们可以看到，它将执行<code>geo_match</code> 查询（<code>intersects</code> 是默认值），要匹配的字段是<code>city_boundary</code> ，而<code>enrich_fields</code> 是我们要添加到原始文档中的字段。其中一个字段<code>region</code> 实际上被用作<code>STATS</code> 命令的分组键，如果没有这种 "左连接 "功能，我们是做不到这一点的。有关 enrich 策略的更多信息，请参阅<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/enrich-setup.html">enrich 文档</a>。</p><p>Elasticsearch 中的丰富索引和策略最初是为在索引时使用另一个准备好的丰富索引中的数据来丰富数据而设计的。不过，在 ES|QL 中，<code>ENRICH</code> 命令在查询时工作，不需要使用摄取管道。这实际上使它与 SQL<code>LEFT JOIN</code> 非常相似，只是不能连接任何两个索引，只能在左侧连接一个普通索引，在右侧连接一个专门编制的丰富索引。</p><p>无论在哪种情况下，无论是用于摄取管道还是在 ES|QL 中使用，都有必要执行一些准备步骤来设置丰富索引和策略。上文我们已经导入了<code>airport_city_boundaries</code> 索引，但在<code>ENRICH</code> 命令中，它不能直接用作丰富索引。我们首先需要执行两个步骤：</p><ul><li><p>创建上述丰富策略，以定义源索引、源索引中要匹配的字段以及匹配后要返回的字段。</p></li><li><p>执行该策略可创建丰富索引。这将建立一个特殊的内部索引，将原始源索引读取到一个更高效的数据结构中，并在整个集群中复制。</p></li></ul><p>可以使用以下命令创建丰富策略：</p>PUT /_enrich/policy/city_boundaries
{
  "match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>可以使用以下命令执行该策略：</p>POST /_enrich/policy/city_boundaries/_execute<p>请注意，如果您更改了<code>airport_city_boundaries</code> 索引的内容，则需要重新执行该策略，才能在丰富索引中看到更改的内容。现在，让我们再次运行原始 ES|QL 查询：</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>这将返回拥有最多机场的前 5 个区域，以及所有匹配区域机场的中心点和这些区域内城市边界的 WKT 表示长度范围：</p><p>中心点</p><p>计数</p><p>地区</p><p>点（-12.13908685930073331.024386116624648)</p><p>126</p><p>无效</p><p>点（-83.1039831787347842.300230911932886)</p><p>3</p><p>底特律</p><p>点 (39.74537850357592 47.21613017376512)</p><p>3</p><p>городской округ Батайск</p><p>点（-156.8098678719252320.476673701778054)</p><p>3</p><p>夏威夷</p><p>点（-73.9451533276587740.70366442203522)</p><p>3</p><p>纽约市</p><p>点（-83.1039831787347842.300230911932886)</p><p>3</p><p>底特律</p><p>点（-76.6687301918864324.306286952923983)</p><p>2</p><p>新普罗维登斯</p><p>点 (-3.0252167768776417 51.39245774131268)</p><p>2</p><p>加的夫</p><p>点（-115.4099348466843432.73126147687435)</p><p>2</p><p>墨西卡利市</p><p>点 (41.790108773857355 50.302146775648)</p><p>2</p><p>Центральный район</p><p>点（-73.8890273217111845.57078813901171)</p><p>2</p><p>蒙特利尔</p><p>您可能还会注意到，最常见的地区是<code>null</code> 。这意味着什么？回想一下，我曾将此命令比作 SQL 中的 "左连接"，也就是说，如果没有为某个机场找到匹配的城市边界，则仍会返回该机场，但<code>airport_city_boundaries</code> 索引中的字段值为<code>null</code> 。结果发现，有 125 个机场没有找到匹配的<code>city_boundary</code> ，有一个机场找到了匹配的<code>region</code> 字段，但该字段是<code>null</code> 。这样就统计出了 126 个机场，结果中没有<code>region</code> 。如果您的用例要求所有机场都能与城市边界相匹配，那就需要获取更多数据来填补空白。有必要确定两件事：</p><ul><li><p><code>airport_city_boundaries</code> 索引中哪些记录没有<code>city_boundary</code> 字段</p></li><li><p><code>airports</code> 索引中哪些记录与<code>ENRICH</code> 命令不匹配（即"......"）。不相交）</p></li></ul><h2>在 Kibana 地图中使用 ES|QL 获取地理空间数据</h2><p>Kibana 在地图应用程序中添加了对空间 ES|QL 的支持。这意味着您现在可以使用 ES|QL 在 Elasticsearch 中搜索地理空间数据，并在地图上将结果可视化。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91922eb4ef43d290/6a16f7161949f737bfe7a7b5/bd78470bd8a4bc60f0db7006bd804b8fe87e2fea-1440x683.png" alt="Kibana 层 ES|QL" /><p>在添加图层菜单中有一个新的图层选项，名为"ES|QL" 。与迄今为止介绍的所有地理空间功能一样，该功能在"技术预览版" 中。选择该选项可根据 ES|QL 查询结果在地图上添加图层。例如，您可以在地图上添加一个图层，显示世界上所有的机场。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5185ef7461d7e81d/6a16f718839dfa1559dcfcb1/1dd28d3d0509f92d26b0bb5320a2925f7a54c5d9-1440x736.png" alt="Kibana ES|QL - 机场" /><p>或者您也可以添加一个图层，显示<code>airport_city_boundaries</code> 索引中的多边形，或者更好的办法是使用上面那个复杂的<code>ENRICH</code> 查询，生成每个地区有多少个机场的统计数据？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt51ee3543bb811d98/6a16f71a8b73cbbe63189df1/679a0a401faa613c7cedddd07c64f614ac2b7144-1440x727.png" alt="Kibana ES|QL - 区域统计" /><h2>后续工作计划</h2><p>上一篇<a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">地理空间搜索</a>博客主要介绍了使用<code>ST_INTERSECTS</code> 等函数进行搜索的方法，Elasticsearch 自 8.14 版起提供了这些功能。本博客将向您展示如何导入我们用于这些搜索的数据。不过，Elasticsearch 8.15 提供了一个特别有趣的功能：<code>ST_DISTANCE</code> ，可用于执行高效的空间距离搜索，这将是下一篇博客的主题！</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>