Browse Source

fix:漏斗 score=0 问题 — 让 filter 前没 score 的 strategy 预算 score

- FilterParamFactory 加 createWithPositionScore helper (score = ids.size() - i)
- 位置反推类 10 个 strategy 改用 helper: HeadCate1STR/HeadCate2STR/
  HeadProvinceCate1/2/ProvinceSTR/UserCate1/2/UserDecon/YearShareCate1/2
- cate 加权类 2 个 strategy 内联预算 scoresMap (同 vid 取 max):
  HeadCate2Rov, HeadCate2AndChannelRov
- AppFallback / DouHotFlowPool 保留 null (本身无 score 概念)
- 更新 RecallVideoEntry.score 字段注释说明 3 类 score 来源
yangxiaohui 1 tuần trước cách đây
mục cha
commit
5e53d48d8e
14 tập tin đã thay đổi với 54 bổ sung22 xóa
  1. 8 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/funnel/RecallVideoEntry.java
  2. 14 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/FilterParamFactory.java
  3. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate1STRRecallStrategy.java
  4. 11 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2AndChannelRovRecallStrategy.java
  5. 11 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2RovRecallStrategy.java
  6. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2STRRecallStrategy.java
  7. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadProvinceCate1RecallStrategy.java
  8. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadProvinceCate2RecallStrategy.java
  9. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceSTRRecallStrategy.java
  10. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserCate1RecallStrategy.java
  11. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserCate2RecallStrategy.java
  12. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/UserDeconstructionKeywordsRecallStrategy.java
  13. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/YearShareCate1RecallStrategy.java
  14. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/YearShareCate2RecallStrategy.java

+ 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)
 

+ 14 - 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,17 @@ public class FilterParamFactory {
         filterParam.setFunnelContext(param.getFunnelContext());
         return filterParam;
     }
+
+    /**
+     * 漏斗版:按位置反推 score (score = ids.size() - i)。
+     * 给 filter 后才赋分 (Video.rovScore = n - i) 的 strategy 用,让 filter 前 entry.score 也有合理值。
+     */
+    public static FilterParam createWithPositionScore(RecallParam param, List<Long> ids, String pushFrom) {
+        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 create(param, ids, pushFrom, scoresMap);
+    }
 }

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

@@ -84,7 +84,7 @@ public class HeadCate1STRRecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, vidList, pushFrom());
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
             List<Long> filterIds = filterResult.getVideoIds();

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

@@ -76,13 +76,18 @@ 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());
+        Map<Long, Double> scoresMap = new HashMap<>();
+        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.merge(vid, cateScore * v.getValue(), Math::max);
+            }
+        }
+        List<Long> allVid = new ArrayList<>(scoresMap.keySet());
 
-        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         Set<Long> filterVids = new HashSet<>(filterResult.getVideoIds());
         filterVids.remove(param.getVideoId());

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

@@ -74,13 +74,18 @@ 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());
+        Map<Long, Double> scoresMap = new HashMap<>();
+        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.merge(vid, cateScore * v.getValue(), Math::max);
+            }
+        }
+        List<Long> allVid = new ArrayList<>(scoresMap.keySet());
 
-        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.create(param, allVid, pushFrom(), scoresMap);
         FilterResult filterResult = filterService.filter(filterParam);
         Set<Long> filterVids = new HashSet<>(filterResult.getVideoIds());
         filterVids.remove(param.getVideoId());

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

@@ -84,7 +84,7 @@ public class HeadCate2STRRecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, vidList, pushFrom());
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
             List<Long> filterIds = filterResult.getVideoIds();

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

@@ -85,7 +85,7 @@ public class HeadProvinceCate1RecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, vidList, pushFrom());
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
             List<Long> filterIds = filterResult.getVideoIds();

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

@@ -85,7 +85,7 @@ public class HeadProvinceCate2RecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, vidList, pushFrom());
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
             List<Long> filterIds = filterResult.getVideoIds();

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

@@ -78,7 +78,7 @@ public class ProvinceSTRRecallStrategy implements RecallStrategy {
     }
 
     private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
-        FilterParam filterParam = FilterParamFactory.create(param, vidList, pushFrom(), null);
+        FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, vidList, pushFrom());
         FilterResult filterResult = filterService.filter(filterParam);
         if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
             List<Long> filterIds = filterResult.getVideoIds();

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

@@ -50,7 +50,7 @@ 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);
+                    FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, ids, pushFrom());
                     FilterResult filterResult = filterService.filter(filterParam);
                     if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
                         List<Long> filterIds = filterResult.getVideoIds();

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

@@ -50,7 +50,7 @@ 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);
+                    FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, ids, pushFrom());
                     FilterResult filterResult = filterService.filter(filterParam);
                     if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
                         List<Long> filterIds = filterResult.getVideoIds();

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

@@ -58,7 +58,7 @@ 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);
+            FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, vids, pushFrom());
 
             FilterResult filterResult = filterService.filter(filterParam);
             if (Objects.isNull(filterResult) || CollectionUtils.isEmpty(filterResult.getVideoIds())) {

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

@@ -81,7 +81,7 @@ 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);
+            FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, ids, pushFrom());
             FilterResult filterResult = filterService.filter(filterParam);
             if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
                 List<Long> filterIds = filterResult.getVideoIds();

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

@@ -80,7 +80,7 @@ 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);
+            FilterParam filterParam = FilterParamFactory.createWithPositionScore(param, ids, pushFrom());
             FilterResult filterResult = filterService.filter(filterParam);
             if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
                 List<Long> filterIds = filterResult.getVideoIds();