版权声明:本文为博主原创文章,未经博主允许不得转载。 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。