范围(边界)聚合器

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

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

  1. GET /attractions/restaurant/_search?search_type=count
  2. {
  3. "query": {
  4. "filtered": {
  5. "filter": {
  6. "geo_bounding_box": {
  7. "location": {
  8. "top_left": {
  9. "lat": 40,8,
  10. "lon": -74.1
  11. },
  12. "bottom_right": {
  13. "lat": 40.4,
  14. "lon": -73.9
  15. }
  16. }
  17. }
  18. }
  19. }
  20. },
  21. "aggs": {
  22. "new_york": {
  23. "geohash_grid": {
  24. "field": "location",
  25. "precision": 5
  26. }
  27. },
  28. "map_zoom": { <1>
  29. "geo_bounds": {
  30. "field": "location"
  31. }
  32. }
  33. }
  34. }
  • <1> 范围聚合器会计算出一个最小的矩形框来覆盖查询结果的所有文档。

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

  1. ...
  2. "aggregations": {
  3. "map_zoom": {
  4. "bounds": {
  5. "top_left": {
  6. "lat": 40.722,
  7. "lon": -74.011
  8. },
  9. "bottom_right": {
  10. "lat": 40.715,
  11. "lon": -73.983
  12. }
  13. }
  14. },
  15. ...

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

  1. GET /attractions/restaurant/_search?search_type=count
  2. {
  3. "query": {
  4. "filtered": {
  5. "filter": {
  6. "geo_bounding_box": {
  7. "location": {
  8. "top_left": {
  9. "lat": 40,8,
  10. "lon": -74.1
  11. },
  12. "bottom_right": {
  13. "lat": 40.4,
  14. "lon": -73.9
  15. }
  16. }
  17. }
  18. }
  19. }
  20. },
  21. "aggs": {
  22. "new_york": {
  23. "geohash_grid": {
  24. "field": "location",
  25. "precision": 5
  26. },
  27. "aggs": {
  28. "cell": { <1>
  29. "geo_bounds": {
  30. "field": "location"
  31. }
  32. }
  33. }
  34. }
  35. }
  36. }
  • <1> 子聚合器 cell_bounds 会作用于每个 geohash 单元。

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

  1. ...
  2. "aggregations": {
  3. "new_york": {
  4. "buckets": [
  5. {
  6. "key": "dr5rs",
  7. "doc_count": 2,
  8. "cell": {
  9. "bounds": {
  10. "top_left": {
  11. "lat": 40.722,
  12. "lon": -73.989
  13. },
  14. "bottom_right": {
  15. "lat": 40.719,
  16. "lon": -73.983
  17. }
  18. }
  19. }
  20. },
  21. ...