supeng 11 месяцев назад
Родитель
Сommit
125e3b7ab9

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

@@ -98,9 +98,6 @@ public class RecommendService {
 
     @PostConstruct
     public void init() {
-        ab_initial_config_map.put(AppTypeEnum.VLOG.getCode(), "095");
-        ab_initial_config_map.put(AppTypeEnum.LOVE_LIVE.getCode(), "144");
-        ab_initial_config_map.put(AppTypeEnum.LONG_VIDEO.getCode(), "121");
     }
 
     public RecommendResponse homepageRecommend(RecommendRequest request) {

+ 4 - 22
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/strategy/AllowListStrategy.java

@@ -67,29 +67,11 @@ public class AllowListStrategy implements FilterStrategy {
         }
         //不是新小程序 在白名单则不显示
         Set<Long> retainVideoIds = new LinkedHashSet<>();
-        if (param.getAppType() != AppTypeEnum.WAN_NENG_VIDEO.getCode()
-                && param.getAppType() != AppTypeEnum.H5.getCode()) {
-
-            Iterator<Long> iterator = param.getVideoIds().iterator();
-            while (iterator.hasNext()) {
-                Long videoId = iterator.next();
-                //如果不在新小程序白名单 则保留
-                if (!isMemberOfVideoAllowList(videoId)) {
-                    retainVideoIds.add(videoId);
-                }
-            }
-        } else if (param.getAppType() == AppTypeEnum.WAN_NENG_VIDEO.getCode()
-                || param.getAppType() == AppTypeEnum.H5.getCode()) {
-            Iterator<Long> iterator = param.getVideoIds().iterator();
-            while (iterator.hasNext()) {
-                Long videoId = iterator.next();
-                //如果不在宗教白名单 则保留
-                if (!isMemberOfReligionVideoAllowList(videoId)) {
-                    retainVideoIds.add(videoId);
-                }
+        for (Long videoId : param.getVideoIds()) {
+            //如果不在新小程序白名单 则保留
+            if (!isMemberOfVideoAllowList(videoId)) {
+                retainVideoIds.add(videoId);
             }
-        } else {
-            return Lists.newArrayList(param.getVideoIds());
         }
         if (CollectionUtils.isEmpty(retainVideoIds)) {
             return Collections.emptyList();

+ 21 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankService.java

@@ -45,6 +45,8 @@ public class RankService {
     private boolean newRankSwitch;
     @Value("${newRankAbExpCode:528}")
     private String newRankAbExpCode;
+    @ApolloJsonValue("${alg.recall.special.app&vid:{}}")
+    protected Map<String, List<Long>> specialAppVid;
     @ApolloJsonValue("${region.recall.return.size:{}}")
     protected Map<String, Map<String, Integer>> regionRecallReturnSize;
 
@@ -82,7 +84,13 @@ public class RankService {
             }
             return new RankResult(results);
         }
-
+        if (this.matchSpecialApp(param.getAppType())){
+            // 特殊app固定列表,只有一路召回,且不走排序。
+            List<Video> results = new ArrayList<>(extractAndSort(param, RegionRealtimeRecallStrategyV5Hand.PUSH_FORM));
+            removeDuplicate(results);
+            results = results.subList(0, Math.min(results.size(), param.getSize()));
+            return new RankResult(results);
+        }
         if (param.getAppType() == AppTypeEnum.APP_SPEED.getCode()) {
             List<Video> results = new ArrayList<>(extractAndSort(param, AppFallbackRecallStrategy.PUSH_FORM));
             removeDuplicate(results);
@@ -397,5 +405,17 @@ public class RankService {
         return new RankResult(result);
     }
 
+    private boolean matchSpecialApp(int appId){
+        Set<Integer> notSpecialApp = new HashSet<>(Arrays.asList(0, 4, 5));
+        if (notSpecialApp.contains(appId)){
+            // vlog 票圈视频 内容精选 不允许走特殊列表,即使配置了也无效。
+            return false;
+        }
+        if (specialAppVid != null && specialAppVid.getOrDefault("app", new ArrayList<>()).contains((long) appId)){
+            log.info("This request hits a special logic in matchSpecialApp with appId={}", appId);
+            return true;
+        }
+        return false;
+    }
 
 }

+ 132 - 112
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java

@@ -35,6 +35,8 @@ public class RecallService implements ApplicationContextAware {
     private final ExecutorService pool = ThreadPoolFactory.recallPool();
     @ApolloJsonValue("${last.digit.abcode:{}}")
     protected Map<Integer, String> lastDigitAbcode;
+    @ApolloJsonValue("${alg.recall.special.app&vid:{}}")
+    protected Map<String, List<Long>> specialAppVid;
     @Resource
     private BlacklistContainer blacklistContainer;
 
@@ -98,128 +100,133 @@ public class RecallService implements ApplicationContextAware {
         boolean isInBlacklist = CollectionUtils.isNotEmpty(blacklistAppTypeSet) && blacklistAppTypeSet.contains(param.getAppType());
 
         String abCode = param.getAbCode();
-        //1:通过“产品”控制“召回子策略”. 票圈美好祝福与内部tab只走祝福召回。APP只走固定列表。
+        //1:通过“产品”控制“召回子策略”. 票圈美好祝福与内部tab只走祝福召回。APP只走固定列表。特殊配置的app只有固定召回列表。
+        if (this.matchSpecialApp(param.getAppType())) {
+            strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV5Hand.class.getSimpleName()));
+            return strategies;
+        }
         if (param.getAppType() == AppTypeEnum.PIAO_QUAN_MEIHAO_ZHUFU.getCode() && Objects.equals(param.getCategoryId(), 100)) {
             strategies.add(strategyMap.get(BlessRecallStrategy.class.getSimpleName()));
             return strategies;
-        } else if (param.getAppType() == AppTypeEnum.APP_SPEED.getCode()) {
+        }
+        if (param.getAppType() == AppTypeEnum.APP_SPEED.getCode()) {
             strategies.add(strategyMap.get(AppFallbackRecallStrategy.class.getSimpleName()));
             return strategies;
-        } else {
-            switch (abCode) {
-                case "60113": // 563
-                case "60114": // 564
-                case "60115": // 565
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2_sort.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-                    break;
-                case "60105": // 551
-                case "60106": // 552
-                case "60107": // 553
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1_sort.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2_sort.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3_sort.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV6RootRov.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-                    break;
-                case "60121": // 536
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV5HighValue.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-                    break;
-                case "60122": // 537
-                case "60124": // 546
-                case "60125": // 547
-                case "60126": // 548
-                case "60116": // 566
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-                    break;
-                case "60120": // 576
-                case "60123": // 541
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
-                    break;
-                case "60150": // 645
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.add(strategyMap.get(ShareWidthRecallStrategy.class.getSimpleName()));
-                    strategies.add(strategyMap.get(ShareDeepRecallStrategy.class.getSimpleName()));
-                    break;
-                case "60151": // 650
-                    strategies.addAll(getRegionRecallStrategy(param));
-                    strategies.add(strategyMap.get(SimHotVideoRecallStrategy.class.getSimpleName()));
-                    strategies.add(strategyMap.get(ReturnVideoRecallStrategy.class.getSimpleName()));
-                    strategies.add(strategyMap.get(ContentBaseRecallStrategy.class.getSimpleName()));
-                    strategies.add(strategyMap.get(FestivalRecallStrategyV1.class.getSimpleName()));
-                    break;
-                case "60117": // 567
-                case "60118": // 568
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-                case "60119": // 569
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.add(strategyMap.get(TitleTagRecallStrategyV1.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-                default:
-                    strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
-                    strategies.addAll(getRegionRecallStrategy(param));
-            }
-            // 命中用户黑名单不走流量池
-            if (!hitUserBlacklist || !isInBlacklist) {
-                if (Objects.equals(Constant.SUPPLY_AB_CODE, abCode)) {
-                    // 供给流量池策略 648 实验 random
-                    strategies.add(strategyMap.get(FlowPoolWithLevelSupplyRecallStrategy.class.getSimpleName()));
+        }
+        switch (abCode) {
+            case "60113": // 563
+            case "60114": // 564
+            case "60115": // 565
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2_sort.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+                break;
+            case "60105": // 551
+            case "60106": // 552
+            case "60107": // 553
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1_sort.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2_sort.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3_sort.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV6RootRov.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+                break;
+            case "60121": // 536
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV5HighValue.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+                break;
+            case "60122": // 537
+            case "60124": // 546
+            case "60125": // 547
+            case "60126": // 548
+            case "60116": // 566
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+                break;
+            case "60120": // 576
+            case "60123": // 541
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV2.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV3.class.getSimpleName()));
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV4.class.getSimpleName()));
+                break;
+            case "60150": // 645
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.add(strategyMap.get(ShareWidthRecallStrategy.class.getSimpleName()));
+                strategies.add(strategyMap.get(ShareDeepRecallStrategy.class.getSimpleName()));
+                break;
+            case "60151": // 650
+                strategies.addAll(getRegionRecallStrategy(param));
+                strategies.add(strategyMap.get(SimHotVideoRecallStrategy.class.getSimpleName()));
+                strategies.add(strategyMap.get(ReturnVideoRecallStrategy.class.getSimpleName()));
+                strategies.add(strategyMap.get(ContentBaseRecallStrategy.class.getSimpleName()));
+                strategies.add(strategyMap.get(FestivalRecallStrategyV1.class.getSimpleName()));
+                break;
+            case "60117": // 567
+            case "60118": // 568
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+            case "60119": // 569
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.add(strategyMap.get(TitleTagRecallStrategyV1.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+            default:
+                strategies.add(strategyMap.get(RegionRealtimeRecallStrategyV1.class.getSimpleName()));
+                strategies.addAll(getRegionRecallStrategy(param));
+        }
+        // 命中用户黑名单不走流量池
+        if (!hitUserBlacklist || !isInBlacklist) {
+            if (Objects.equals(Constant.SUPPLY_AB_CODE, abCode)) {
+                // 供给流量池策略 648 实验 random
+                strategies.add(strategyMap.get(FlowPoolWithLevelSupplyRecallStrategy.class.getSimpleName()));
                 //2:通过“流量池标记”控制“流量池召回子策略” 其中有9组会走EXPERIMENTAL_FLOW_SET_LEVEL 有1组会走EXPERIMENTAL_FLOW_SET_LEVEL_SCORE
-                } else if ("60116".equals(abCode)) {
-                    int lastDigit = param.getLastDigit();
-                    String lastDigitAB = lastDigitAbcode != null ? lastDigitAbcode.getOrDefault(lastDigit, "default") : "default";
-                    switch (lastDigitAB) {
-                        case "random":
-                            strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyFilterDigit.class.getSimpleName()));
-                            break;
-                        case "tomson":
-                            strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyTomsonFilterDigitV2.class.getSimpleName()));
-                            break;
-                        case "score":
-                            strategies.add(strategyMap.get(FlowPoolWithLevelScoreRecallStrategy.class.getSimpleName()));
-                            break;
-                        default:
-                            strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyFilterDigit.class.getSimpleName()));
-                            break;
-                    }
-                } else {
-                    if (param.getFlowPoolAbtestGroup().equals(FlowPoolConstants.EXPERIMENTAL_FLOW_SET_LEVEL)) {
-                        strategies.add(strategyMap.get(QuickFlowPoolWithLevelRecallStrategy.class.getSimpleName()));
-                        if ("60126".equals(abCode) || "60125".equals(abCode) || "60124".equals(abCode)
-                                || "60105".equals(abCode) || "60106".equals(abCode) || "60107".equals(abCode)
-                                || "60113".equals(abCode) || "60114".equals(abCode)
-                                || "60115".equals(abCode) || "60117".equals(abCode) || "60118".equals(abCode)
-                                || "60119".equals(abCode) || "60150".equals(abCode) || "60151".equals(abCode)) {
-                            strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyTomson.class.getSimpleName()));
-                        } else {
-                            strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategy.class.getSimpleName()));
-                        }
-                    } else if (param.getFlowPoolAbtestGroup().equals(FlowPoolConstants.EXPERIMENTAL_FLOW_SET_LEVEL_SCORE)) {
-                        strategies.add(strategyMap.get(QuickFlowPoolWithLevelScoreRecallStrategy.class.getSimpleName()));
+            } else if ("60116".equals(abCode)) {
+                int lastDigit = param.getLastDigit();
+                String lastDigitAB = lastDigitAbcode != null ? lastDigitAbcode.getOrDefault(lastDigit, "default") : "default";
+                switch (lastDigitAB) {
+                    case "random":
+                        strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyFilterDigit.class.getSimpleName()));
+                        break;
+                    case "tomson":
+                        strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyTomsonFilterDigitV2.class.getSimpleName()));
+                        break;
+                    case "score":
                         strategies.add(strategyMap.get(FlowPoolWithLevelScoreRecallStrategy.class.getSimpleName()));
+                        break;
+                    default:
+                        strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyFilterDigit.class.getSimpleName()));
+                        break;
+                }
+            } else {
+                if (param.getFlowPoolAbtestGroup().equals(FlowPoolConstants.EXPERIMENTAL_FLOW_SET_LEVEL)) {
+                    strategies.add(strategyMap.get(QuickFlowPoolWithLevelRecallStrategy.class.getSimpleName()));
+                    if ("60126".equals(abCode) || "60125".equals(abCode) || "60124".equals(abCode)
+                            || "60105".equals(abCode) || "60106".equals(abCode) || "60107".equals(abCode)
+                            || "60113".equals(abCode) || "60114".equals(abCode)
+                            || "60115".equals(abCode) || "60117".equals(abCode) || "60118".equals(abCode)
+                            || "60119".equals(abCode) || "60150".equals(abCode) || "60151".equals(abCode)) {
+                        strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategyTomson.class.getSimpleName()));
                     } else {
-                        strategies.add(strategyMap.get(QuickFlowPoolWithScoreRecallStrategy.class.getSimpleName()));
-                        strategies.add(strategyMap.get(FlowPoolWithScoreRecallStrategy.class.getSimpleName()));
+                        strategies.add(strategyMap.get(FlowPoolWithLevelRecallStrategy.class.getSimpleName()));
                     }
+                } else if (param.getFlowPoolAbtestGroup().equals(FlowPoolConstants.EXPERIMENTAL_FLOW_SET_LEVEL_SCORE)) {
+                    strategies.add(strategyMap.get(QuickFlowPoolWithLevelScoreRecallStrategy.class.getSimpleName()));
+                    strategies.add(strategyMap.get(FlowPoolWithLevelScoreRecallStrategy.class.getSimpleName()));
+                } else {
+                    strategies.add(strategyMap.get(QuickFlowPoolWithScoreRecallStrategy.class.getSimpleName()));
+                    strategies.add(strategyMap.get(FlowPoolWithScoreRecallStrategy.class.getSimpleName()));
                 }
             }
+        }
 //            if ("60126".equals(abCode) || "60125".equals(abCode) || "60124".equals(abCode)
 //            || "60105".equals(abCode) || "60106".equals(abCode)  || "60107".equals(abCode)
 //            || "60113".equals(abCode) || "60114".equals(abCode)
@@ -243,7 +250,7 @@ public class RecallService implements ApplicationContextAware {
 //                        break;
 //                }
 //            }
-        }
+
 
         //3:通过“abcode”控制“召回子策略”
         switch (abCode) {
@@ -344,4 +351,17 @@ public class RecallService implements ApplicationContextAware {
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         this.applicationContext = applicationContext;
     }
+
+    private boolean matchSpecialApp(int appId){
+        Set<Integer> notSpecialApp = new HashSet<>(Arrays.asList(0, 4, 5));
+        if (notSpecialApp.contains(appId)){
+            // vlog 票圈视频 内容精选 不允许走特殊列表,即使配置了也无效。
+            return false;
+        }
+        if (specialAppVid != null && specialAppVid.getOrDefault("app", new ArrayList<>()).contains((long) appId)){
+            log.info("This request hits a special logic in matchSpecialApp with appId={}", appId);
+            return true;
+        }
+        return false;
+    }
 }

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

@@ -28,24 +28,18 @@ import java.util.*;
 public class RegionRealtimeRecallStrategyV5Hand implements RecallStrategy {
     @ApolloJsonValue("${alg.recall.hand.videos:[]}")
     private List<Long> handVideos;
+    @ApolloJsonValue("${alg.recall.special.app&vid:{}}")
+    protected Map<String, List<Long>> specialAppVid;
     @Autowired
     protected RegionFilterService filterService;
     @Override
     public List<Video> recall(RecallParam param) {
-        List<Long> vids = handVideos != null ? handVideos : new ArrayList<>();
+        List<Long> vids = specialAppVid != null ? specialAppVid.getOrDefault("vid", new ArrayList<>()) : new ArrayList<>();
         List<Video> videosResult = new ArrayList<>();
         if (vids.isEmpty()){
             return videosResult;
         }
-        FilterParam filterParam = FilterParamFactory.create(param, vids);
-        filterParam.setForceTruncation(10000);
-        filterParam.setConcurrent(true);
-        filterParam.setNotUsePreView(false);
-        FilterResult filterResult = filterService.filter(filterParam);
-        if (filterResult == null || filterResult.getVideoIds().isEmpty()){
-            return videosResult;
-        }
-        filterResult.getVideoIds().forEach(vid -> {
+        vids.forEach(vid -> {
             Video video = new Video();
             video.setVideoId(vid);
             video.setAbCode(param.getAbCode());
@@ -54,7 +48,10 @@ public class RegionRealtimeRecallStrategyV5Hand implements RecallStrategy {
             videosResult.add(video);
         });
         videosResult.sort(Comparator.comparingDouble(o -> -o.getRovScore()));
-        return videosResult;
+        long limit = specialAppVid != null ? specialAppVid.getOrDefault("limit", new ArrayList<>(
+                Collections.singletonList(1000L)
+        )).get(0) : 1000L;
+        return videosResult.subList(0, (int) Math.min(videosResult.size(), limit));
     }
     public static final String PUSH_FORM = "recall_strategy_hand";
     @Override