• 范围(边界)聚合器

    范围(边界)聚合器

    在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. ...