• 查询地理形状

    查询地理形状

    地理形状一个不寻常的地方在于它运行我们使用形状来做查询,而不仅仅是坐标点。

    举个例子,当我们的用户刚刚迈出阿姆斯特丹中央火车站时,我们可以用如下方式,查询出方圆1km内所有的地标:

    1. GET /attractions/landmark/_search
    2. {
    3. "query": {
    4. "geo_shape": {
    5. "location": { <1>
    6. "shape": { <2>
    7. "type": "circle", <3>
    8. "radius": "1km"
    9. "coordinates": [ <4>
    10. 4.89994,
    11. 52.37815
    12. ]
    13. }
    14. }
    15. }
    16. }
    17. }
    • <1> 查询使用 location 字段中的地理形状;
    • <2> 查询中的形状是由shape键对应的内容表示;
    • <3> 形状是一个半径为1km的圆形;
    • <4> 安姆斯特丹中央火车站入口的坐标点。

    默认,查询(或者过滤器 —— 工作方式相同)会从已索引的形状中寻找与指定形状有交集的形状。
    此外,relation 也可以设置为 disjoint来查找与指定形状不相交的,或者设置为within来查找完全落在查询形状中的。

    举个例子,我们查找所有落在阿姆斯特丹内的地标:

    1. GET /attractions/landmark/_search
    2. {
    3. "query": {
    4. "geo_shape": {
    5. "location": {
    6. "relation": "within", <1>
    7. "shape": {
    8. "type": "polygon",
    9. "coordinates": [[ <2>
    10. [4.88330,52.38617],
    11. [4.87463,52.37254],
    12. [4.87875,52.36369],
    13. [4.88939,52.35850],
    14. [4.89840,52.35755],
    15. [4.91909,52.36217],
    16. [4.92656,52.36594],
    17. [4.93368,52.36615],
    18. [4.93342,52.37275],
    19. [4.92690,52.37632],
    20. [4.88330,52.38617]
    21. ]]
    22. }
    23. }
    24. }
    25. }
    26. }
    • <1> 只匹配完全落在查询形状中的(已索引)形状。
    • <2> 这个多边形表示安姆斯特丹中心。