【Elasticsearch】地理位置(geo_point)

ES 支持基于地理位置的搜索和聚合分析

经纬度:
lat: latitude 维度
lon: longitude 经度


一、建立 geo_point mapping


PUT /hotel_index
{
   "mappings": {
		"doc": {
			"dynamic": "false",
			"properties": {
				"name": { "type": "text", "fields": { "keyword": {"ignore_above": 256, "type": "keyword"} } },
				"location": {
                  "type": "geo_point"
                }
			}
		}
	}
}


二、写入 geo_point 三种方式


推荐第一种写法,比较清晰。

(1)对象形式

PUT /hotel_index/doc/1
{
  "name": "新街口",
  "location": {
    "lat": 39.967157,
    "lon": 116.322631
  }
}

(2)字符串形式

经纬度:
lat: latitude 维度
lon: longitude 经度

表达式:lat,lon

若 lon,lat,则会报错

PUT /hotel_index/doc/2
{
  "name": "北京交通大学",
  "location": "39.957866,116.349652"
}

(3)数组形式

经纬度:
lat: latitude 维度
lon: longitude 经度

这一种方式是经度在前,维度在后。

[lon, lat]

若改为 [lat,lon], 则会报错

PUT /hotel_index/doc/3
{
  "name": "北京理工大学",
  "location": [39.967157,116.322631]
}


三、查询



(1)geo_bouding_box 查询

geo_bouding_box 查询某个矩形的地理位置范围内的坐标点

左上角坐标和右下角坐标,绘制出一个矩形。

GET /hotel_index/doc/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 42,
          "lon": -72
        },
        "bottom_right": {
          "lat": 40,
          "lon": -74
        }
      }
    }
  }
}

(2)geo_distance 当前位置一定范围内

geo_distance 是距离搜索,以一个点周围扩散的距离范围

GET /hotel_index/doc/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "2500m",
          "location": {
            "lat": 39.957866,
            "lon": 116.349652
          }
        }
      }
    }
  }
}
发布了404 篇原创文章 · 获赞 270 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/fanfan4569/article/details/103794406
今日推荐