文章目录

​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
}
}
}
}
}
}