|
简要介绍
我们知道es支持的数据类型是多种多样的,除了我们常见的几种基本数据类型,它也支持记录位置信息的的数据类型。在es中,记录地理位置信息的数据类型有两种,分别为geo_shap和geo_point,下面我针对geo_point类型简要介绍一下
geo_point支持多种数据传入方式:
字符串
位置:lat + "," + lon
数组
位置: {"lat": ...,"lon": ...}
对象
位置: [lon, lat]
注意:可能所有人都至少踩过一次这个坑====地理坐标点用字符串形式表示时是纬度在前,经度在后("latitude,longitude"),而数组形式表示时刚好相反,是经度在前,纬度在后([longitude,latitude])。其实,在 Elasticesearch 内部,不管字符串形式还是数组形式,都是纬度在前,经度在后。不过早期为了适配GeoJSON 的格式规范,调整了数组形式的表示方式。这点官网有说明。
针对geo_point类型一般有如下几种查询需求
distance query
查找距离中心点范围内的点
distance range query(已废弃)
查询位于中心点指定range内的点,这个api在新版本的es中去掉了,因此这里不做过多解释
bounding query
查找指定点组成的矩形范围内的点
polygon query
查找多个点组成的一个多边形中的点
针对不同的查询Java构造的SearchSourceBuilder factory如下:
service如下:
controller层代码如下:
[1].如何使用
我们在使用geo_point类型之前,首先应该在创建index时通过mapping显式指定该字段为geo_point类型,如下:
以上我们新建了一个名字为restraunt的index,在它的mapping文件中显式的指定了“位置”字段的type为“geo_point”类型
[2]准备一些数据
在kibana上我们准备的数据如下:
以上我们准备了7条数据,接下来我们需要执行查询,看看我们的接口是否符合我们需求。
[3]查询
查询distance
其他两种查询同上。
|
上一篇:ElasticsearchParseException[field must be either [lat], [lon] or [geohash]]下一篇:discuz安装应用时显示“数据无法识别,请返回”解决方法
|