elasticsearch中的geo_point 查询检索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28165595/article/details/85101656

前言

最近在做关于ES中的数据索引,ES相对于solr的功能还是比较强大的。其中对于地理位置坐标数据的索引也是比较好用。这里简单总结下坐标数据如何导入ES,以及在ES中进行常见地理位置查询的DSL语法。

建立geo_point类型的mapping

首先对于mapping,有些小伙伴可能不太清楚,其实可以类比于关系型数据库中的字段类型,它定义了数据以什么形式在ES中进行索引。ES可以自动识别索引数据类型,但是在查询索引的时候往往有问题,比较常见的就是text和keyword的区别。这个不是这里的重点,有兴趣的可以自行百度。下面来给location设置type:

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

导入geo_point类型数据

方式一

POST test/test
{
    "location": "117.296963,31.818034" 
}

方式二

POST test/test
{
  "location":{
    "lat":117.296963,
    "lon":31.818034
  }
}

方式三

POST test/test
{
    "location": [ 117.296963, 31.818034 ]
}

查询geo_point类型数据

  • 根据给定两个点组成的矩形,查询矩形内的点,百度地图中有个鼠标拖框查询的功能可能就是这种方式实现的
GET test/test/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 117.296963,
          "lon": 31.818034
        },
        "bottom_right": {
          "lat": 118.296963,
          "lon": 32.818034
        }
      }
    }
  }
}
  • 根据给定的多个点组成的多边形,查询范围内的点
GET test/test/_search
{
  "query": {
    "geo_polygon": {
      "location": {
        "points": [
          {
            "lat": 118.296963,
            "lon": 32.818034
          },
          {
            "lat": 117.296963,
            "lon": 31.818034
          },
          {
            "lat": 116.296963,
            "lon": 30.818034
          },
          {
            "lat": 115.296963,
            "lon": 29.818034
          }
        ]
      }
    }
  }
}
  • 查询给定1000米距离范围内的点,我最近的项目就是要实现数据点击地图上某个点,展示该点方圆多少公里的其他点
GET test/test/_search
{
  "query": {
    "geo_distance": {
      "distance": "1000m",
      "location": {
        "lat": 117.296963,
        "lon": 31.818034
      }
    }
  }
}
  • 查询距离范围区间内的点的数量
GET test/test/_search
{
  "size": 0, 
  "aggs": {
    "myaggs": {
      "geo_distance": {
        "field": "location",
        "origin": {
          "lat": 117.296963,
          "lon": 31.818034
        },
        "unit": "km", 
        "ranges": [
          {
            "from": 50, 
            "to": 500
          }
        ]
      }
    }
  }
}

总结

上面简单介绍了ES中的geo_point的数据导入,以及如何进行区域查询。但是实际项目中,我们的坐标数据可能都是在数据库中的,这时候,我们可以借助logstash的jdbc配置将数据库中坐标数据导入ES,生成索引,再进行查询,后面我会结合百度地图api来实现地图上的区域范围检索的小demo。

猜你喜欢

转载自blog.csdn.net/qq_28165595/article/details/85101656