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。如果这种启发式方法是不可取的,则可以使用此参数对每个碎片考虑的数量进行重载。 |
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。