geohash_grid聚合

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

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

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
      }
      ...
    ]
  }
 }
}

您可以使用 UDB-SX Dashboards 将聚合响应可视化在地图上。

您希望聚合越精确,UDB-SX 消耗的资源就越多,这是因为聚合需要计算的桶数量增加了。默认情况下,UDB-SX 生成的桶数不超过 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
        }
      ]
    }
  }
}

目前,UDB-SX 通过 API 支持地理形状聚合,但在 UDB-SX Dashboards 可视化中不支持。

支持的参数

geohash_grid聚合请求支持以下参数。

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

地理哈希精度

地理哈希精度与近似网格单元尺寸之间的关系如下表所述。

精度 /
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 厘米