ElasticSearch实现基于经纬度的附近搜索

ElasticSearch除了支持文本检索外,还支持地理信息检索。它主要支持两种类型的地理查询:一种是地理点(geo_point),即经纬度查询,另一种是地理形状查询(geo_shape),即支持点、线、圈、多边形查询等。

ElasticSearch实现经纬度附近搜索

1、创建映射(mapping)

对于某些特殊的查询,例如矩形范围查询,可以通过分别对lat和lon进行索引以提高查询速度。因为矩形范围的查询完全可以先通过lat过滤,再通过lon过滤。要实现此功能只需在location节点下添加”lat_lon”: true即可。

2、添加数据(插入文档)

插入文档时,有三种格式的属性可以被映射为 geo_point 类型:

  • string:格式为lat,lon
  • double []:格式为[lon, lat]
  • json:格式为{ “lat”: lat, “lon”: lon}

注意:数组格式是 lon 在前,lat 在后,而字符串格式正好相反。

3、查询

Elasticsearch 的地理位置查询,实际是使用过滤器对所有文档进行过滤。它支持以下四种查询方式:

  • geo_bounding_box:查询矩形范围内的点
  • geo_distance:查询中心点距离范围内的点
  • geo_distance_range:查询中心点最小距离和最大距离之间的点
  • geo_polygon:查询多边形范围内的点(不推荐使用)

以下为通过中心点距离范围内的示例:

除了中心点和距离,我们还需要指定计算距离的方式,每种方式对应着不同的精度和计算速度,常用的有三种:

  • arc:最慢但最精确的是 arc 计算方式,这种方式把世界当作球体来处理。不过这种方式的精度有限,因为这个世界并不是完全的球体。
  • plane:plane 计算方式把地球当成是平坦的,这种方式快一些但是精度略逊。在赤道附近的位置精度最好,而靠近两极则变差。
  • sloppy_arc:如此命名,是因为它使用了 Lucene的SloppyMath 类。这是一种用精度换取速度的计算方式,它使用 Haversine formula 来计算距离。它比 arc 计算方式快 4 到 5 倍,并且距离精度达9%。这也是默认的计算方式。

对于大部分应用来说,plane的精度已经足够了,并且速度是最快的,所以推荐使用它。

ElasticSearch按距离打分的配置

ElasticSearch除了按照距离排序外,还支持按距离打分并且与其他评分一起应用。

有三种衰减函数:linear 、 exp 和 gauss (线性、指数和高斯函数),它们可以操作数值、时间以及经纬度地理坐标点这样的字段。所有三个函数都能接受以下参数:

  • Origin:中心点 或字段可能的最佳值,落在原点 origin 上的文档评分 _score 为满分0。
  • Scale:衰减率,即一个文档从原点 origin 下落时,评分 _score 改变的速度。
  • Decay:从原点 origin 衰减到 scale 所得的评分 _score ,默认值为5 。
  • Offset:以原点 origin 为中心点,为其设置一个非零的偏移量 offset 覆盖一个范围,而不只是单个原点。在范围 -offset <= origin <= +offset 内的所有评分 _score 都是0 。

这三个函数的唯一区别就是它们衰减曲线的形状,用图来说明会更为直观:

gauss

$$S(doc) = \exp(-\frac{\max(0,|\text{fieldvalue}_{doc}-\text{origin}|-\text{offset})^2}{2\sigma ^2})$$

其中:

$$\sigma ^2=-\frac{\text{scale}^2}{2\cdot \ln(\text{decay})}$$

exp

$$S(doc) =  \exp(\lambda \cdot max(0,|\text{fieldvalue}_{doc}-\text{origin}|-\text{offset}))$$

其中:

$$\lambda  = \frac{\ln(\text{scale})}{\text{scale}}$$

linear

$$S(doc) =  \max(\frac{s-\max(0,|\text{fieldvalue}_{doc}-\text{origin}|-\text{offset})}{s},0)$$

其中:

$$s = \frac{\text{scale}}{1.0-\text{decay}}$$

参考连接:

微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

酒店收益管理:解决方案,最佳实践,收益经理角色

挤满了人的酒店并不总是盈利的酒店。酒店业成功的标志是收入。酒店采用各种收入管理技术和策略,旨在提高利润。 与航

美团HOS信息整理

HOS(全称Hotel Operation System)体系是美团酒店于2016年推出的酒店商家综合运营能力

学会这些原则,成为自己的创始人

同程商学院第一课:《学会这些原则,成为自己的创始人》学习心得: 一、销售思维:“我能帮你做什么”->“我

发表评论

电子邮件地址不会被公开。 必填项已用*标注