elasticsearch 地理位置查询、排序(geo_bounding_box、geo_distance_range、geo_polygon)

经纬度英文

longitude:经度
latitude:纬度

geo_bounding_box

根据 左上角坐标 和 右下角坐标,画出矩形,找出落在指定矩形框中的坐标点

如下图:左上点、右下点,连接一个区域,找出落在该区域的点

简单例子

get /meituan_v1/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 90,
          "lon": 31
        },
        "bottom_right": {
          "lat": 39,
          "lon": 118
        }
      }
    }
  }
}

注意

查询时,给 右上点、左下点,认为绕了地球一圈:

多条件查询

filter 一般多用于范围查询

get /meituan_v1/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "name": "*拉面*"
          }
        }
      ],
      "filter": [
        {
          "geo_bounding_box": {
            "location": {
              "top_left": {
                "lat": 90,
                "lon": 31
              },
              "bottom_right": {
                "lat": 39,
                "lon": 118
              }
            }
          }
        }
      ]
    }
  }
}

geo_polygon

多点查询,点 的数量要 超过3个,否则无法连成一个区域

如下图:3个蓝点连接一个区域,查询落在该区域的点

get /meituan_v1/_search
{
  "query": {
    "bool": {
      "must": {
        "wildcard": {
          "name": "*拉面*"
        }
      },
      "filter": {
        "geo_polygon": {
          "location": {
            "points": [
              {
                "lat": 90,
                "lon": 31.1
              },
              {
                "lat": 20,
                "lon": 24
              },
              {
                "lat": 39,
                "lon": 124.1
              }
            ]
          }
        }
      }
    }
  }
}

geo_distance_range

找出与指定位置给定最小距离和最大距离之间的点
与 geo_distance 相比,geo_distance_range 是一个环,会排除内圈中的所有文档

5.x 废弃

排序

搜索结果可以按照距离进行排序

GET /meituan_v1/_search
{
  "query": {
     "bool": {
      "must": {
        "wildcard": {
          "name": "*面*"
        }
      },
      "filter": {
        "geo_bounding_box": {
            "location": {
              "top_left": {
                "lat": 90,
                "lon": 31
              },
              "bottom_right": {
                "lat": 39,
                "lon": 118
              }
            }
          }
      }
    }
  },
  "sort": {
    "_geo_distance": {
      "location": {    // 计算所有文档按照该指定位置的距离
        "lat":  78,
        "lon": 36
      },
      "order":  "asc",    //从近到远
      "unit":   "km",      // 将距离以 km 为单位写入每个返回结果的sort键中
      "distance_type": "plane"  // 按照平面计算
    }
  }
}

distance_type解释: 详见 链接


原文出处:/show_1IX1qOVnQaGX.html