弹性搜索地理位置查询

最近有获取某个位置附近房产的需求,比如获取当前用户所在方圆100km范围内的房产信息。经过调查发现可以通过redis、mongodb、elasticsearch等实现。经过考虑,我们决定用es来实现。在这里,我们简单记录一下geo api在es中的使用情况。

es中有两种类型的地理位置数据,geo_point和geo_shape。Es不能自动识别这种数据类型,需要在创建映射时手动指定。

Geo_point使用经纬度坐标,可以计算落在矩形内的点、以某点为半径的点(圆)、多边形内的点(已弃用)、排序、聚合等操作。

Geo_shape表示一个复杂的图形,用GeoJSON的格式表示。比如我们要表达一个库的坐标位置,如果这个库占的位置比较大,用一个点来表达可能不太准确,然后我们可以用geo_shape来表达。

但是这种数据类型也有缺点:比如不能排序(因为是多边形点)。

图中1,① ② ③ ④表示需要加入es的建筑物。

2.图中的圆圈、正方形、多边形表示你需要用es在后面找出里面的位置。

3.图中的短箭头?代表一个边界。

注意?:

1.在索引中,我们自己指定的位置字段的类型是geo_point。

2.building_name的字段类型为关键字,表示不分词。该字段仅用于测试,没有任何用处。

3.es7中只有一种类型,没有指定索引的类型。

注意?:

1.从上面可以看出,插入地理位置有四种方式。

从上图可以看出,左上角和右下角的坐标分别是(121.444075,31.265395)和(1217,31.535)。

通过执行查询,您应该能够找到上海火车站和叶晚袁晶大厦。

如图所示,已经查询了上海火车站和叶晚袁晶大厦,结果是正确的。

这是一个距离查询,是从某一点扩展到周围的距离范围。

在上一步的背景中,我们知道了上海站的坐标(121.462311.31.256224),也知道了它离周边有多远。在这里,我们以上海站为中心,询问方圆的600米建筑。

注意?:

1和distance_type的值中有两个弧和平面。

2.距离后可用的单位有千米、米、厘米、毫米、海里、米、码、英尺和英寸。

注意?:

1,sort执行排序。

需求:

1,es查询语句

从上图可以看出:

1.上海站0-500m范围内只有1栋。

2.距离上海站500-1000之间有1栋。

3.距离上海站1000以上有两站。

1,查询语句,查询出所有数据,过滤出上海站3公里范围内的所有建筑。

2.aggs用于统计上海500m以内、500-1000m和1000m以外的建筑物数量。

3.sort用于排序。

4.使用post_filter将结果缩小到上海火车站1000米以内。

1,地理点数据类型

2.距离单位

3.整理

4.矩形查询

5、循环查询、距离查询

6.坐标拾取系统