Bläddra i källkod

MOD: 调试流量池

sunxy 1 år sedan
förälder
incheckning
2eae21cfed
16 ändrade filer med 249 tillägg och 35 borttagningar
  1. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/BaseRecaller.java
  2. 2 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/provider/RedisBackedQueue.java
  3. 0 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/provider/RedisBackedQueueWithoutMetaCacheLoader.java
  4. 2 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/score/ScorerUtils.java
  5. 5 2
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/FlowPoolRecommendPipeline.java
  6. 158 2
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/TopRecommendPipeline.java
  7. 5 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Global24hHotCandidate.java
  8. 7 5
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region1hHotCandidate.java
  9. 5 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region24hHotCandidate.java
  10. 22 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/BaseLRModelScorer.java
  11. 2 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/VlogShareLRScorer.java
  12. 2 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/VlogShareLRScorer4Ros.java
  13. 3 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/VlogThompsonScorer.java
  14. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/ParserUtils.java
  15. 21 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/web/RecommendV2Controller.java
  16. 12 0
      recommend-server-service/src/main/resources/feeds_score_config_new_baseline.conf

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/BaseRecaller.java

@@ -118,6 +118,7 @@ public class BaseRecaller<Video> {
         try {
             // 格式
             queues = queueProvider.loads(Lists.newArrayList(queueNames), QUEUE_LOAD_TIMEOUT, TimeUnit.MILLISECONDS);
+            LOGGER.info("load queue success [{}]", queues.size());
         } catch (Exception e) {
             LOGGER.error("load queue occur error [{}]", ExceptionUtils.getFullStackTrace(e));
         }
@@ -176,6 +177,7 @@ public class BaseRecaller<Video> {
                         LOGGER.error("[fetch queue error] ex {}", ExceptionUtils.getStackTrace(e));
                     }
                     if (result != null) {
+//                        LOGGER.info("fetch queue success [{}]", JSONObject.toJSONString(result));
                         candidateQueueMap.putAll(result);
                     }
                 }

+ 2 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/provider/RedisBackedQueue.java

@@ -22,7 +22,6 @@ import java.util.Map;
 import java.util.concurrent.*;
 
 
-@Service
 public class RedisBackedQueue implements QueueProvider<Video> {
     private static final Logger logger = LoggerFactory.getLogger(RedisBackedQueue.class);
     private static final int DEFAULT_TTL = 7 * 24 * 60 * 60;
@@ -87,6 +86,8 @@ public class RedisBackedQueue implements QueueProvider<Video> {
     public Queue<Video> load(QueueName name) throws ExecutionException {
 
         Pair<Long, Queue<Video>> cachedQueue = cache.get(name);
+//        logger.info("RedisBackedQueue load QueueName: [{}], cachedQueue size: [{}]", name,
+//                cachedQueue.getValue().size());
         if (cachedQueue == null) {
             // 清理本地缓存中当前key的数据
             cache.invalidate(name);

+ 0 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/provider/RedisBackedQueueWithoutMetaCacheLoader.java

@@ -29,7 +29,6 @@ public class RedisBackedQueueWithoutMetaCacheLoader extends CacheLoader<QueueNam
     @Override
     public Pair<Long, Queue<Video>> load(QueueName name) throws Exception {
         String valueJson = client.get(name.toString());
-        logger.info("RedisBackedQueueWithoutMetaCacheLoader get QueueName: [{}], value: [{}]", name, valueJson);
         Index index = new Index(name.toString(), valueJson);
 
         if (null == index || CollectionUtils.isEmpty(index.getIndexEntryList())) {

+ 2 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/score/ScorerUtils.java

@@ -19,17 +19,15 @@ public final class ScorerUtils {
 
     private static Map<String, ScorerPipeline> scorerPipelineCache = new ConcurrentHashMap<>();
 
-    public static String BASE_CONF = "feeds_score_config_baseline.conf";
-    public static String VIDEO_SCORE_CONF_FOR_AD = "video_score_config_for_ad.conf";
+    public static String BASE_CONF_NEW_FEED = "feeds_score_config_new_baseline.conf";
 
     public static String FLOWPOOL_CONF = "feeds_score_config_thompson.conf";
 
 
     public static void warmUp() {
         log.info("scorer warm up ");
-        ScorerUtils.init(BASE_CONF);
+        ScorerUtils.init(BASE_CONF_NEW_FEED);
         ScorerUtils.init(FLOWPOOL_CONF);
-        ScorerUtils.init(VIDEO_SCORE_CONF_FOR_AD);
     }
 
     private ScorerUtils() {

+ 5 - 2
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/FlowPoolRecommendPipeline.java

@@ -5,7 +5,6 @@ import com.tzld.piaoquan.recommend.feature.domain.video.base.RequestContext;
 import com.tzld.piaoquan.recommend.feature.domain.video.base.UserFeature;
 import com.tzld.piaoquan.recommend.server.common.ThreadPoolFactory;
 import com.tzld.piaoquan.recommend.server.common.base.RankItem;
-import com.tzld.piaoquan.recommend.server.framework.common.User;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import com.tzld.piaoquan.recommend.server.model.MachineInfo;
 import com.tzld.piaoquan.recommend.server.model.RecommendParam;
@@ -63,7 +62,7 @@ public class FlowPoolRecommendPipeline implements ApplicationContextAware {
     }
 
 
-    private List<Video> feedByRec(final RecommendRequest requestData,
+    public List<Video> feedByRec(final RecommendRequest requestData,
                                      final int recommendType) {
         List<RecallStrategy> strategies = new ArrayList<>();
 
@@ -71,6 +70,10 @@ public class FlowPoolRecommendPipeline implements ApplicationContextAware {
         RecallParam recallParam = recommendService.convertToRecallParam(param);
         RecallResult recallResult = getRecallResult(strategies, recallParam);
 
+        if (recallResult == null || CollectionUtils.isEmpty(recallResult.getData())) {
+            return Collections.emptyList();
+        }
+
         RankParam rankParam = recommendService.convertToRankParam(param, recallResult);
         return mergeAndRankFlowPoolRecall(rankParam);
     }

+ 158 - 2
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/TopRecommendPipeline.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.recommend.server.implement;
 
 
 import com.alibaba.fastjson.JSONObject;
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.recommend.server.common.base.RankItem;
 import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
@@ -13,6 +14,8 @@ import com.tzld.piaoquan.recommend.server.framework.recaller.provider.RedisBacke
 import com.tzld.piaoquan.recommend.server.framework.score.ScorerUtils;
 import com.tzld.piaoquan.recommend.server.framework.utils.RedisSmartClient;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.rank.extractor.ExtractorUtils;
 import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorItemFeature;
 import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorUserFeature;
 import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
@@ -30,6 +33,10 @@ import java.util.stream.Collectors;
 @Service
 public class TopRecommendPipeline {
 
+
+    @ApolloJsonValue("${rank.score.merge.weight:}")
+    private Map<String, Double> mergeWeight;
+
     private static final Logger log = LoggerFactory.getLogger(TopRecommendPipeline.class);
 
     public static final String FILTER_CONF = "filter_config.conf";
@@ -37,15 +44,158 @@ public class TopRecommendPipeline {
 
     public static final String PREFIX = "";
 
+
     @Resource
     private RedisSmartClient client;
     @Resource
     public RedisTemplate<String, String> redisTemplate;
 
+    public List<Video> feeds(final RecommendRequest requestData,
+                             final int requestIndex,
+                             final User userInfo) {
+        // Step 1: Attention extraction
+        List<RankItem> rankItems = feedByRec(requestData, requestIndex, userInfo);
+        if (rankItems == null || rankItems.isEmpty()) {
+            return new ArrayList<>();
+        }
+        List<String> rtFeaPartKey = new ArrayList<>(Arrays.asList("item_rt_fea_1day_partition", "item_rt_fea_1h_partition"));
+        List<String> rtFeaPartKeyResult = this.redisTemplate.opsForValue().multiGet(rtFeaPartKey);
+        Calendar calendar = Calendar.getInstance();
+        String date = new SimpleDateFormat("yyyyMMdd").format(calendar.getTime());
+        String hour = new SimpleDateFormat("HH").format(calendar.getTime());
+        String rtFeaPart1h = date + hour;
+        if (rtFeaPartKeyResult != null) {
+            if (rtFeaPartKeyResult.get(1) != null) {
+                rtFeaPart1h = rtFeaPartKeyResult.get(1);
+            }
+        }
+        // 2 统计分
+        String cur = rtFeaPart1h;
+        List<String> datehours = new LinkedList<>();
+        for (int i = 0; i < 24; ++i) {
+            datehours.add(cur);
+            cur = ExtractorUtils.subtractHours(cur, 1);
+        }
+        for (RankItem item : rankItems) {
+            Map<String, String> itemBasicMap = item.getItemBasicFeature();
+            Map<String, Map<String, Double>> itemRealMap = item.getItemRealTimeFeature();
+            List<Double> views = getStaticData(itemRealMap, datehours, "view_pv_list_1h");
+            List<Double> plays = getStaticData(itemRealMap, datehours, "play_pv_list_1h");
+            List<Double> shares = getStaticData(itemRealMap, datehours, "share_pv_list_1h");
+            List<Double> returns = getStaticData(itemRealMap, datehours, "p_return_uv_list_1h");
+            List<Double> allreturns = getStaticData(itemRealMap, datehours, "return_uv_list_1h");
+
+            List<Double> share2return = getRateData(returns, shares, 1.0, 1000.0);
+            Double share2returnScore = calScoreWeight(share2return);
+            List<Double> view2return = getRateData(returns, views, 1.0, 1000.0);
+            Double view2returnScore = calScoreWeight(view2return);
+            List<Double> view2play = getRateData(plays, views, 1.0, 1000.0);
+            Double view2playScore = calScoreWeight(view2play);
+            List<Double> play2share = getRateData(shares, plays, 1.0, 1000.0);
+            Double play2shareScore = calScoreWeight(play2share);
+            item.scoresMap.put("share2returnScore", share2returnScore);
+            item.scoresMap.put("view2returnScore", view2returnScore);
+            item.scoresMap.put("view2playScore", view2playScore);
+            item.scoresMap.put("play2shareScore", play2shareScore);
+
+            Double allreturnsScore = calScoreWeight(allreturns);
+            item.scoresMap.put("allreturnsScore", allreturnsScore);
+
+            // rov的趋势
+            double trendScore = calTrendScore(view2return);
+            item.scoresMap.put("trendScore", trendScore);
+
+            // 新视频提取
+            double newVideoScore = calNewVideoScore(itemBasicMap);
+            item.scoresMap.put("newVideoScore", newVideoScore);
+
+        }
+        // 3 融合公式
+        List<Video> result = new ArrayList<>();
+        double alpha = this.mergeWeight.getOrDefault("alpha", 1.0);
+        double beta = this.mergeWeight.getOrDefault("beta", 1.0);
+        for (RankItem item : rankItems) {
+            double trendScore = item.scoresMap.getOrDefault("trendScore", 0.0) > 0.0 ?
+                    item.scoresMap.getOrDefault("trendScore", 0.0) : 0.0;
+            double newVideoScore = item.scoresMap.getOrDefault("newVideoScore", 0.0) > 0.0 ?
+                    item.scoresMap.getOrDefault("newVideoScore", 0.0) : 0.0;
+            double score = item.getScoreStr() *
+                    item.scoresMap.getOrDefault("share2returnScore", 0.0)
+                    + alpha * trendScore
+                    + beta * newVideoScore;
+            Video video = new Video();
+            video.setVideoId(Long.parseLong(item.getId()));
+            video.setScore(score);
+            video.setSortScore(score);
+            video.setScoreStr(item.getScoreStr());
+            video.setScoresMap(item.getScoresMap());
+            result.add(video);
+        }
+        Collections.sort(result, Comparator.comparingDouble(o -> -o.getSortScore()));
+        return result;
+    }
+
+    public List<Double> getStaticData(Map<String, Map<String, Double>> itemRealMap,
+                                      List<String> datehours, String key){
+        List<Double> views = new LinkedList<>();
+        Map<String, Double> tmp = itemRealMap.getOrDefault(key, new HashMap<>());
+        for (String dh : datehours){
+            views.add(tmp.getOrDefault(dh, 0.0D) +
+                    (views.isEmpty() ? 0.0: views.get(views.size()-1))
+            );
+        }
+        return views;
+    }
+
+    public double calNewVideoScore(Map<String, String> itemBasicMap){
+        double existenceDays = Double.valueOf(itemBasicMap.getOrDefault("existence_days", "30"));
+        if (existenceDays > 8){
+            return 0.0;
+        }
+        double score = 1.0 / (existenceDays + 5.0);
+        return score;
+    }
+    public double calTrendScore(List<Double> data){
+        double sum = 0.0;
+        int size = data.size();
+        for (int i=0; i<size-4; ++i){
+            sum += data.get(i) - data.get(i+4);
+        }
+        if (sum * 10 > 0.6){
+            sum = 0.6;
+        }else{
+            sum = sum * 10;
+        }
+        if (sum > 0){
+            // 为了打断点
+            sum = sum;
+        }
+        return sum;
+    }
+
+    public Double calScoreWeight(List<Double> data){
+        Double up = 0.0;
+        Double down = 0.0;
+        for (int i=0; i<data.size(); ++i){
+            up += 1.0 / (i + 1) * data.get(i);
+            down += 1.0 / (i + 1);
+        }
+        return down > 1E-8? up / down: 0.0;
+    }
+    public List<Double> getRateData(List<Double> ups, List<Double> downs, Double up, Double down){
+        List<Double> data = new LinkedList<>();
+        for(int i=0; i<ups.size(); ++i){
+            data.add(
+                    (ups.get(i) + up) / (downs.get(i) + down)
+            );
+        }
+        return data;
+    }
+
     public List<RankItem> feedByRec(final RecommendRequest requestData,
                                     final int requestIndex,
                                     final User userInfo) {
-        int recallNum =  200;
+        int recallNum = 200;
 
         // Step 1: Attention extraction
 //        long timestamp = System.currentTimeMillis();
@@ -86,7 +236,7 @@ public class TopRecommendPipeline {
         // TODO 前置和后置处理逻辑 hardcode,后续优化
         Map<String, String> sceneFeatureMap = getSceneFeature(requestData);
         Map<String, String> userFeatureMap = getUserFeatureMap(requestData, items);
-        List<RankItem> rovRecallRankNewallScore = ScorerUtils.getScorerPipeline(ScorerUtils.BASE_CONF)
+        List<RankItem> rovRecallRankNewallScore = ScorerUtils.getScorerPipeline(ScorerUtils.BASE_CONF_NEW_FEED)
                 .scoring(sceneFeatureMap, userFeatureMap, items);
 
         return rovRecallRankNewallScore;
@@ -213,6 +363,9 @@ public class TopRecommendPipeline {
             int j = 0;
             for (RankItem item: rankItems){
                 ++j;
+                if (j >= rankItems.size()) {
+                    continue;
+                }
                 Map<String, String> vfMap = new HashMap<>();
                 Map<String, Map<String, Double>> vfMapNew = new HashMap<>();
                 try {
@@ -244,6 +397,9 @@ public class TopRecommendPipeline {
             }
             for (RankItem item: rankItems){
                 ++j;
+                if (j >= rankItems.size()) {
+                    continue;
+                }
                 Map<String, String> vfMap = new HashMap<>();
                 Map<String, Map<String, Double>> vfMapNew = new HashMap<>();
                 try {

+ 5 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Global24hHotCandidate.java

@@ -26,20 +26,22 @@ public class Global24hHotCandidate extends IndexCandidateQueue {
         Map<String, Candidate> simplifiedCandidates = new ConcurrentHashMap<String, Candidate>();
 
 
+        int num = recallNum / 3;
+
         // index key  video:queue:type=global24h:region=北京:ordering=rov
         QueueName queueName24HGlobal = new QueueName(ItemType, "rov")
                 .addMatch("type", "global24h");
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HGlobal, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HGlobal, num, getStrategyQueueInfo().getQueueName());
 
         // index key  video:queue:type=global24h:region=北京:ordering=realplay
         queueName24HGlobal = new QueueName(ItemType, "realplay")
                 .addMatch("type", "global24h");
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HGlobal, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HGlobal, num, getStrategyQueueInfo().getQueueName());
 
         // index key  video:queue:type=global24h:region=北京:ordering=str
         queueName24HGlobal = new QueueName(ItemType, "str")
                 .addMatch("type", "global24h");
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HGlobal, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HGlobal, num, getStrategyQueueInfo().getQueueName());
 
         // index key  video:queue:type=global24h:region=北京:ordering=realplay_rate
 

+ 7 - 5
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region1hHotCandidate.java

@@ -25,40 +25,42 @@ public class Region1hHotCandidate extends IndexCandidateQueue {
         String region = user.getRegion();
         Map<String, Candidate> simplifiedCandidates = new ConcurrentHashMap<String, Candidate>();
 
+        int num = recallNum / 5;
+
 
         // index key  video:queue:type=region1h:region=北京:ordering=rov
         QueueName queueName1HRegion = new QueueName(ItemType, "short-rov")
                 .addMatch("type", "region1h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, num, getStrategyQueueInfo().getQueueName());
 
 
         // index key  video:queue:type=region1h:region=北京:ordering=rov
         queueName1HRegion = new QueueName(ItemType, "rov")
                 .addMatch("type", "region1h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, num, getStrategyQueueInfo().getQueueName());
 
 
         // index key  video:queue:type=region1h:region=北京:ordering=realplay
         queueName1HRegion = new QueueName(ItemType, "realplay")
                 .addMatch("type", "region1h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, num, getStrategyQueueInfo().getQueueName());
 
 
         // index key  video:queue:type=region1h:region=北京:ordering=str
         queueName1HRegion = new QueueName(ItemType, "str")
                 .addMatch("type", "region1h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, num, getStrategyQueueInfo().getQueueName());
 
 
         // index key  video:queue:type=region1h:region=北京:ordering=realplay_rate
         queueName1HRegion = new QueueName(ItemType, "realplay_ratio")
                 .addMatch("type", "region1h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName1HRegion, num, getStrategyQueueInfo().getQueueName());
 
         candidates.putAll(simplifiedCandidates);
         return currRecall;

+ 5 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region24hHotCandidate.java

@@ -25,30 +25,31 @@ public class Region24hHotCandidate extends IndexCandidateQueue {
         String region = user.getRegion();
         Map<String, Candidate> simplifiedCandidates = new ConcurrentHashMap<String, Candidate>();
 
+        int num = recallNum / 4;
 
         // index key  video:queue:type=region24h:region=北京:ordering=rov
         QueueName queueName24HRegion = new QueueName(ItemType, "rov")
                 .addMatch("type", "region24h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, num, getStrategyQueueInfo().getQueueName());
 
         // index key  video:queue:type=region24h:region=北京:ordering=realplay
         queueName24HRegion = new QueueName(ItemType, "realplay")
                 .addMatch("type", "region24h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, num, getStrategyQueueInfo().getQueueName());
 
         // index key  video:queue:type=region24h:region=北京:ordering=str
         queueName24HRegion = new QueueName(ItemType, "str")
                 .addMatch("type", "region24h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, num, getStrategyQueueInfo().getQueueName());
 
         // index key  video:queue:type=region24h:region=北京:ordering=realplay_rate
         queueName24HRegion = new QueueName(ItemType, "realplay_ratio")
                 .addMatch("type", "region24h")
                 .addMatch("region", region);
-        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, 1, getStrategyQueueInfo().getQueueName());
+        currRecall += addCandidateKey(simplifiedCandidates, queueName24HRegion, num, getStrategyQueueInfo().getQueueName());
 
 
         candidates.putAll(simplifiedCandidates);

+ 22 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/BaseLRModelScorer.java

@@ -0,0 +1,22 @@
+package com.tzld.piaoquan.recommend.server.implement.score;
+
+import com.tzld.piaoquan.recommend.server.framework.score.AbstractScorer;
+import com.tzld.piaoquan.recommend.server.framework.score.ScorerConfigInfo;
+import com.tzld.piaoquan.recommend.server.service.score.model.LRModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public abstract class BaseLRModelScorer extends AbstractScorer {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(BaseLRModelScorer.class);
+
+    public BaseLRModelScorer(ScorerConfigInfo scorerConfigInfo) {
+        super(scorerConfigInfo);
+    }
+
+    @Override
+    public void loadModel() {
+        doLoadModel(LRModel.class);
+    }
+}

+ 2 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/VlogShareLRScorer.java

@@ -5,10 +5,9 @@ import com.tzld.piaoquan.recommend.feature.domain.video.base.*;
 import com.tzld.piaoquan.recommend.feature.domain.video.feature.VlogShareLRFeatureExtractor;
 import com.tzld.piaoquan.recommend.feature.model.sample.LRSamples;
 import com.tzld.piaoquan.recommend.server.common.base.RankItem;
+import com.tzld.piaoquan.recommend.server.framework.score.ScoreParam;
+import com.tzld.piaoquan.recommend.server.framework.score.ScorerConfigInfo;
 import com.tzld.piaoquan.recommend.server.service.rank.strategy.OfflineVlogShareLRFeatureExtractor;
-import com.tzld.piaoquan.recommend.server.service.score.BaseLRModelScorer;
-import com.tzld.piaoquan.recommend.server.service.score.ScoreParam;
-import com.tzld.piaoquan.recommend.server.service.score.ScorerConfigInfo;
 import com.tzld.piaoquan.recommend.server.service.score.model.LRModel;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;

+ 2 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/VlogShareLRScorer4Ros.java

@@ -5,10 +5,9 @@ import com.tzld.piaoquan.recommend.feature.domain.video.base.*;
 import com.tzld.piaoquan.recommend.feature.domain.video.feature.VlogShareLRFeatureExtractor;
 import com.tzld.piaoquan.recommend.feature.model.sample.LRSamples;
 import com.tzld.piaoquan.recommend.server.common.base.RankItem;
+import com.tzld.piaoquan.recommend.server.framework.score.ScoreParam;
+import com.tzld.piaoquan.recommend.server.framework.score.ScorerConfigInfo;
 import com.tzld.piaoquan.recommend.server.service.rank.strategy.OfflineVlogShareLRFeatureExtractor;
-import com.tzld.piaoquan.recommend.server.service.score.BaseLRModelScorer;
-import com.tzld.piaoquan.recommend.server.service.score.ScoreParam;
-import com.tzld.piaoquan.recommend.server.service.score.ScorerConfigInfo;
 import com.tzld.piaoquan.recommend.server.service.score.model.LRModel;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;

+ 3 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/score/VlogThompsonScorer.java

@@ -3,9 +3,9 @@ package com.tzld.piaoquan.recommend.server.implement.score;
 import com.tzld.piaoquan.recommend.feature.domain.video.base.RequestContext;
 import com.tzld.piaoquan.recommend.feature.domain.video.base.UserFeature;
 import com.tzld.piaoquan.recommend.server.common.base.RankItem;
-import com.tzld.piaoquan.recommend.server.service.score.BaseThompsonSamplingScorer;
-import com.tzld.piaoquan.recommend.server.service.score.ScoreParam;
-import com.tzld.piaoquan.recommend.server.service.score.ScorerConfigInfo;
+import com.tzld.piaoquan.recommend.server.framework.score.BaseThompsonSamplingScorer;
+import com.tzld.piaoquan.recommend.server.framework.score.ScoreParam;
+import com.tzld.piaoquan.recommend.server.framework.score.ScorerConfigInfo;
 import com.tzld.piaoquan.recommend.server.service.score.model.ThompsonSamplingModel;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.exception.ExceptionUtils;

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

@@ -288,7 +288,7 @@ public class ParserUtils {
                 9041633L,
                 9041632L
         ));
-        List<List<Long>> partition = Lists.partition(videoIdList, 20);
+        List<List<Long>> partition = Lists.partition(videoIdList, 120);
         partition.stream().map(list -> list.stream().map(videoId -> Arrays.asList(videoId + "", "0.5")) .collect(Collectors.toList()))
                 .forEach(list -> System.out.println(JSONObject.toJSONString(list)));
 

+ 21 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/web/RecommendV2Controller.java

@@ -3,11 +3,12 @@ package com.tzld.piaoquan.recommend.server.web;
 import com.alibaba.fastjson.JSONObject;
 import com.google.protobuf.InvalidProtocolBufferException;
 import com.tzld.piaoquan.recommend.server.client.ProtobufUtils;
-import com.tzld.piaoquan.recommend.server.common.base.RankItem;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendResponse;
+import com.tzld.piaoquan.recommend.server.implement.FlowPoolRecommendPipeline;
 import com.tzld.piaoquan.recommend.server.implement.TopRecommendPipeline;
+import com.tzld.piaoquan.recommend.server.model.Video;
 import com.tzld.piaoquan.recommend.server.service.RecommendService;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.MDC;
@@ -31,6 +32,9 @@ public class RecommendV2Controller {
     @Resource
     TopRecommendPipeline topRecommendPipeline;
 
+    @Resource
+    FlowPoolRecommendPipeline flowPoolRecommendPipeline;
+
     @RequestMapping("/homepage/recommend/v2")
     public String homepageRecommend(@RequestBody RecommendRequest httpRequest) {
         MDC.put("appType", String.valueOf(httpRequest.getAppType()));
@@ -64,13 +68,27 @@ public class RecommendV2Controller {
 
         User user = new User();
         user.setRegion(httpRequest.getCityCode());
-        List<RankItem> rankItems = topRecommendPipeline.feedByRec(httpRequest, 0, user);
+        List<Video> videoList = topRecommendPipeline.feeds(httpRequest, 0, user);
         String result = "";
         try {
-            result = JSONObject.toJSONString(rankItems);
+            result = JSONObject.toJSONString(videoList);
         } catch (Exception e) {
             log.error("feedByRec ProtobufUtils.toJson", e);
         }
         return result;
     }
+
+    @RequestMapping("/test/flowPool")
+    public String flowPool(@RequestBody RecommendRequest httpRequest) {
+        MDC.put("appType", String.valueOf(httpRequest.getAppType()));
+
+        List<Video> videoList = flowPoolRecommendPipeline.feedByRec(httpRequest, 0);
+        String result = "";
+        try {
+            result = JSONObject.toJSONString(videoList);
+        } catch (Exception e) {
+            log.error("flowPool ProtobufUtils.toJson", e);
+        }
+        return result;
+    }
 }

+ 12 - 0
recommend-server-service/src/main/resources/feeds_score_config_new_baseline.conf

@@ -0,0 +1,12 @@
+scorer-config = {
+  str-score-config = {
+    scorer-name = "com.tzld.piaoquan.recommend.server.implement.score.VlogShareLRScorer"
+    scorer-priority = 99
+    model-path = "video_str_model/model_str_mid.txt"
+  }
+  ros-score-config = {
+    scorer-name = "com.tzld.piaoquan.recommend.server.implement.score.VlogShareLRScorer4Ros"
+    scorer-priority = 99
+    model-path = "video_str_model/model_ros_v2_20231220_change.txt"
+  }
+}