Преглед на файлове

Merge branch 'feature_20260529_v567_preview_ttl_short' of algorithm/recommend-server into master

yangxiaohui преди 5 дни
родител
ревизия
692a744176

+ 20 - 10
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/PreViewedService.java

@@ -29,6 +29,9 @@ public class PreViewedService {
     @Qualifier("redisTemplate")
     private RedisTemplate<String, String> redisTemplate;
 
+    @Autowired
+    private ExperimentService experimentService;
+
     @ApolloJsonValue("${preview.exp.config:{}}")
     private Map<String, Integer> preViewExpConfig;
 
@@ -48,7 +51,8 @@ public class PreViewedService {
 //                }
 //            });
 
-    public void updateCache(int appType, String mid, List<Video> videos, Set<String> abExpCodes) {
+    public void updateCache(int appType, String mid, String rootSessionId,
+                            List<Video> videos, Set<String> abExpCodes) {
         if (StringUtils.isBlank(mid)
                 || CollectionUtils.isEmpty(videos)) {
             return;
@@ -60,20 +64,26 @@ public class PreViewedService {
         }
         String key = String.format(KEY_PRE_VIEWED_FORMAT, appType, mid);
 
-        int expire = 30;
+        int expire = resolveExpireMinutes(appType, rootSessionId, abExpCodes);
+
+        redisTemplate.opsForSet().add(key, videoIds);
+        redisTemplate.expire(key, expire, TimeUnit.MINUTES);
+    }
+
+    /**
+     * 遍历 preview.exp.config(expCode → minutes),用 judgeHitAlgoExp 判断是否命中(算法层)。
+     * judgeHitAlgoExp 同时覆盖 abExpCodes 通道和 root.session.id.exp.layer.config.算法 尾号通道。
+     * 都不命中 → 默认 30min。
+     */
+    private int resolveExpireMinutes(int appType, String rootSessionId, Set<String> abExpCodes) {
         if (MapUtils.isNotEmpty(preViewExpConfig)) {
             for (Map.Entry<String, Integer> entry : preViewExpConfig.entrySet()) {
-                if (CommonCollectionUtils.contains(abExpCodes, entry.getKey())) {
-                    expire = entry.getValue() != null
-                            ? entry.getValue()
-                            : 30;
-                    break;
+                if (experimentService.judgeHitAlgoExp(appType, rootSessionId, abExpCodes, entry.getKey())) {
+                    return entry.getValue() != null ? entry.getValue() : 30;
                 }
             }
         }
-
-        redisTemplate.opsForSet().add(key, videoIds);
-        redisTemplate.expire(key, expire, TimeUnit.MINUTES);
+        return 30;
     }
 
     public Set<Long> getVideoIds(int appType, String mid) {

+ 1 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

@@ -759,7 +759,7 @@ public class RecommendService {
             return;
         }
 
-        preViewedService.updateCache(request.getAppType(), request.getMid(), videos, param.getAbExpCodes());
+        preViewedService.updateCache(request.getAppType(), request.getMid(), param.getRootSessionId(), videos, param.getAbExpCodes());
 
         boolean hit860Exp = experimentService.judgeHitExp(RootSessionIdLayer.product, param.getAppType(), param.getRootSessionId(), param.getAbExpCodes(), "860");
         if (hit860Exp) {

+ 37 - 62
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV567.java

@@ -48,41 +48,43 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
         long currentMs = System.currentTimeMillis();
         Set<Long> setVideo = new HashSet<>();
         setVideo.add(param.getHeadVid());
-        // 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);
+        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);
 
         // 记录召回源中的视频
         this.rankBeforePostProcessor(rovRecallRank);
@@ -456,31 +458,4 @@ 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;
-    }
 }