编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

5分钟掌握Elasticsearch空间查询之geo_point

wxchong 2024-09-14 15:13:26 开源技术 10 ℃ 0 评论

我们都知道,Elasticsearch是一个全文检索引擎,其强大的全文检索能力可以支撑非常多的业务系统。但其实除了常规的数据类型,es还可以支持空间数据类型。目前Es可以支持两种空间数据类型,geo_point,geo_shape。笔者今天着重介绍一下Elasticsearch对geo_point数据类型的支持。

geo_point类型,实际上是经纬度的组合,主要用于地图空间数据的相关查询:

  • 以某个坐标点为中心,搜索指定范围内的点;
  • 通过空间属性聚合数据;
  • 可以将距离作为相关性分数的一个计算因子;
  • 通过距离进行排序。

1 创建mapping

插入geo_point类型的数据之前,需要先创建mapping,可以理解为关系型数据库中的表结构。

PUT my_index
{
 "mappings": {
 "properties": {
 "location": {
 "type": "geo_point"
 }
 }
 }
}

2 插入geo_point类型数据的4种姿势

2.1 作为object插入

PUT my_index/_doc/1
{
 "text": "Geo-point as an object",
 "location": { 
 "lat": 41.12,
 "lon": -71.34
 }
}

2.2 作为string插入

PUT my_index/_doc/2
{
 "text": "Geo-point as a string",
 "location": "41.12,-71.34" 
}

2.3 geohash

PUT my_index/_doc/3
{
 "text": "Geo-point as a geohash",
 "location": "drm3btev3e86" 
}

2.4 array

PUT my_index/_doc/4
{
 "text": "Geo-point as an array",
 "location": [ -71.34, 41.12 ] 
}

3 查询实例

插入数据之后,我们来进行点的检索,检索出bbox范围内的所有点。

GET my_index/_search
{
 "query": {
 "geo_bounding_box": { 
 "location": {
 "top_left": {
 "lat": 42,
 "lon": -72
 },
 "bottom_right": {
 "lat": 40,
 "lon": -74
 }
 }
 }
 }
}

欢迎关注笔者,每天分享架构干货。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表