本期分享专家:夏苜,一直从事oss、cdn、ram、开放搜索等产品的技术支持,虽然是女子,对技术也有一颗执著的心。爱技术,爱分享。本期的分享专题—开放搜索相关性函数distance的应用
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点信息以及位置坐标。
2、我们测试下如果在distance中两个参数不是浮点型字段的情况:
category是int类型,报错sort表达式语法有误:6139 Sort expression syntax error.
- 用一个点外卖的过程让你秒懂distance的应用:
1. 确定用户坐标(120.34256,30.56982),以用户坐标为中心按照距离由近及远排序来展示满足您需求的商家。用distance是这样实现的:
sort= +distance(lng,lat,"120.34256","30.56982")
在显示中通过查看排序分可以看到计算的距离。
注意:在sort中没有引进RANK,粗排和精排设置是不生效的,具体可以参考sort子句的介绍。
2. 在已经展示的商家里面继续提出更高的要求,要求展示客户附近200km范围内的商家。看看怎么实现?
sort= +distance(lng,lat,"120.34256","30.56982")
filter= distance(lng,lat,"120.34256","30.56982")<200
3. 接下来我想了解商家到底距离我有多远?即在获取到1和2的展示结果上显示出实际距离值。
通过上面介绍了解到,距离值只能通过精排表达式来获取。那么我们来设置下精排表达式,先测试下将sort排序放在精排表达式中:
将distance1精排表达式设置为
distance(lng, lat, 120.34256,30.56982)
sort=+RANK;
这个时候排序分中就会出现粗排和精排的结果了
下面测试精排中加上距离返回值的情况:
将distance2精排表达式设置为
distance(lng, lat, 120.34256,30.56982,distance_value)
sort=+RANK;
config=start:0,hit:10,format:fulljson;
查看variableValue的内容即可获取返回的距离值
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
上面的过程完美的使用dinstance函数实现了客户和商家之间的距离测量,你学会了吗?
本期分享结束啦 ,欢迎大家留言讨论,对distance有什么看法,想了解哪些技术?统统说出来,下期再见。