一、存储创建
存储格式有三种
- 字符串形式以半角逗号分割,如 "lat,lon" 。
- 对象形式显式命名为 lat 和 lon 。
- 数组形式表示为 [lon,lat] 。
- 由于我采用canal 同步mysql数据到 Elasticsearch的,所以需要转换拼接经纬度字段,然后导入,所以我采用的是第一种形式,而且sql也比较好拼接;第三种数组形式,同步数据会报数据类型错误问题。如果mysql存储就是以上类型,那就更好,不用转换。
- 并且Elasticsearch 新建geo_point 数据类型字段接收数据
类型对应接受经纬度信息。
PUT /my_locations
{
"mappings": {
"_doc": {
"properties": {
"pin": {
"properties": {
"location": {
"type": "geo_point"
}
}
}
}
}
}
}
PUT /my_locations/_doc/1
{
"pin" : {
"location" : {
"lat" : 40.12,
"lon" : -71.34
}
}
}
注:经验证 put 数据时候,可以是 "location":"40,70"格式,也可以是如上格式, 混合插入都可以查询,pin 可以不要,只新增 location 字段属性;
二、查询
Geo Distance 查询
GET /my_locations/_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km",
"pin.location" : {
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
同样:pin.location ---> locationg:"lat,lon" 格式,经验证都是可以的。