http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 2538|回复: 0

[Elasticsearch] Elasticsearch地理距离过滤器

[复制链接]
发表于 2021-6-15 14:10:03 | 显示全部楼层 |阅读模式
地理距离过滤器( [size=0.9em]geo_distance )以给定位置为圆心画一个圆,来找出那些地理坐标落在其中的文档:
[C#] 纯文本查看 复制代码
GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance": "1km", 
          "location": { 
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}


找出所有与指定点距离在 1km 内的 location 字段。访问 Distance Units 查看所支持的距离表示单位。
中心点可以表示为字符串,数组或者(如示例中的)对象。详见 经纬度坐标格式

地理距离过滤器计算代价昂贵。为了优化性能,Elasticsearch 先画一个矩形框来围住整个圆形,这样就可以先用消耗较少的盒模型计算方式来排除掉尽可能多的文档。 然后只对落在盒模型内的这部分点用地理距离计算方式处理。

你需要判断你的用户,是否需要如此精确的使用圆模型来做距离过滤?通常使用矩形模型 bounding box 是比地理距离更高效的方式,并且往往也能满足应用需求。


更快的地理距离计算


两点间的距离计算,有多种牺牲性能换取精度的算法:
arc最慢但最精确的是 [size=0.9em]arc 计算方式,这种方式把世界当作球体来处理。不过这种方式的精度有限,因为这个世界并不是完全的球体。plane[size=0.9em]plane 计算方式把地球当成是平坦的,这种方式快一些但是精度略逊。在赤道附近的位置精度最好,而靠近两极则变差。sloppy_arc如此命名,是因为它使用了 Lucene 的 [size=0.9em]SloppyMath 类。这是一种用精度换取速度的计算方式, 它使用 Haversine formula 来计算距离。它比 [size=0.9em]arc 计算方式快 4 到 5 倍,并且距离精度达 99.9%。这也是默认的计算方式。
你可以参考下例来指定不同的计算方式:
[C#] 纯文本查看 复制代码
GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance":      "1km",
          "distance_type": "plane", 
          "location": {
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}



使用更快但精度稍差的 plane 计算方法。


你的用户真的会在意一个餐馆落在指定圆形区域数米之外吗?一些地理位置相关的应用会有较高的精度要求;但大部分实际应用场景中,使用精度较低但响应更快的计算方式可能更好。



地理距离区间过滤器


geo_distancegeo_distance_range 过滤器的唯一差别在于后者是一个环状的,它会排除掉落在内圈中的那部分文档。
指定到中心点的距离也可以换一种表示方式:指定一个最小距离(使用 gt 或者 gte )和最大距离(使用 ltlte ),就像使用 range 过滤器一样:
[C#] 纯文本查看 复制代码
GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance_range": {
          "gte":    "1km", 
          "lt":     "2km", 
          "location": {
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}

匹配那些距离中心点大于等于 [size=0.9em]1km 而小于 [size=0.9em]2km 的位置。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-28 11:45

© 2014-2021

快速回复 返回顶部 返回列表