You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写ElasticSearch查询获取同一经纬度下问题数≥3的地点

Elasticsearch 查询语句:按位置分组统计问题数≥3的地点

没问题,针对你需求的场景——从包含labels数组(存储纬度、经度等标签)的文档中,统计同一位置(经纬度相同)下问题数≥3的地点,我整理了对应的Elasticsearch查询语句:

首先得明确,你的纬度和经度是嵌套在labels数组里的键值对格式,所以需要通过脚本提取出这两个值,再进行分组聚合。以下是完整的查询:

{
  "size": 0,
  "aggs": {
    "group_by_location": {
      "terms": {
        "script": {
          "source": """
            def lat = null;
            def lon = null;
            for (label in doc['labels']) {
              if (label.startsWith('Latitude:')) {
                lat = label.substring(9);
              } else if (label.startsWith('Longitude:')) {
                lon = label.substring(10);
              }
            }
            return lat != null && lon != null ? lat + ',' + lon : 'unknown';
          """,
          "lang": "painless"
        },
        "min_doc_count": 3
      },
      "aggs": {
        "total_issues": {
          "value_count": {
            "field": "issue_number"
          }
        }
      }
    }
  }
}

关键部分解释:

  • size: 0:不需要返回具体文档,只需要聚合结果,设置为0能提升查询性能。
  • terms聚合(group_by_location):
    • 通过Painless脚本遍历labels数组,提取出纬度(从Latitude:后截取内容)和经度(从Longitude:后截取内容),将两者拼接成lat,lon的字符串作为分组标识。
    • min_doc_count: 3:直接过滤出分组内文档数≥3的结果,省去后续额外筛选步骤。
  • total_issues子聚合:统计每个位置对应的问题总数,方便你直观查看具体的问题数量。

如果你的索引后续能把纬度、经度单独拆成独立字段存储,那查询可以更简洁——直接按这两个字段做terms聚合即可,但针对你当前提供的文档结构,上面的脚本方式是最适配的方案。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:16:22