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

本期分享专家:夏苜,一直从事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有什么看法,想了解哪些技术?统统说出来,下期再见。

时间: 2024-10-25 19:08:02

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

java 根据经纬度 坐标 计算两点之间的距离

根据经纬度,坐标,计算两点之间的距离: 参数格式如下:每一个param的两个值之间用分号分割 @param1  positionOne =aa.bbbb;cc.dddd @param2  positionOne =ee.bbbb;gg.dddd public static double getDistance(String positionOne, String positionTwo) {double long1;double lat1;double long2;double lat2;dou

jar-安卓实现高德地图定位 计算两者之间的距离如何实现

问题描述 安卓实现高德地图定位 计算两者之间的距离如何实现 安卓实现高德地图定位 计算两者之间的距离如何实现 计算距离的这个类是那个jar包下面的类啊 解决方案 如何实现安卓定位,用arcGis开发 解决方案二: //1.将两个经纬度点转成投影点 MAMapPoint point1 = MAMapPointForCoordinate(CLLocationCoordinate2DMake(39.989612,116.480972)); MAMapPoint point2 = MAMapPointF

给你两个经纬度,计算他们之间的距离

原文:给你两个经纬度,计算他们之间的距离 这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作"赤道".在赤道的南北两边,画出许多和赤道平行的圆圈,就是"纬圈":构成这些圆圈的线段,叫做纬线.我们把赤道定为纬度零度,向南向北各为90度,在赤道以南的叫南纬,在赤道以北的叫北纬.北极就是北纬90度,南极就是南纬90度.纬度的高低也标志

java实现计算地理坐标之间的距离_java

java实现计算两经纬度点之间的距离,直接上代码,具体解释请参考注释 复制代码 代码如下: package com.jttx.poi.utils; import com.jttx.poi.entity.Point; /**  * Created by louis on 2014/9/2.  */ public class GeoUtils {     /**      * 计算两经纬度点之间的距离(单位:米)      * @param lng1  经度      * @param lat1 

计算两个latitude-longitude点之间的距离? (Haversine公式)

问题描述 如何计算纬度和经度指定的两点之间的距离?为了澄清,我想要距离公里;这些点使用WGS84系统,我想了解可用方法的相对准确性.最佳解决方案 这个link可能对您有帮助,因为它详细说明了使用Haversine formula计算距离. 摘抄: This script [in Javascript] calculates great-circle distances between the two points – that is, the shortest distance over the

php计算两个经纬度地点之间的距离

php计算两个指定的经纬度地点之间的距离,这个在做计算给定某个地点的经纬度,计算其附近的商业区,以及给定地点与附近各商业区之间的距离的时候,还是用的到的.下面是具体的函数代码以及用法示例. 关于如何获取某个地址的经纬度,可参照本站文章: 谷歌地图第三版根据地理位置获取经纬度的方法 <?php /** *求两个已知经纬度之间的距离,单位为米 *@param lng1,lng2 经度 *@param lat1,lat2 纬度 *@return float 距离,单位米 *@author www.Al

PHP实现搜索地理位置及计算两点地理位置间距离的实例_php实例

地理位置搜寻LBS,存储每个地点的经纬度坐标,搜寻附近的地点,建立地理位置索引可提高查询效率. mongodb地理位置索引,2d和2dsphere,对应平面和球面. 1.创建lbs集合存放地点坐标 use lbs; db.lbs.insert( { loc:{ type: "Point", coordinates: [113.332264, 23.156206] }, name: "广州东站" } ) db.lbs.insert( { loc:{ type: &qu

使用阿里云开放搜索服务快速搭建资源搜索网站

大家好,我又来了,答应云栖论坛一周一篇文章, 由于工作太忙已中断1个多月实在抱歉,这一次写点轻松有趣的东西-快速的做个资源搜索站 依稀记得十来年前,带宽还只有2M的时候,受各个论坛启发,做了可以搜索嘿嘿嘿资源的搜索站 一晃这么多年过去,嘿嘿嘿的东西依然喜欢,但世间却变化万千 资源种类已不仅仅是X片,高清电影.纪录片.无损音乐.美剧.大型软件等等,似乎更加吸引 资源呈现方式也百花齐放,从最早的BT文件.电驴地址,到现在的磁链地址.各种云盘等等 而传统的P2P下载方式也变得格格不入,因为硬盘容量已经

坐标距离计算:php 计算 两个坐标之间的距离

<?php  define('EARTH_RADIUS', 6378.137);//地球半径  define('PI', 3.1415926);  /**  * 计算两组经纬度坐标 之间的距离  * params :lat1 纬度1: lng1 经度1: lat2 纬度2: lng2 经度2: len_type (1:m or 2:km);  * return m or km  */  function GetDistance($lat1, $lng1, $lat2, $lng2, $len_t