|
|
@@ -48,43 +48,41 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
|
|
|
long currentMs = System.currentTimeMillis();
|
|
|
Set<Long> setVideo = new HashSet<>();
|
|
|
setVideo.add(param.getHeadVid());
|
|
|
- List<Video> rovRecallRank = new ArrayList<>();
|
|
|
- // -------------------5路特殊旧召回------------------
|
|
|
- RecallUtils.extractOldSpecialRecall(mergeWeight.getOrDefault("oldSpecialN", (double) param.getSize()).intValue(), param, setVideo, rovRecallRank);
|
|
|
- //-------------------return相似召回------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("v6", 5.0).intValue(), param, ReturnVideoRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- //-------------------新地域召回------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("v1", 5.0).intValue(), param, RegionRealtimeRecallStrategyV1.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- //-------------------scene cf rovn------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("sceneCFRovn", 5.0).intValue(), param, SceneCFRovnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- //-------------------scene cf rosn------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("sceneCFRosn", 5.0).intValue(), param, SceneCFRosnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- // -------------------user cate1------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("cate1RecallN", 5.0).intValue(), param, UserCate1RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- // -------------------user cate2------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("cate2RecallN", 5.0).intValue(), param, UserCate2RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- // -------------------head province cate1------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("headCate1RecallN", 3.0).intValue(), param, HeadProvinceCate1RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- // -------------------head province cate2------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("headCate2RecallN", 3.0).intValue(), param, HeadProvinceCate2RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- //-------------------head cate2 of rovn------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("headCate2Rov", 5.0).intValue(), param, HeadCate2RovRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- //-------------------city rovn------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("cityRov", 5.0).intValue(), param, CityRovnRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- //-------------------priori province rovn------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriProvinceRov", 3.0).intValue(), param, PrioriProvinceRovnRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- //-------------------priori province str------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriProvinceStr", 1.0).intValue(), param, PrioriProvinceStrRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- //-------------------priori province ros------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriProvinceRos", 1.0).intValue(), param, PrioriProvinceRosRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- //-------------------return1 cate2 ros------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Ros", 5.0).intValue(), param, Return1Cate2RosRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
- //-------------------return1 cate2 str------------------
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Str", 5.0).intValue(), param, Return1Cate2StrRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
|
|
|
-
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("yearShareCate1", 5.0).intValue(), param, YearShareCate1RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("yearShareCate2", 5.0).intValue(), param, YearShareCate2RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
- RecallUtils.extractRecall(mergeWeight.getOrDefault("yearReturnCate2", 5.0).intValue(), param, YearReturnCate2RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
|
|
|
+ // V567: 按优先级 + n/m 配额融合 23 路召回 (替代 V568 逐路 extractRecall 累加模式)
|
|
|
+ // 优先级顺序 = LinkedHashMap 插入顺序: 用户行为触发 → 头部+场景触发 → 热门触发 → 地域触发
|
|
|
+ int totalRecallN = mergeWeight.getOrDefault("totalRecallN", 80.0).intValue();
|
|
|
+ int singleRecallN = mergeWeight.getOrDefault("singleRecallN", 5.0).intValue();
|
|
|
+
|
|
|
+ Map<String, List<Video>> recallMap = new LinkedHashMap<>();
|
|
|
+ // 用户行为触发
|
|
|
+ recallMap.put(UserCate1RecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, UserCate1RecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(UserCate2RecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, UserCate2RecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(YearShareCate1RecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, YearShareCate1RecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(YearShareCate2RecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, YearShareCate2RecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(YearReturnCate2RecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, YearReturnCate2RecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(Return1Cate2RosRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, Return1Cate2RosRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(Return1Cate2StrRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, Return1Cate2StrRecallStrategy.PUSH_FORM));
|
|
|
+ // 头部 + 场景触发
|
|
|
+ recallMap.put(HeadProvinceCate1RecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, HeadProvinceCate1RecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(HeadProvinceCate2RecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, HeadProvinceCate2RecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(HeadCate2RovRecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, HeadCate2RovRecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(SceneCFRovnRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, SceneCFRovnRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(SceneCFRosnRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, SceneCFRosnRecallStrategy.PUSH_FORM));
|
|
|
+ // 热门触发
|
|
|
+ recallMap.put(ReturnVideoRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, ReturnVideoRecallStrategy.PUSH_FORM));
|
|
|
+ // 地域触发
|
|
|
+ recallMap.put(CityRovnRecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, CityRovnRecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(RegionRealtimeRecallStrategyV1.PUSH_FORM, RecallUtils.extractAndSort(param, RegionRealtimeRecallStrategyV1.PUSH_FORM));
|
|
|
+ recallMap.put(RegionHRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, RegionHRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(RegionHDupRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, RegionHDupRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(Region24HRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, Region24HRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(RegionRelative24HRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, RegionRelative24HRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(RegionRelative24HDupRecallStrategy.PUSH_FORM, RecallUtils.extractAndSort(param, RegionRelative24HDupRecallStrategy.PUSH_FORM));
|
|
|
+ recallMap.put(PrioriProvinceRovnRecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, PrioriProvinceRovnRecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(PrioriProvinceStrRecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, PrioriProvinceStrRecallStrategy.PUSH_FROM));
|
|
|
+ recallMap.put(PrioriProvinceRosRecallStrategy.PUSH_FROM, RecallUtils.extractAndSort(param, PrioriProvinceRosRecallStrategy.PUSH_FROM));
|
|
|
+
|
|
|
+ List<Video> rovRecallRank = mergeRecallByQuota(recallMap, totalRecallN, singleRecallN, setVideo);
|
|
|
|
|
|
// 记录召回源中的视频
|
|
|
this.rankBeforePostProcessor(rovRecallRank);
|
|
|
@@ -458,4 +456,31 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
|
|
|
}
|
|
|
return newScore;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按 LinkedHashMap 插入顺序遍历每路召回, 单路最多取 m 个 (去重成功才计入 quota), 整体最多 n 个。
|
|
|
+ * dedup 是入参也是出参: 主流程在外面已经把 headVid 加进去, 这里继续追加挑中的 vid。
|
|
|
+ */
|
|
|
+ private static List<Video> mergeRecallByQuota(Map<String, List<Video>> recallMap, int n, int m, Set<Long> dedup) {
|
|
|
+ List<Video> result = new ArrayList<>(n);
|
|
|
+ for (List<Video> items : recallMap.values()) {
|
|
|
+ if (result.size() >= n) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (items == null || items.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int strategyCount = 0;
|
|
|
+ for (Video item : items) {
|
|
|
+ if (strategyCount >= m || result.size() >= n) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (dedup.add(item.getVideoId())) {
|
|
|
+ result.add(item);
|
|
|
+ strategyCount++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
}
|