最近有两个需求是通过地图选择坐标,查询指定距离内的信息,和通过坐标集合组成不规则形状查询出不规则形状范围内的数据,在最起初我看到这个需求的时候第一个想法就是太复杂了,抵触。但是没有办法既然需求下来了只能硬着头皮上了,在调研之后最终还是决定了使用elasticsearch,下面就开始介绍如何使用elasticsearch来进行相关操作
设置数据格式
地理坐标点(geo-point) 是指地球表面可以用经纬度描述的一个点。地理坐标点可以用来计算两个坐标位置间的距离,或者判断一个点是否在一个区域中。地理坐标点不能被动态映射(dynamic mapping)自动检测,而是需要显式声明对应字段类型为 geo_point ,例子中的location字段
PUT platform_foreign_website
{
"mappings": {
"store":{
"properties": {
"id": {
"type": "text"
},
"storeName": {
"type": "text"
},
"location":{
"type": "geo_point"
}
}
}
}
}
存储示例:
- 半角逗号分割的字符串形式 “lat,lon“
- 明确以 lat 和 lon 作为属性的对象
- 数组形式表示 [lon,lat]
需要特别注意的就是纬度在前边经度在后边(latitude,longitude),数组表示形式是经度在前纬度在后([longitude,latitude])
geo_distance 找出指定位置在给定距离内的数据,相当于指定圆心和半径找到圆中点
- 找出两千米范围内的所有门店
- distance:距离 单位/km
- location:坐标点 圆心所在位置
es代码示例
//无排序
GET platform_foreign_website/communit/_search
{
"query": {
"constant_score": {
"filter": {
"geo_distance": {