编写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的结果,省去后续额外筛选步骤。
- 通过Painless脚本遍历
total_issues子聚合:统计每个位置对应的问题总数,方便你直观查看具体的问题数量。
如果你的索引后续能把纬度、经度单独拆成独立字段存储,那查询可以更简洁——直接按这两个字段做terms聚合即可,但针对你当前提供的文档结构,上面的脚本方式是最适配的方案。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

