Looly · 更新于 2018-09-26 08:00:41

范围(边界)聚合器

在geohash聚合器的例子中,我们使用了一个矩形框过滤器来将结果限制在纽约区域。 然而,我们的结果都分布在曼哈顿。 当在地图上呈现给用户时,合理的方式是可以缩放到有数据的区域;地图上有大量空白区域是没有任何点分布的。

范围过滤器是这么做得: 它计算出一个个小矩形框来覆盖到所有的坐标点。


GET /attractions/restaurant/_search?search_type=count
{
  "query": {
    "filtered": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat":  40,8,
              "lon": -74.1
            },
            "bottom_right": {
              "lat":  40.4,
              "lon": -73.9
            }
          }
        }
      }
    }
  },
  "aggs": {
    "new_york": {
      "geohash_grid": {
        "field":     "location",
        "precision": 5
      }
    },
    "map_zoom": { <1>
      "geo_bounds": {
        "field":     "location"
      }
    }
  }
}
  • 范围聚合器会计算出一个最小的矩形框来覆盖查询结果的所有文档。

返回结果包含了一个可以用来在地图上缩放的矩形框:


...
"aggregations": {
  "map_zoom": {
     "bounds": {
        "top_left": {
           "lat":  40.722,
           "lon": -74.011
        },
        "bottom_right": {
           "lat":  40.715,
           "lon": -73.983
        }
     }
  },
...

实际上,我们可以把矩形聚合器放到每一个 geohash 单元里,因为有坐标点的单元只占了所有单元的一部分:


GET /attractions/restaurant/_search?search_type=count
{
  "query": {
    "filtered": {
      "filter": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat":  40,8,
              "lon": -74.1
            },
            "bottom_right": {
              "lat":  40.4,
              "lon": -73.9
            }
          }
        }
      }
    }
  },
  "aggs": {
    "new_york": {
      "geohash_grid": {
        "field":     "location",
        "precision": 5
      },
      "aggs": {
        "cell": { <1>
          "geo_bounds": {
            "field": "location"
          }
        }
      }
    }
  }
}
  • 子聚合器 `cell_bounds` 会作用于每个 geohash 单元。

现在落在每个geohash单元中的点都有了一个所在的矩形框区域:


...
"aggregations": {
  "new_york": {
     "buckets": [
        {
           "key": "dr5rs",
           "doc_count": 2,
           "cell": {
              "bounds": {
                 "top_left": {
                    "lat":  40.722,
                    "lon": -73.989
                 },
                 "bottom_right": {
                    "lat":  40.719,
                    "lon": -73.983
                 }
              }
           }
        },
...
上一篇: Geohash单元聚合... 下一篇: 地理形状