news 2026/6/17 16:35:16

Kibana:使用 ES|QL 构建地图,对国家或地区的指标进行对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kibana:使用 ES|QL 构建地图,对国家或地区的指标进行对比

作者:来自 Elastic Nathan_Reese

Kibana 地图 教程 “构建地图,用于按国家或地区对比指标” 使用 Elasticsearch 的 DSL 查询 来创建地图。最近新增的 ES|QL 函数 LOOKUP JOIN( 8.18 )和 ST_GEOTILE( 9.2 )使得可以使用 ES|QL 重新创建该教程中的地图。

下面是使用 ES|QL 重新创建该教程地图的步骤。随后,这些步骤还超出了原始教程的能力范围,并按国家人口对分级设色图层进行归一化处理。

前提条件

  • 如果你还没有 Kibana,请使用我们的 免费试用 进行设置。
  • 本教程需要 web logs 示例数据集。
  • 你必须具备创建地图和创建索引的正确权限。

步骤 1:创建 地图

  • 前往 Dashboards。
  • 点击 Create dashboard。
  • 将时间范围设置为 Last 7 days。
  • 点击 Add 按钮并选择 New panel,最后点击 Maps。

步骤 2. 添加一个 choropleth 图层

你将添加的第一个图层是一个 choropleth 图层,用于按 web 日志流量为世界各国着色。较深的颜色表示 web 日志流量较多的国家,较浅的颜色表示流量较少的国家。

索引世界国家

  • 下载世界国家 GeoJSON 文件

  • 在 Kibana maps 中,点击 Add layer

  • 选择 Upload file
  • 在文件选择器中选择世界国家 GeoJSON 文件
  • 将 Index name 设置为 world_countries
  • 打开 Advanced 部分
  • 将 Index settings 设置为 { "index.mode": "lookup" }。

添加 choropleth 图层

  • 点击 Add layer
  • 选择 ES|QL

  • 将 ES|QL statement 设置为
FROM kibana_sample_data_logs | STATS count = COUNT() BY geo.dest | RENAME geo.dest AS iso2.keyword | LOOKUP JOIN world_countries ON iso2.keyword | RENAME iso2.keyword AS geo.dest | KEEP count, geometry, geo.dest

  • 点击 Add and continue
  • 在 Layer settings 中,设置:
    • 将 Name 设置为 Total Requests by Destination。
    • 将 Opacity 设置为 50%。

  • 在 Layer style 中
    • 将 Fill color 设置为 By value by count。选择 “grey to black” 颜色渐变。
    • 将 Border color 设置为 “white”。4.

  • 点击 Keep changes。你的地图现在应该看起来像

步骤 3. 为 Elasticsearch 数据添加图层

为了避免一次向用户展示过多数据,你将为 Elasticsearch 数据添加两个图层。第一个图层在用户放大地图时显示单个文档。第二个图层在用户缩小地图时显示聚合数据。

为单个文档添加图层

此图层将 web 日志文档显示为点。
该图层仅在用户放大时可见。

  • 点击 Add layer
  • 选择 ES|QL

  • 将 ES|QL statement 设置为
FROM kibana_sample_data_logs | KEEP geo.coordinates, agent, bytes, clientip, host, machine.os, request, response, timestamp | LIMIT 10000
  • 在 ES|QL 编辑器中点击 Run query
  • 点击 Add and continue

  • 在 Layer settings 中,设置:
    • 将 Name 设置为 Actual Requests。
    • 将 Visibility 设置为范围 [9, 24]。

  • 在 Layer style 中,设置:
    • 将 Fill color 设置为 #2200FF。
    • 将 Border width 设置为 0。

  • 点击 Keep changes。你的地图现在应该看起来像

为聚合数据添加图层

你将创建一个聚合数据图层,并仅在地图缩小时显示。较深的颜色表示 web 日志流量更多的网格,较浅的颜色表示流量较少的网格。较大的圆表示传输总字节更多的网格,较小的圆表示字节较少的网格。

  • 点击 Add layer
  • 选择 ES|QL

  • 将 ES|QL statement 设置为
FROM kibana_sample_data_logs | EVAL geotile = ST_GEOTILE(geo.coordinates, 6) | STATS count = COUNT(geotile), sumOfBytes = SUM(bytes), centroid = ST_CENTROID_AGG(geo.coordinates) BY geotile

  • 在 ES|QL 编辑器中点击 Run query
  • 点击 Add 并继续
  • 在 Layer settings 中,设置:
    • 将 Name 设置为 Total Requests and Bytes。
    • 将 Visibility 设置为范围 [0, 9]。

  • 在 Layer style 中,设置:
    • 将 Fill color 设置为 By value by count
    • 将 Border width 设置为 0。
    • 将 Symbol size 设置为 By value by sumOfBytes。将最小尺寸设置为 7,最大尺寸设置为 25。
    • 将 Label 设置为 By value by count

  • 点击 Keep changes。你的地图现在应该看起来像

步骤 4. 按国家人口标准化 choropleth 图层

第 2 步创建的 choropleth 图层按 web 日志流量为世界各国着色。由于各国人口不同,直接比较各国的计数并不公平。人口较多的国家可能有更多的 web 流量,而人口较少的国家流量较少。相反,你希望按人口调整后的 web 日志流量为世界各国着色。

ES|QL 可以通过考虑每个国家的总人口来对 web 日志计数进行标准化。我们将可视化每 100,000 人的 web 日志计数,而不是原始计数。现在,我们可以比较各国的标准化计数。

索引世界国家人口

  • 下载 populations_2024.csv文件。该文件来源于 World Bank Group。 下载完毕后,我们必须重新命名文件后缀为 .csv 而不是 .txt。
  • 在 Kibana 中,通过全局搜索字段进入 File upload。

  • 在文件选择器中选择 populations_2024.csv

  • 将 New index name 设置为 populations
  • 点击 Import

向 world_countries 索引添加人口字段

使用 enrich processor 将人口数据添加到世界国家集合中。

  • 通过导航菜单或全局搜索字段进入 Developer tools。
  • 创建一个 match enrichment policy
PUT /_enrich/policy/population_lookup { "match": { "indices": "populations", "match_field": "iso3", "enrich_fields": [ "population_2024"] } }
  • 要初始化该策略,运行:
POST /_enrich/policy/population_lookup/_execute
  • 要创建一个 ingest pipeline,运行:
PUT _ingest/pipeline/add_population_to_world_countries { "processors": [ { "enrich": { "field": "iso3", "policy_name": "population_lookup", "target_field": "population", "ignore_missing": true, "ignore_failure": true } } ] }
  • 要向 world_countries 添加人口数据,运行:
POST world_countries/_update_by_query?pipeline=add_population_to_world_countries
  • 在 Discover 中查看 world_countries 索引。每一行现在都包含 population.population_2024 列。

在 ES|QL statement 中按人口标准化计数

  • 点击 Total Requests by Destination 图层的 edit 按钮。
  • 将 ES|QL statement 替换为
FROM kibana_sample_data_logs | STATS count = COUNT() BY geo.dest | RENAME geo.dest AS iso2.keyword | LOOKUP JOIN world_countries ON iso2.keyword | RENAME iso2.keyword AS geo.dest | KEEP count, geometry, geo.dest, population.population_2024 | EVAL normalized_count = TO_DOUBLE(count) / population.population_2024 * 100000

  • 在 ES|QL 编辑器中点击 Run query

  • 在 Layer style 中将 Fill color 设置为 By value by normalized_count。

  • 点击 Keep changes。

注意:你可能已经猜到,为什么不使用 lookup 设置导入 populations CSV 来对地图查询执行第二次 LOOKUP JOIN。那是可行的!但要注意,每增加一次 join 都会有性能开销。

原文:https://discuss.elastic.co/t/dec-14th-2025-en-build-a-map-to-compare-metrics-by-country-or-region-with-es-ql/383243

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 0:40:37

【滤波跟踪】基于带线性等式约束(LEC)的固定滞后平滑问题研究ASCMKS ASEPKS ASPMKS ASMRKS ASDEKS ASLECKS多种滤波算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/6/16 2:52:45

InoProShop汇川程序学习笔记(一、轴的快速调试)

本文仅适用于部分工程师进行参考,用于快速调试汇川AM500系列PLC快速调试 作者本人长期从事于工业机器人的调试,前置工艺专注于机器人弧焊、喷涂、搬运、点焊等简单工艺。 由于工作调动的原因,最近调动至电气岗位进行工作,以前虽…

作者头像 李华
网站建设 2026/6/13 23:48:04

基于Springboot箱包存储管理系统【附源码+文档】

💕💕作者: 米罗学长 💕💕个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 💕💕各类成品Java毕设 。javaweb,ssm,springboot等项目&#…

作者头像 李华
网站建设 2026/6/15 19:11:28

LLM → 系统级智能体(System-level Agent)的演进

1. 起点:LLM 作为通用认知引擎 核心突破 通过大规模预训练获得:语言理解、生成、一定程度推理与泛化能力。对外表现:对话、写作、总结、编码、问答、推理。 关键缺陷(为什么还不是“智能体”) 被动:只能被问…

作者头像 李华
网站建设 2026/6/16 20:57:36

Function Calling的现状和未来的发展

一、核心摘要Function Calling(函数调用)作为2023年大型语言模型(LLM)突破性技术,标志着AI从单纯的文本生成向具备实际行动能力的智能体系统的关键转变。本报告基于2024-2025年最新技术发展,系统分析Functi…

作者头像 李华