Elasticsearch 地理位置聚合
Elasticsearch 是一个强大的搜索引擎,支持对地理空间数据进行聚合分析。地理位置聚合(Geo Aggregations)允许你根据地理位置对数据进行分组和分析,适用于地图可视化、区域统计等场景。本文将详细介绍 Elasticsearch 的地理位置聚合功能,并通过代码示例和实际案例帮助你快速上手。
什么是地理位置聚合?
地理位置聚合是 Elasticsearch 提供的一种特殊聚合类型,用于对地理空间数据进行分组和计算。它可以帮助你回答以下问题:
- 某个区域内的文档数量是多少?
- 某个点附近有哪些文档?
- 如何将数据按地理位置进行分组统计?
Elasticsearch 支持多种地理位置聚合类型,包括 geo_distance
、geohash_grid
和 geo_bounds
等。接下来,我们将逐一介绍这些聚合类型。
地理位置聚合类型
1. geo_distance
聚合
geo_distance
聚合允许你根据文档与某个中心点之间的距离进行分组。你可以定义多个距离范围(例如 0-10km、10-20km 等),Elasticsearch 会将文档分配到相应的范围中。
示例代码
假设我们有一个索引 restaurants
,其中包含餐厅的地理位置信息。我们希望统计距离某个中心点 10km、20km 和 30km 范围内的餐厅数量。
{
"size": 0,
"aggs": {
"restaurants_by_distance": {
"geo_distance": {
"field": "location",
"origin": "40.7128,-74.0060", // 纽约市的经纬度
"ranges": [
{ "to": 10 },
{ "from": 10, "to": 20 },
{ "from": 20, "to": 30 }
]
}
}
}
}
输出结果
{
"aggregations": {
"restaurants_by_distance": {
"buckets": [
{ "key": "*-10.0", "from": 0, "to": 10, "doc_count": 15 },
{ "key": "10.0-20.0", "from": 10, "to": 20, "doc_count": 10 },
{ "key": "20.0-30.0", "from": 20, "to": 30, "doc_count": 5 }
]
}
}
}
提示
geo_distance
聚合的单位默认为公里(km),你也可以通过 unit
参数指定其他单位,如 m
(米)、mi
(英里)等。
2. geohash_grid
聚合
geohash_grid
聚合将地理空间数据划分为多个网格(grid),每个网格对 应一个 geohash 值。你可以通过 precision
参数控制网格的大小,精度越高,网格越小。
示例代码
假设我们想将餐厅数据按 geohash 网格进行分组,并统计每个网格中的餐厅数量。
{
"size": 0,
"aggs": {
"restaurants_by_grid": {
"geohash_grid": {
"field": "location",
"precision": 5
}
}
}
}