Bläddra i källkod

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

yangxiaohui 1 vecka sedan
förälder
incheckning
21c0fa19a7
17 ändrade filer med 139 tillägg och 173 borttagningar
  1. 13 34
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/funnel/FunnelAggregator.java
  2. 8 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/funnel/RecallVideoEntry.java
  3. 8 7
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankService.java
  4. 15 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/FilterParamFactory.java
  5. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate1STRRecallStrategy.java
  6. 22 36
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2AndChannelRovRecallStrategy.java
  7. 22 35
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2RovRecallStrategy.java
  8. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2STRRecallStrategy.java
  9. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadProvinceCate1RecallStrategy.java
  10. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadProvinceCate2RecallStrategy.java
  11. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceRovnRecallStrategy.java
  12. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceSTRRecallStrategy.java
  13. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserCate1RecallStrategy.java
  14. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserCate2RecallStrategy.java
  15. 5 7
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserDeconstructionKeywordsRecallStrategy.java
  16. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/YearShareCate1RecallStrategy.java
  17. 5 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/YearShareCate2RecallStrategy.java

+ 13 - 34
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/funnel/FunnelAggregator.java

@@ -40,12 +40,11 @@ public class FunnelAggregator {
         row.put("step_2_filter_reasons", JSON.toJSONString(buildStep2Reasons(ctx)));
         row.put("step_3_truncated", JSON.toJSONString(buildStep3(ctx)));
 
-        // step 4-8
+        // step 4-7 (step_8 已并入 step_7 — 冷启融合后即最终输出)
         row.put("step_4_merged", JSON.toJSONString(buildStep4(ctx)));
         row.put("step_5_ranked", JSON.toJSONString(buildStep5(ctx)));
         row.put("step_6_rank_truncated", JSON.toJSONString(buildStep6(ctx)));
         row.put("step_7_cold_start", JSON.toJSONString(buildStep7(ctx)));
-        row.put("step_8_output", JSON.toJSONString(buildStep8(ctx)));
 
         return row;
     }
@@ -138,19 +137,23 @@ public class FunnelAggregator {
 
     private static JSONArray buildStep5(FunnelContext ctx) {
         JSONArray arr = new JSONArray();
+        int rankIdx = 0;
         for (Long vid : ctx.getStep4MergedVideoIds()) {
             RankVideoEntry r = ctx.getStep5RankedData().get(vid);
             if (r == null) continue;
+            rankIdx++;
             JSONObject o = new JSONObject();
             o.put("vid", vid);
             o.put("attributedPushFrom", ctx.getStep4MergedAttribution().get(vid));
             o.put("recalls", buildRecallsForVid(ctx, vid));
             o.put("rank", buildRankBlock(r));
+            o.put("rank_index", rankIdx);
             arr.add(o);
         }
         return arr;
     }
 
+    /** 排序截断: rovRecallRank 的前 size 条(不含冷启)— 给 BI 做"不冷启会是谁"的参考 */
     private static JSONArray buildStep6(FunnelContext ctx) {
         JSONArray arr = new JSONArray();
         for (int i = 0; i < ctx.getStep6RankTruncatedVideoIds().size(); i++) {
@@ -167,37 +170,8 @@ public class FunnelAggregator {
         return arr;
     }
 
+    /** 冷启融合后的最终输出(实际下发列表)— 用 step8OutputVideoIds */
     private static JSONArray buildStep7(FunnelContext ctx) {
-        JSONArray arr = new JSONArray();
-        // step 7 = step 6 + if_cold_start
-        for (int i = 0; i < ctx.getStep6RankTruncatedVideoIds().size(); i++) {
-            long vid = ctx.getStep6RankTruncatedVideoIds().get(i);
-            JSONObject o = new JSONObject();
-            o.put("vid", vid);
-            o.put("attributedPushFrom", ctx.getStep4MergedAttribution().get(vid));
-            o.put("recalls", buildRecallsForVid(ctx, vid));
-            RankVideoEntry r = ctx.getStep5RankedData().get(vid);
-            if (r != null) o.put("rank", buildRankBlock(r));
-            o.put("rank_index", i + 1);
-            ColdStartAction action = ctx.getStep7ColdStartActions().getOrDefault(vid, ColdStartAction.NONE);
-            o.put("if_cold_start", action != ColdStartAction.NONE);
-            o.put("cold_start_action", action.name());
-            arr.add(o);
-        }
-        // 冷启 INSERTED 的视频可能不在 step6RankTruncatedVideoIds 里,补
-        ctx.getStep7ColdStartActions().forEach((vid, action) -> {
-            if (action == ColdStartAction.INSERTED && !ctx.getStep6RankTruncatedVideoIds().contains(vid)) {
-                JSONObject o = new JSONObject();
-                o.put("vid", vid);
-                o.put("if_cold_start", true);
-                o.put("cold_start_action", action.name());
-                arr.add(o);
-            }
-        });
-        return arr;
-    }
-
-    private static JSONArray buildStep8(FunnelContext ctx) {
         JSONArray arr = new JSONArray();
         for (int i = 0; i < ctx.getStep8OutputVideoIds().size(); i++) {
             long vid = ctx.getStep8OutputVideoIds().get(i);
@@ -209,6 +183,7 @@ public class FunnelAggregator {
             if (r != null) o.put("rank", buildRankBlock(r));
             ColdStartAction action = ctx.getStep7ColdStartActions().getOrDefault(vid, ColdStartAction.NONE);
             o.put("if_cold_start", action != ColdStartAction.NONE);
+            o.put("cold_start_action", action.name());
             o.put("rank_index", i + 1);
             arr.add(o);
         }
@@ -221,12 +196,13 @@ public class FunnelAggregator {
         ctx.getStages123RecallByStrategy().forEach((pf, entries) -> {
             for (RecallVideoEntry e : entries) {
                 if (e.getVideoId() != vid) continue;
-                if (e.getSelect() != SelectKind.SELF) continue;   // 只列该路实际贡献到合并的视频
+                if (e.getSelect() == null) continue;   // 列出该 vid 在该路 top-recallNum 名次内的命中(self + other)
                 JSONObject r = new JSONObject();
                 r.put("strategy", pf);
                 r.put("index", displayIndex(e.getIndex()));
                 r.put("score", round6(e.getScore()));
                 r.put("index_new", displayIndex(e.getIndexNewAfterFilter()));
+                r.put("select", e.getSelect().name().toLowerCase());
                 r.put("truncate", e.getTruncate());
                 recalls.add(r);
                 break;
@@ -244,8 +220,11 @@ public class FunnelAggregator {
         return o;
     }
 
-    /** double → 保留 6 位小数 */
+    /** double → 保留 6 位小数 (NaN / Infinity 兜底为 0,避免 BigDecimal.valueOf 抛 NumberFormatException) */
     private static BigDecimal round6(double v) {
+        if (Double.isNaN(v) || Double.isInfinite(v)) {
+            return BigDecimal.ZERO.setScale(6);
+        }
         return BigDecimal.valueOf(v).setScale(6, RoundingMode.HALF_UP);
     }
 

+ 8 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/funnel/RecallVideoEntry.java

@@ -15,6 +15,14 @@ import java.util.List;
 @NoArgsConstructor
 public class RecallVideoEntry {
     private long videoId;
+    /**
+     * 召回分数。来源 3 类:
+     * 1) 大部分 strategy 在 filter 前已有真实 score → 直接传 scoresMap
+     * 2) cate 加权 / 位置反推类 → strategy 在 filter 前预算 score (位置反推用 ids.size()-i,
+     *    cate 加权用 cateScore*videoScore 同 vid 取 max)。filter 通过的 vid 由
+     *    RecallService.syncScoresToFunnel 用 Video.rovScore 覆盖为业务最终值。
+     * 3) AppFallback / DouHotFlowPool 类纯列表/随机分召回,score 恒为 0 是正常的。
+     */
     private double score;
     private int index;                  // 召回原始位置 (0-based)
 

+ 8 - 7
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankService.java

@@ -44,9 +44,9 @@ public abstract class RankService {
             tagDuplicateVideos(param);
             List<Video> rovRecallRank = mergeAndRankRovRecall(param);
             writeFunnelMergedStage(param, rovRecallRank);
+            writeFunnelRankTruncatedStage(param, rovRecallRank, param.getSize());
             RankResult result = new RankResult(rovRecallRank);
             result.setCandidateVideoIds(toCandidateIds(rovRecallRank));
-            writeFunnelRankTruncatedStage(param, result.getVideos());
             return result;
         }
 
@@ -97,6 +97,7 @@ public abstract class RankService {
         // 2 正常走分发 排序+冷启动
         List<Video> rovRecallRank = mergeAndRankRovRecall(param);
         writeFunnelMergedStage(param, rovRecallRank);
+        writeFunnelRankTruncatedStage(param, rovRecallRank, param.getSize());
         List<Video> flowPoolRank = mergeAndRankFlowPoolRecall(param);
 
         List<Video> douHotFlowPoolRank = extractAndSort(param, DouHotFlowPoolRecallStrategy.PUSH_FROM);
@@ -107,7 +108,6 @@ public abstract class RankService {
         RankResult result = mergeAndSort(param, rovRecallRank, flowPoolRank, douHotFlowPoolRank);
         if (result != null) {
             result.setCandidateVideoIds(toCandidateIds(rovRecallRank));
-            writeFunnelRankTruncatedStage(param, result.getVideos());
         }
         return result;
     }
@@ -125,12 +125,13 @@ public abstract class RankService {
         }
     }
 
-    /** 阶段 6: 排序截断 — rankResult.videos 顺序 = rank_index */
-    private static void writeFunnelRankTruncatedStage(RankParam param, List<Video> rankedVideos) {
-        if (param == null || param.getFunnelContext() == null || CollectionUtils.isEmpty(rankedVideos)) return;
+    /** 阶段 6: 排序截断 — 纯 rank 排序后的前 size 条(不含冷启,作为冷启替换前的快照) */
+    private static void writeFunnelRankTruncatedStage(RankParam param, List<Video> rovRecallRank, int size) {
+        if (param == null || param.getFunnelContext() == null || CollectionUtils.isEmpty(rovRecallRank)) return;
         FunnelContext ctx = param.getFunnelContext();
-        for (Video v : rankedVideos) {
-            ctx.getStep6RankTruncatedVideoIds().add(v.getVideoId());
+        int n = Math.min(rovRecallRank.size(), size);
+        for (int i = 0; i < n; i++) {
+            ctx.getStep6RankTruncatedVideoIds().add(rovRecallRank.get(i).getVideoId());
         }
     }
 

+ 15 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/FilterParamFactory.java

@@ -3,6 +3,7 @@ package com.tzld.piaoquan.recommend.server.service.recall;
 import com.google.common.collect.Lists;
 import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -40,4 +41,18 @@ public class FilterParamFactory {
         filterParam.setFunnelContext(param.getFunnelContext());
         return filterParam;
     }
+
+    /**
+     * 按位置反推生成 scoresMap (score = ids.size() - i),用于无原始召回分的 strategy。
+     * Strategy 应该把这同一份 scoresMap 既传给 FilterParamFactory.create,又用来给 Video.setRovScore,
+     * 保证 filter 前/后口径一致。
+     */
+    public static Map<Long, Double> positionScores(List<Long> ids) {
+        Map<Long, Double> scoresMap = new HashMap<>(ids.size());
+        int n = ids.size();
+        for (int i = 0; i < n; i++) {
+            scoresMap.put(ids.get(i), (double) (n - i));
+        }
+        return scoresMap;
+    }
 }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate1STRRecallStrategy.java

@@ -84,15 +84,14 @@ public class HeadCate1STRRecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        Map<Long, Double> scoresMap = FilterParamFactory.positionScores(vidList);
+        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-            List<Long> filterIds = filterResult.getVideoIds();
-            int n = filterIds.size();
-            for (int i = 0; i < n; i++) {
+            for (Long vid : filterResult.getVideoIds()) {
                 Video video = new Video();
-                video.setVideoId(filterIds.get(i));
-                video.setRovScore(n - i);
+                video.setVideoId(vid);
+                video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                 video.setPushFrom(pushFrom());
                 videosResult.add(video);
             }

+ 22 - 36
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2AndChannelRovRecallStrategy.java

@@ -75,46 +75,32 @@ public class HeadCate2AndChannelRovRecallStrategy implements RecallStrategy {
 
         Map<String, Map<String, Double>> recallVideoMap = this.cate2Recall(new ArrayList<>(mergeCate2Pair.keySet()), channelName);
 
-        // 过滤
-        List<Long> allVid = recallVideoMap.values().stream()
-                .map(Map::keySet)
-                .flatMap(Collection::stream)
-                .map(Long::parseLong)
-                .collect(Collectors.toList());
-
-        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), null);
-        FilterResult filterResult = filterService.filter(filterParam);
-        Set<Long> filterVids = new HashSet<>(filterResult.getVideoIds());
-        filterVids.remove(param.getVideoId());
-
-        Set<Long> hit = new HashSet<>();
+        // 预算 scoresMap (按 mergeCate2Pair 顺序,同 vid 取首次出现的 cateScore*videoScore,业务原顺序)
+        Map<Long, Double> scoresMap = new LinkedHashMap<>();
         for (Map.Entry<String, Double> entry : mergeCate2Pair.entrySet()) {
-            String cate = entry.getKey();
             Double cateScore = entry.getValue();
-
-            Map<String, Double> videoMap = recallVideoMap.getOrDefault(cate, new HashMap<>());
-            for (Map.Entry<String, Double> videoEntry : videoMap.entrySet()) {
-                long vid = Long.parseLong(videoEntry.getKey());
-
-                // 过滤之后不存在的视频,过滤掉
-                if (!filterVids.contains(vid)) {
-                    continue;
-                }
-                // 去重
-                if (hit.contains(vid)) {
-                    continue;
-                }
-                hit.add(vid);
-
-                Double videoScore = videoEntry.getValue();
-
-                Video video = new Video();
-                video.setVideoId(vid);
-                video.setRovScore(cateScore * videoScore);
-                video.setPushFrom(PUSH_FROM);
-                videoResult.add(video);
+            Map<String, Double> videoMap = recallVideoMap.getOrDefault(entry.getKey(), new HashMap<>());
+            for (Map.Entry<String, Double> v : videoMap.entrySet()) {
+                long vid = Long.parseLong(v.getKey());
+                scoresMap.putIfAbsent(vid, cateScore * v.getValue());
             }
+        }
+        List<Long> allVid = new ArrayList<>(scoresMap.keySet());
+
+        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), scoresMap);
+        FilterResult filterResult = filterService.filter(filterParam);
+        Set<Long> filterVids = new HashSet<>(filterResult.getVideoIds());
+        filterVids.remove(param.getVideoId());
 
+        // 按 scoresMap 的 insertion order 输出
+        for (Map.Entry<Long, Double> e : scoresMap.entrySet()) {
+            long vid = e.getKey();
+            if (!filterVids.contains(vid)) continue;
+            Video video = new Video();
+            video.setVideoId(vid);
+            video.setRovScore(e.getValue());
+            video.setPushFrom(PUSH_FROM);
+            videoResult.add(video);
         }
 
         videoResult.sort(Comparator.comparingDouble(o -> -o.getRovScore()));

+ 22 - 35
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2RovRecallStrategy.java

@@ -73,45 +73,32 @@ public class HeadCate2RovRecallStrategy implements RecallStrategy {
 
         Map<String, Map<String, Double>> recallVideoMap = this.cate2Recall(new ArrayList<>(mergeCate2Pair.keySet()));
 
-        // 过滤
-        List<Long> allVid = recallVideoMap.values().stream()
-                .map(Map::keySet)
-                .flatMap(Collection::stream)
-                .map(Long::parseLong)
-                .collect(Collectors.toList());
-
-        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), null);
+        // 预算 scoresMap (按 mergeCate2Pair 顺序,同 vid 取首次出现的 cateScore*videoScore,业务原顺序)
+        Map<Long, Double> scoresMap = new LinkedHashMap<>();
+        for (Map.Entry<String, Double> entry : mergeCate2Pair.entrySet()) {
+            Double cateScore = entry.getValue();
+            Map<String, Double> videoMap = recallVideoMap.getOrDefault(entry.getKey(), new HashMap<>());
+            for (Map.Entry<String, Double> v : videoMap.entrySet()) {
+                long vid = Long.parseLong(v.getKey());
+                scoresMap.putIfAbsent(vid, cateScore * v.getValue());
+            }
+        }
+        List<Long> allVid = new ArrayList<>(scoresMap.keySet());
+
+        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         Set<Long> filterVids = new HashSet<>(filterResult.getVideoIds());
         filterVids.remove(param.getVideoId());
 
-        Set<Long> hit = new HashSet<>();
-        for (Map.Entry<String, Double> entry : mergeCate2Pair.entrySet()) {
-            String cate = entry.getKey();
-            Double cateScore = entry.getValue();
-
-            Map<String, Double> videoMap = recallVideoMap.getOrDefault(cate, new HashMap<>());
-            for (Map.Entry<String, Double> videoEntry : videoMap.entrySet()) {
-                long vid = Long.parseLong(videoEntry.getKey());
-
-                // 过滤之后不存在的视频,过滤掉
-                if (!filterVids.contains(vid)) {
-                    continue;
-                }
-                // 去重
-                if (hit.contains(vid)) {
-                    continue;
-                }
-                hit.add(vid);
-
-                Double videoScore = videoEntry.getValue();
-
-                Video video = new Video();
-                video.setVideoId(vid);
-                video.setRovScore(cateScore * videoScore);
-                video.setPushFrom(PUSH_FROM);
-                videoResult.add(video);
-            }
+        // 按 scoresMap 的 insertion order 输出(= mergeCate2Pair 顺序 + 同 vid 首次出现)
+        for (Map.Entry<Long, Double> e : scoresMap.entrySet()) {
+            long vid = e.getKey();
+            if (!filterVids.contains(vid)) continue;
+            Video video = new Video();
+            video.setVideoId(vid);
+            video.setRovScore(e.getValue());
+            video.setPushFrom(PUSH_FROM);
+            videoResult.add(video);
 
         }
 

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2STRRecallStrategy.java

@@ -84,15 +84,14 @@ public class HeadCate2STRRecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        Map<Long, Double> scoresMap = FilterParamFactory.positionScores(vidList);
+        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-            List<Long> filterIds = filterResult.getVideoIds();
-            int n = filterIds.size();
-            for (int i = 0; i < n; i++) {
+            for (Long vid : filterResult.getVideoIds()) {
                 Video video = new Video();
-                video.setVideoId(filterIds.get(i));
-                video.setRovScore(n - i);
+                video.setVideoId(vid);
+                video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                 video.setPushFrom(pushFrom());
                 videosResult.add(video);
             }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadProvinceCate1RecallStrategy.java

@@ -85,15 +85,14 @@ public class HeadProvinceCate1RecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        Map<Long, Double> scoresMap = FilterParamFactory.positionScores(vidList);
+        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-            List<Long> filterIds = filterResult.getVideoIds();
-            int n = filterIds.size();
-            for (int i = 0; i < n; i++) {
+            for (Long vid : filterResult.getVideoIds()) {
                 Video video = new Video();
-                video.setVideoId(filterIds.get(i));
-                video.setRovScore(n - i);
+                video.setVideoId(vid);
+                video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                 video.setPushFrom(pushFrom());
                 videosResult.add(video);
             }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadProvinceCate2RecallStrategy.java

@@ -85,15 +85,14 @@ public class HeadProvinceCate2RecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        Map<Long, Double> scoresMap = FilterParamFactory.positionScores(vidList);
+        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-            List<Long> filterIds = filterResult.getVideoIds();
-            int n = filterIds.size();
-            for (int i = 0; i < n; i++) {
+            for (Long vid : filterResult.getVideoIds()) {
                 Video video = new Video();
-                video.setVideoId(filterIds.get(i));
-                video.setRovScore(n - i);
+                video.setVideoId(vid);
+                video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                 video.setPushFrom(pushFrom());
                 videosResult.add(video);
             }

+ 1 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceRovnRecallStrategy.java

@@ -1,3 +1,4 @@
+
 package com.tzld.piaoquan.recommend.server.service.recall.strategy;
 
 import com.tzld.piaoquan.recommend.server.model.Video;

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceSTRRecallStrategy.java

@@ -78,15 +78,14 @@ public class ProvinceSTRRecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        Map<Long, Double> scoresMap = FilterParamFactory.positionScores(vidList);
+        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-            List<Long> filterIds = filterResult.getVideoIds();
-            int n = filterIds.size();
-            for (int i = 0; i < n; i++) {
+            for (Long vid : filterResult.getVideoIds()) {
                 Video video = new Video();
-                video.setVideoId(filterIds.get(i));
-                video.setRovScore(n - i);
+                video.setVideoId(vid);
+                video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                 video.setPushFrom(pushFrom());
                 videosResult.add(video);
             }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserCate1RecallStrategy.java

@@ -50,15 +50,14 @@ public class UserCate1RecallStrategy implements RecallStrategy {
                 if (!keys.isEmpty()) {
                     List<String> values = redisTemplate.opsForValue().multiGet(keys);
                     List<Long> ids = recall(param.getVideoId(), values);
-                    FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), null);
+                    Map<Long, Double> scoresMap = FilterParamFactory.positionScores(ids);
+                    FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), scoresMap);
                     FilterResult filterResult = filterService.filter(filterParam);
                     if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-                        List<Long> filterIds = filterResult.getVideoIds();
-                        int n = filterIds.size();
-                        for (int i = 0; i < n; i++) {
+                        for (Long vid : filterResult.getVideoIds()) {
                             Video video = new Video();
-                            video.setVideoId(filterIds.get(i));
-                            video.setRovScore(n - i);
+                            video.setVideoId(vid);
+                            video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                             video.setPushFrom(pushFrom());
                             videosResult.add(video);
                         }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserCate2RecallStrategy.java

@@ -50,15 +50,14 @@ public class UserCate2RecallStrategy implements RecallStrategy {
                 if (!keys.isEmpty()) {
                     List<String> values = redisTemplate.opsForValue().multiGet(keys);
                     List<Long> ids = recall(param.getVideoId(), values);
-                    FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), null);
+                    Map<Long, Double> scoresMap = FilterParamFactory.positionScores(ids);
+                    FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), scoresMap);
                     FilterResult filterResult = filterService.filter(filterParam);
                     if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-                        List<Long> filterIds = filterResult.getVideoIds();
-                        int n = filterIds.size();
-                        for (int i = 0; i < n; i++) {
+                        for (Long vid : filterResult.getVideoIds()) {
                             Video video = new Video();
-                            video.setVideoId(filterIds.get(i));
-                            video.setRovScore(n - i);
+                            video.setVideoId(vid);
+                            video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                             video.setPushFrom(pushFrom());
                             videosResult.add(video);
                         }

+ 5 - 7
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserDeconstructionKeywordsRecallStrategy.java

@@ -58,19 +58,17 @@ public class UserDeconstructionKeywordsRecallStrategy implements RecallStrategy
             }
             List<String> values = redisTemplate.opsForValue().multiGet(keys);
             List<Long> vids = this.recall(param.getVideoId(), values);
-            FilterParam filterParam = FilterParamFactory.create(param, vids, pushFrom(), null);
+            Map<Long, Double> scoresMap = FilterParamFactory.positionScores(vids);
+            FilterParam filterParam = FilterParamFactory.create(param, vids, pushFrom(), scoresMap);
 
             FilterResult filterResult = filterService.filter(filterParam);
             if (Objects.isNull(filterResult) || CollectionUtils.isEmpty(filterResult.getVideoIds())) {
                 return videos;
             }
-            List<Long> filterIds = filterResult.getVideoIds();
-
-            int n = filterIds.size();
-            for (int i = 0; i < n; i++) {
+            for (Long vid : filterResult.getVideoIds()) {
                 Video video = new Video();
-                video.setVideoId(filterIds.get(i));
-                video.setRovScore(n - i);
+                video.setVideoId(vid);
+                video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                 video.setPushFrom(pushFrom());
                 videos.add(video);
             }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/YearShareCate1RecallStrategy.java

@@ -81,15 +81,14 @@ public class YearShareCate1RecallStrategy implements RecallStrategy {
             List<String> values = redisTemplate.opsForValue().multiGet(keys);
             List<Long> ids = recall(param.getVideoId(), values);
 
-            FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), null);
+            Map<Long, Double> scoresMap = FilterParamFactory.positionScores(ids);
+            FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), scoresMap);
             FilterResult filterResult = filterService.filter(filterParam);
             if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-                List<Long> filterIds = filterResult.getVideoIds();
-                int n = filterIds.size();
-                for (int i = 0; i < n; i++) {
+                for (Long vid : filterResult.getVideoIds()) {
                     Video video = new Video();
-                    video.setVideoId(filterIds.get(i));
-                    video.setRovScore(n - i);
+                    video.setVideoId(vid);
+                    video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                     video.setPushFrom(pushFrom());
                     videosResult.add(video);
                 }

+ 5 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/YearShareCate2RecallStrategy.java

@@ -80,15 +80,14 @@ public class YearShareCate2RecallStrategy implements RecallStrategy {
             List<String> values = redisTemplate.opsForValue().multiGet(keys);
             List<Long> ids = recall(param.getVideoId(), values);
 
-            FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), null);
+            Map<Long, Double> scoresMap = FilterParamFactory.positionScores(ids);
+            FilterParam filterParam = FilterParamFactory.create(param, ids, pushFrom(), scoresMap);
             FilterResult filterResult = filterService.filter(filterParam);
             if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
-                List<Long> filterIds = filterResult.getVideoIds();
-                int n = filterIds.size();
-                for (int i = 0; i < n; i++) {
+                for (Long vid : filterResult.getVideoIds()) {
                     Video video = new Video();
-                    video.setVideoId(filterIds.get(i));
-                    video.setRovScore(n - i);
+                    video.setVideoId(vid);
+                    video.setRovScore(scoresMap.getOrDefault(vid, 0.0));
                     video.setPushFrom(pushFrom());
                     videosResult.add(video);
                 }