导读
智能匹配引擎主要服务于哈啰四轮业务,为顺风车、打车业务的司乘匹配场景提供强有力的技术支持。本文主要讲解顺风车业务下司机与乘客相互匹配过程中的一些技术实现。
应用场景
匹配在顺风车业务的应用场景按照用户类型进行划分主要分为司机端和乘客端,下面是两端主要涉及的匹配场景。
司机端
乘客端
整体流程
数据链路
1.司机/乘客发单的订单数据通过业务DB的binlog同步到kafka,flink任务消费kafka中的消息写入ES。
2.司机/乘客找单的过程是通过匹配引擎服务在ES中进行订单数据的召回。
匹配过程
召回过程详解
司机无行程(附近找单)
同城
列表:召回起终点城市和司机当前所在城市相同,且起点在司机当前所在位置指定半径范围内的最近三天发单的乘客订单。
聚合:对召回结果做二级聚合。纬度:终点区县、终点商圈
跨城
列表:召回起点城市和司机当前所在城市相同,终点城市和司机当前所在城市不同的最近十六天发单的乘客订单。
聚合:对召回结果做二级聚合。纬度:终点城市、终点区县
司机有自主行程
司机有行程情况下的匹配过程主要有以下七个步骤,主要涉及基本条件、时间、空间、覆盖度等维度的过滤,其中空间、覆盖度相关的过滤需要对数据做一些业务逻辑或者算法的计算才能决定是否符合召回条件,我们是通过ES插件的方式来实现的。
ETA过滤
ETA : 司机预计抵达时间(estimated time of arrival), 等于司机(发出时间 + 司乘距离/行驶速度),其中司乘距离是曼哈顿距离,行驶速度是通过按照里程动态配置的。
夹角过滤及距离过滤
方向夹角:司机起终点连线直线的延长线和乘客起终点直线的延长线相交的角度叫方向夹角,图示角coa即为方向夹角。筛选司机路线方向与乘客路线方向的夹角小于指定范围的乘客订单,且乘客起终点到司机路线的最短距离小于指定值。
接驾夹角:司机起终点连线直线和司乘起点连线直线相交的角度叫接驾夹角,图示角CAB即为接驾夹角。筛选司机接驾AC路线与司机路线AB的夹角小于指定范围的乘客订单,或者是接驾距离AC小于指定值。
顺路度计算
顺路度1.0定义:顺路度用来衡量司机从A_start至B_end与乘客从C_start至D_end的顺路程度,仅与空间位置信息相关,与订单价格、出发时间等信息无关。
以下是几种距离计算的方式
1.曼哈顿距离
曼哈顿距离也叫出租车距离,是由 19 世纪著名的德国犹太人数学家赫尔曼·闵可夫斯基发明的。用来标明两个点在标准坐标系上的绝对轴距总和。
上图中红色、蓝色、黄色线段的距离都叫做曼哈顿距离。
2.点到线的最短距离
当前司机路线的是通过坐标点的集合形式存储的,点到线的最短距离主要计算乘客到司机路线的最短距离计算。
目前有两版的计算方式,方案二是在方案一的基础上做了优化的实现。
方案一:
1、循环AB路径规划的所有点与C、D分别做最短距离计算,得到值S1=CE。
2、AB之间每相邻两个点与C、D分别做锐角计算,满足都是锐角的条件后,得到垂直距离S2=CG。
3、比较S1、S2 ,得到最短距离。
方案二:
1、优化方案一的第一步骤,对于AB之间的点集分步长进行计算,拿到最短位点E。
2、对E点进行步长扩展,得到DF,再对DF之间的点集逐一进行最短距离计算。
3、针对DF之间的点集相邻两点进行锐角计算,得到最短垂直距离。
4、比较2、3步骤得到的距离,取小值。
共享里程计算
共享里程:描述司机本身路程与司机接驾乘客后的路程之间的关系,值范围0-1,值越大表示收益越高。
排序
预排序
预排序主要应用在ES召回阶段后的截取中,在初期是通过顺路度的值进行排序的,后期发现排序接单概率的影响还是挺大的就逐步对预排序进行了升级,加入了一些订单价格、时间等特征。
算法排序
召回后的精排决定了用户的第一感知,必须尽量的保证让最有可能接单的订单排前面。针对此模块是通过算法模型介入进行排序的。在1.0的实现是通过从hdfs上加载pmml算法模型到本地,从es取到召回结果后直接在本地进行模型排序。2.0的阶段把排序模块单独抽出一个排序服务,可以提供特征维度更多的TF深度模型计算,同时在排序的精准度上还有了更好的提升。
(本文作者:郑崇祥)
本文系哈啰技术团队出品,未经许可,不得进行商业性转载或者使用。非商业目的转载或使用本文内容,敬请注明“内容转载自哈啰技术团队”。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。