5.2.11. Geohash 网格聚合

未匹配的标注

Geohash 网格聚合

一种对 geo_point 字段操作的多桶聚合,并将点分组到代表网格中单元的桶中。生成的网格可能是稀疏的,它只包含匹配到数据的单元。每个单元使用用户可自定义精度的 geohash 进行标记。

  • 高精度的 geohashes 具有较长的字符串长度,表示仅覆盖很小面积的单元。
  • 低精度的 geohashes 具有较短的字符串长度,表示覆盖面积很大的单元。

在该聚合中 geohashes 精度可选范围为 1 到 12。

警告
长度为 12 的最高精度的 geohash 产生的单元覆盖的土地不到一平方米,因此,就 RAM 和结果大小而言,高精度请求可能非常昂贵。请参考下面的示例,了解一下在请求高级信息之前,如何将聚合过滤到较小的地理区域。

指定字段必须为 geo_point 类型(只能在映射中显式设置),多个 geo_point 字段可以保存为一个数组,该情况下,在聚合期间将考虑该数组中所有点。

简单的低精度请求

PUT /museums
{
    "mappings": {
          "properties": {
              "location": {
                  "type": "geo_point"
              }
          }
    }
}

POST /museums/_bulk?refresh
{"index":{"_id":1}}
{"location": "52.374081,4.912350", "name": "NEMO Science Museum"}
{"index":{"_id":2}}
{"location": "52.369219,4.901618", "name": "Museum Het Rembrandthuis"}
{"index":{"_id":3}}
{"location": "52.371667,4.914722", "name": "Nederlands Scheepvaartmuseum"}
{"index":{"_id":4}}
{"location": "51.222900,4.405200", "name": "Letterenhuis"}
{"index":{"_id":5}}
{"location": "48.861111,2.336389", "name": "Musée du Louvre"}
{"index":{"_id":6}}
{"location": "48.860000,2.327000", "name": "Musée d'Orsay"}

POST /museums/_search?size=0
{
    "aggregations" : {
        "large-grid" : {
            "geohash_grid" : {
                "field" : "location",
                "precision" : 3
            }
        }
    }
}

响应结果:

{
    ...
    "aggregations": {
        "large-grid": {
            "buckets": [
                {
                    "key": "u17",
                    "doc_count": 3
                },
                {
                    "key": "u09",
                    "doc_count": 2
                },
                {
                    "key": "u15",
                    "doc_count": 1
                }
            ]
        }
    }
}

高精度要求

当请求详细的存储库(通常用于显示“放大”的地图)时,需要使用[geo_bounding_box](www.elastic.co/guide/en/elasticsea...) 应用于缩小主题范围,否则可能会创建并返回数百万个存储库。

POST /museums/_search?size=0
{
    "aggregations" : {
        "zoomed-in" : {
            "filter" : {
                "geo_bounding_box" : {
                    "location" : {
                        "top_left" : "52.4, 4.9",
                        "bottom_right" : "52.3, 5.0"
                    }
                }
            },
            "aggregations":{
                "zoom1":{
                    "geohash_grid" : {
                        "field": "location",
                        "precision": 8
                    }
                }
            }
        }
    }
}

也可以使用”geohash_grid”聚合返回的geohash进行放大。要放大上一示例中返回的第一个geohash u17,应将其同时指定为”top_left”和”bottom_right”

POST /museums/_search?size=0
{
    "aggregations" : {
        "zoomed-in" : {
            "filter" : {
                "geo_bounding_box" : {
                    "location" : {
                        "top_left" : "u17",
                        "bottom_right" : "u17"
                    }
                }
            },
            "aggregations":{
                "zoom1":{
                    "geohash_grid" : {
                        "field": "location",
                        "precision": 8
                    }
                }
            }
        }
    }
}
{
    ...
    "aggregations" : {
        "zoomed-in" : {
            "doc_count" : 3,
            "zoom1" : {
                "buckets" : [
                    {
                        "key" : "u173zy3j",
                        "doc_count" : 1
                    },
                    {
                        "key" : "u173zvfz",
                        "doc_count" : 1
                    },
                    {
                        "key" : "u173zt90",
                        "doc_count" : 1
                    }
                ]
            }
        }
    }
}

为了在不支持geohash的系统上“放大”,应使用可用的geohash库之一将存储桶键转换为边界框。 例如,对于javascript,可以使用node-geohash

var geohash = require('ngeohash');

// bbox 包含 [ 52.03125, 4.21875, 53.4375, 5.625 ]
//                   [   minlat,  minlon,  maxlat, maxlon]
var bbox = geohash.decode_bbox('u17');

赤道上的单元尺寸

下表显示了由不同长度的geohash字符串覆盖的单元的度量尺寸。单元格大小随纬度变化,因此该表适用于赤道最坏情况。

地理哈希长度 区域宽度x高度
1 5,009.4km x 4,992.6km
2 1,252.3km x 624.1km
3 156.5km x 156km
4 39.1km x 19.5km
5 4.9km x 4.9km
6 1.2km x 609.4m
7 152.9m x 152.4m
8 38.2m x 19m
9 4.8m x 4.8m
10 1.2m x 59.5cm
11 14.9cm x 14.9cm
12 3.7cm x 1.9cm

选项

字段 必须填写。用地质点索引的字段的名称。
精度 可选。用于定义结果中的单元格/存储桶的geohash的字符串长度。默认为5。精度可以根据上述整数精度级别定义。[1,12]以外的值将被拒绝。或者,精度水平可以从“1km”、“10m”等距离测量中近似。计算精度级别时,单元格将不会超过所需精度的指定大小(对角线)。如果这会导致精度水平高于支持的12个水平(例如,距离<5.6cm),则拒绝该值。
尺寸 可选。要返回的最大geohash存储桶数(默认为10000)。当结果被修剪时,bucket将根据其包含的文档量进行优先级排序。
碎片大小 可选。为了对最终结果中返回的顶部单元格进行更精确的计数,聚合默认为从每个碎片返回max(10,(大小x碎片数))bucket。如果这种启发式方法是不可取的,则可以使用此参数对每个碎片考虑的数量进行重载。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/elasticsearch73...

译文地址:https://learnku.com/docs/elasticsearch73...

上一篇 下一篇
CrazyZard
贡献者:5
讨论数量: 0
发起讨论 只看当前版本


暂无话题~