Skip to content
On this page

ES 地理位置信息操作

前提条件

Elasticsearch支持两种类型的地理数据:

  • geo_point字段,支持纬度/经度对
  • geo_shape字段,支持点、线、圆、多边形、多多边形等

对地理位置信息进行排序,需要使用地理数据类型的字段来存储经纬度信息。

如何优化地理位置索引

  • 使用批量请求来提高索引速度。可以尝试一次索引100个文档,然后200个,然后400个等等,每次增加一倍的文档数量。当索引速度开始平稳时,就能知道数据的最佳批量请求大小。
  • 使用合适的地理查询类型。Elasticsearch提供了几种不同的地理查询类型,如geo_bounding_box、geo_distance、geo_shape等。根据需求选择最合适的查询类型。
  • 使用合适的地理数据类型。Elasticsearch支持两种地理数据类型:geo_point和geo_shape。如果只需要存储纬度/经度对,那么使用geo_point会更简单和高效。如果您需要存储更复杂的地理形状,那么使用geo_shape会更灵活和精确

geo_bounding_box vs geo_distance vs geo_shape

  • geo_bounding_box查询:找到与指定的矩形框相交的地理形状或地理点
  • geo_distance查询:找到与指定位置在一定距离范围内的地理点
  • geo_shape查询:找到与指定的地理形状有某种空间关系(如相交、包含)的地理形状或地理点

示例

  • 按照距离某个城市中心的远近来排序:
    http
    GET /_search
    {
        "sort" : [
            {
                "_geo_distance" : {
                    "pin.location" : { // pin.location是一个geo_point类型的字段
                        "lat" : 40.715,
                        "lon" : -73.998
                    },
                    "order" : "asc",
                    "unit" : "km"
                }
            }
        ]
    }
    
  • 使用两个点的geo_bounding_box查询的例子:
    http
    {
      "query": {
        "bool": {
          "must": {
            "match_all": {}
          },
          "filter": {
            "geo_bounding_box": {
              "location": {
                "top_left": {
                  "lat": 40.73,
                  "lon": -74.1
                },
                "bottom_right": {
                  "lat": 40.01,
                  "lon": -71.12
                }
              }
            }
          }
        }
      }
    }
    

Released under the MIT License.