Link Search Menu Expand Document Documentation Menu

Geohash 网格聚合

geohash_grid 聚合将文档分组以进行地理分析。它将地理区域组织成不同大小或精度的较小区域网格。较低的精度值表示较大的地理区域,而较高的精度值表示较小、更精确的地理区域。您可以使用 geohash 网格聚合对地理点(geopoint)地理形状(geoshape)字段上的文档进行聚合。一个显著的区别是地理点只存在于一个桶中,但地理形状在与其相交的所有 geohash 网格单元中都会被计数。

查询返回的结果数量可能过多,无法在地图上单独显示每个地理点。geohash_grid 聚合通过计算每个点的 geohash(精度级别在 1 到 12 之间,默认值为 5),将附近的地理点分组在一起。要了解更多关于 geohash 的信息,请参阅维基百科

Web 日志示例数据分布在广阔的地理区域,因此您可以使用较低的精度值。您可以通过增加精度值来放大此地图

GET opensearch_dashboards_sample_data_logs/_search
{
  "size": 0,
  "aggs": {
    "geo_hash": {
      "geohash_grid": {
        "field": "geo.coordinates",
        "precision": 4
      }
    }
  }
}

示例响应

...
"aggregations" : {
  "geo_hash" : {
    "buckets" : [
      {
        "key" : "c1cg",
        "doc_count" : 104
      },
      {
        "key" : "dr5r",
        "doc_count" : 26
      },
      {
        "key" : "9q5b",
        "doc_count" : 20
      },
      {
        "key" : "c20g",
        "doc_count" : 19
      },
      {
        "key" : "dr70",
        "doc_count" : 18
      }
      ...
    ]
  }
 }
}

您可以使用 OpenSearch Dashboards 在地图上可视化聚合响应。

您希望聚合越精确,OpenSearch 消耗的资源就越多,因为聚合需要计算的桶数量会增加。默认情况下,OpenSearch 生成的桶数量不超过 10,000 个。您可以使用size属性更改此行为,但请记住,对于包含数千个桶的非常宽泛的查询,性能可能会受到影响。

聚合地理形状

要在地理形状字段上运行聚合,首先创建一个索引并将location字段映射为geo_shape

PUT national_parks
{
  "mappings": {
    "properties": {
      "location": {
        "type": "geo_shape"
      }
    }
  }
}

接下来,将一些文档索引到national_parks索引中

PUT national_parks/_doc/1
{
  "name": "Yellowstone National Park",
  "location":
  {"type": "envelope","coordinates": [ [-111.15, 45.12], [-109.83, 44.12] ]}
}

PUT national_parks/_doc/2
{
  "name": "Yosemite National Park",
  "location": 
  {"type": "envelope","coordinates": [ [-120.23, 38.16], [-119.05, 37.45] ]}
}

PUT national_parks/_doc/3
{
  "name": "Death Valley National Park",
  "location": 
  {"type": "envelope","coordinates": [ [-117.34, 37.01], [-116.38, 36.25] ]}
}

您可以按如下方式对location字段运行聚合

GET national_parks/_search
{
  "aggregations": {
    "grouped": {
      "geohash_grid": {
        "field": "location",
        "precision": 1
      }
    }
  }
}

聚合地理形状时,一个地理形状可以被多个桶计数,因为它与多个网格单元重叠

响应
{
  "took" : 24,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "national_parks",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "Yellowstone National Park",
          "location" : {
            "type" : "envelope",
            "coordinates" : [
              [
                -111.15,
                45.12
              ],
              [
                -109.83,
                44.12
              ]
            ]
          }
        }
      },
      {
        "_index" : "national_parks",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "name" : "Yosemite National Park",
          "location" : {
            "type" : "envelope",
            "coordinates" : [
              [
                -120.23,
                38.16
              ],
              [
                -119.05,
                37.45
              ]
            ]
          }
        }
      },
      {
        "_index" : "national_parks",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "name" : "Death Valley National Park",
          "location" : {
            "type" : "envelope",
            "coordinates" : [
              [
                -117.34,
                37.01
              ],
              [
                -116.38,
                36.25
              ]
            ]
          }
        }
      }
    ]
  },
  "aggregations" : {
    "grouped" : {
      "buckets" : [
        {
          "key" : "9",
          "doc_count" : 3
        },
        {
          "key" : "c",
          "doc_count" : 1
        }
      ]
    }
  }
}

目前,OpenSearch 通过 API 支持地理形状聚合,但在 OpenSearch Dashboards 可视化中不支持。如果您希望看到地理形状聚合在可视化中实现,请为相关的 GitHub issue 点赞。

支持的参数

Geohash 网格聚合请求支持以下参数。

参数 数据类型 描述
field(字段) 字符串 执行聚合的字段。此字段必须映射为geo_point(地理点)或geo_shape(地理形状)字段。如果字段包含数组,则所有数组值都将被聚合。必需。
precision(精度) 整数 用于确定结果桶的网格单元的粒度级别。单元格不能超过所需精度的指定大小(对角线)。有效值范围为 [0, 12]。可选。默认值为 5。
bounds(边界) 对象 用于过滤地理点和地理形状的边界框。边界框由左上角和右下角顶点定义。只有与此边界框相交或完全被此边界框包围的形状才会包含在聚合输出中。顶点以地理点形式指定,格式如下:
- 包含纬度和经度的对象
- 以 [longitude(经度), latitude(纬度)] 格式的数组
- 以“latitude(纬度),longitude(经度)”格式的字符串
- Geohash
- WKT
有关格式示例,请参阅地理点格式。可选。
size(大小) 整数 返回的最大桶数。当桶数超过size时,OpenSearch 返回包含更多文档的桶。可选。默认值为 10,000。
shard_size(分片大小) 整数 每个分片返回的最大桶数。可选。默认值为 max (10, size · 分片数量),这提供了更优先桶的更准确计数。

Geohash 精度

Geohash 精度与近似网格单元尺寸之间的关系如下表所示。

精度 /
geohash 长度
纬度位数 经度位数 纬度误差 经度误差 单元格高度 单元格宽度
1 2 3 ±23 ±23 4992.6 公里 5009.4 公里
2 5 5 ±2.8 ±5.6 624.1 公里 1252.3 公里
3 7 8 ±0.70 ±0.70 156 公里 156.5 公里
4 10 10 ±0.087 ±0.18 19.5 公里 39.1 公里
5 12 13 ±0.022 ±0.022 4.9 公里 4.9 公里
6 15 15 ±0.0027 ±0.0055 609.4 米 1.2 公里
7 17 18 ±0.00068 ±0.00068 152.5 米 152.9 米
8 20 20 ±0.00086 ±0.000172 19 米 38.2 米
9 22 23 ±0.000021 ±0.000021 4.8 米 4.8 米
10 25 25 ±0.00000268 ±0.00000536 59.5 厘米 1.2 米
11 27 28 ±0.00000067 ±0.00000067 14.9 厘米 14.9 厘米
12 30 30 ±0.00000008 ±0.00000017 1.9 厘米 3.7 厘米
剩余 350 字符

有问题?

想做贡献?