【Elasticsearch】地理位置(geo_point)
原创
©著作权归作者所有:来自51CTO博客作者DonaldY的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
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
}
}
}
}
}
}