开放搜索相关性函数Distance:计算你我之间的距离

简介: 你在点外卖,distance在计算着你和商家的距离;你在打车,distance在计算着你和司机的距离;你在找朋友,distance在计算着你和朋友间的距离;你在生活,distance在计算。

本期分享专家:夏苜,一直从事oss、cdn、ram、开放搜索等产品的技术支持,虽然是女子,对技术也有一颗执著的心。爱技术,爱分享。本期的分享专题—开放搜索相关性函数distance的应用

77055a67b246ce07dc0fd4ec03dddc5455647a86


Distance, 是距离的意思,但是在技术函数的世界里,它可以计算距离。

你在点外卖,distance在计算着你和商家的距离;

你在打车,distance在计算着你和司机的距离;

你在找朋友,distance在计算着你和朋友间的距离;

你在生活,distance在计算。

原来生活中看似常用的功能是被这个神奇的函数distance在计算着,这是如何实现的?

Distance函数是什么样的,我们先来简单介绍并了解下他的结构。


  • 简介:

distance 函数用来获取两个点之间的球面距离。一般用于LBS的距离计算,兼有function及feature的功能,可以同时在filter、sort及formula精排表达式中使用。


  • 函数结构:

distance(longitude_a, latitude_a, longtitude_b, latitude_b, output_name)

其中

longitude_a, latitude_a表示a点的经纬度,支持的参数类型为浮点型的字段名。这两个数据是需要从开放搜索文档中获取的固定数据,所以应用结构中需要有两个浮点型类型(flout,double)的字段。

longtitude_b, latitude_b表示b点的经纬度,也需要是浮点型,在搜索条件中输入的数据。当在精排表达式中使用时,可以通过kvpairs进行参数的传递。

outputname是返回值,计算距离,float类型,单位为千米。仅限于精排表达式中使用,filter及sort子句不支持。设置outputname参数后,实际的距离值将展示到variableValue节点中,该节点只能在返回格式为xml或者fulljson中(config子句中format参数可以设置)才能得到。


  • 在使用前我们也要做好准备工作:

1、创建开放搜索应用,应用结构中需要有两个浮点型类型字段存储a点的经纬度。我这里设置了字段lng和lat,当然double也可以。导入a点信息以及位置坐标。

 ade61ea23fbd9ac5da9343fa461b937f3f058eb2

1241836adfe001bb92443e4e4dc0c35753a3450c

 

2、我们测试下如果在distance中两个参数不是浮点型字段的情况:

category是int类型,报错sort表达式语法有误:6139  Sort expression syntax error.

 3826a9eaa5157dc1e4ff01b408efb4e317931c97


  • 用一个点外卖的过程让你秒懂distance的应用

1. 确定用户坐标(120.34256,30.56982),以用户坐标为中心按照距离由近及远排序来展示满足您需求的商家。用distance是这样实现的:

sort= +distance(lng,lat,"120.34256","30.56982")

在显示中通过查看排序分可以看到计算的距离。

注意:在sort中没有引进RANK,粗排和精排设置是不生效的,具体可以参考sort子句的介绍。

 97ddb4481998ea196add06f60c2612b338a30489

2. 在已经展示的商家里面继续提出更高的要求,要求展示客户附近200km范围内的商家。看看怎么实现?

sort= +distance(lng,lat,"120.34256","30.56982")

filter= distance(lng,lat,"120.34256","30.56982")<200

 473f6335f378e89e11c267170d6fc7b5972791ab

3. 接下来我想了解商家到底距离我有多远?即在获取到1和2的展示结果上显示出实际距离值。

通过上面介绍了解到,距离值只能通过精排表达式来获取。那么我们来设置下精排表达式,先测试下将sort排序放在精排表达式中:

将distance1精排表达式设置为

distance(lng, lat, 120.34256,30.56982)

sort=+RANK;

这个时候排序分中就会出现粗排和精排的结果了

 effcbc3384b65250013da606cb0751ba26269f22

 73f8b876b268948de786dbab37a813aa6aa459eb

下面测试精排中加上距离返回值的情况:

将distance2精排表达式设置为

distance(lng, lat, 120.34256,30.56982,distance_value)

sort=+RANK;

config=start:0,hit:10,format:fulljson;

查看variableValue的内容即可获取返回的距离值

 8ec437fd5aff2b93e82a9457055f0d8a4201ed45

 dd4c581e3319352cca689610f73ca0f225657f3c

4、 订餐的过程中,当然是允许客户是移动的,这个时候需要将变化的位置进行传送,distance是这么表达

一般在精排表达式中不会设置固定的距离值,每个用户的位置可能不同,如果要经常变化精排表达式不太合适。这样就用到了传参kvpairs子句。

将distance3精排表达式设置为

distance(lng, lat,lng_b, lat_b, distance_value)

sort=+RANK;

config=start:0,hit:10,format:fulljson;

kvpairs=lng_b:120.34256,lat_b:30.56982


8bfa7126cdae04adbbf7b8428efbd0ccd47fe87a

 

4a31c824968cc38b1aec04879604fd88defeb632

 


上面的过程完美的使用dinstance函数实现了客户和商家之间的距离测量,你学会了吗? 

本期分享结束啦 ,欢迎大家留言讨论,对distance有什么看法,想了解哪些技术?统统说出来,下期再见。


相关文章
|
3月前
|
机器学习/深度学习 缓存 算法
【论文速递】IJCV2022 - CRCNet:基于交叉参考和区域-全局条件网络的小样本分割
【论文速递】IJCV2022 - CRCNet:基于交叉参考和区域-全局条件网络的小样本分割
|
9月前
|
机器学习/深度学习 定位技术 容器
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
百度地图高级开发:map.getDistance计算多点之间的距离并输入矩阵
157 0
|
移动开发 文字识别 算法
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
本文简要介绍Pattern Recognition 2019论文“SegLink++: Detecting Dense and Arbitrary-shaped Scene Text by Instance-aware Component Grouping”的主要工作。该论文提出一种对文字实例敏感的自下而上的文字检测方法,解决了自然场景中密集文本和不规则文本的检测问题。
1874 0
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
|
3月前
|
算法 定位技术 Python
地图权重计算(算法题)
地图权重计算(算法题)
22 0
|
8月前
|
算法
线搜索中有最速下降法、牛顿法、拟牛顿法、共轭梯度法汇总(下)
线搜索中有最速下降法、牛顿法、拟牛顿法、共轭梯度法汇总(下)
|
8月前
|
存储 算法
线搜索中有最速下降法、牛顿法、拟牛顿法、共轭梯度法汇总(上)
线搜索中有最速下降法、牛顿法、拟牛顿法、共轭梯度法汇总(上)
116 0
|
9月前
|
定位技术 API 容器
百度地图API开发:map.getDistance计算两点之间的距离(直线距离)
百度地图API开发:map.getDistance计算两点之间的距离(直线距离)
631 0
|
11月前
|
机器学习/深度学习 人工智能 算法
|
机器学习/深度学习 算法 知识图谱
几种距离的度量方式
几种距离的度量方式
287 0
几种距离的度量方式
|
机器学习/深度学习 人工智能 算法
【机器学习】基于组平均的AGNES算法,支持多维数组,距离用欧式距离
【机器学习】基于组平均的AGNES算法,支持多维数组,距离用欧式距离
142 0
【机器学习】基于组平均的AGNES算法,支持多维数组,距离用欧式距离