Bläddra i källkod

MOD: Code Review

sunxy 1 år sedan
förälder
incheckning
aacbcd16a2
18 ändrade filer med 215 tillägg och 102 borttagningar
  1. 3 2
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/merger/IndexCandidateQueue.java
  2. 7 5
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/BaseRecaller.java
  3. 5 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/provider/Index.java
  4. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/recaller/provider/RedisBackedQueueWithoutMetaCacheLoader.java
  5. 14 9
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/FlowPoolRecommendPipeline.java
  6. 41 11
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/TopRecommendPipeline.java
  7. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Global24hHotCandidate.java
  8. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/HotCandidateQueue.java
  9. 2 17
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region1hHotCandidate.java
  10. 1 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region24hHotCandidate.java
  11. 50 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region3hHotCandidate.java
  12. 3 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/recall/PreViewedFilter.java
  13. 7 8
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/recall/ViewedHistoryFilter.java
  14. 33 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/SpringContextHolder.java
  15. 33 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/VideoRecommendService.java
  16. 2 2
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/web/RecommendV2Controller.java
  17. 5 2
      recommend-server-service/src/main/resources/filter_config.conf
  18. 6 34
      recommend-server-service/src/main/resources/merge_config.conf

+ 3 - 2
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/candidiate/IndexCandidateQueue.java → recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/framework/merger/IndexCandidateQueue.java

@@ -1,9 +1,10 @@
-package com.tzld.piaoquan.recommend.server.framework.candidiate;
+package com.tzld.piaoquan.recommend.server.framework.merger;
 
 
 import com.tzld.piaoquan.recommend.server.common.base.RankItem;
+import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
+import com.tzld.piaoquan.recommend.server.framework.candidiate.QueueName;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
-import com.tzld.piaoquan.recommend.server.framework.merger.*;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import org.apache.commons.lang3.tuple.Pair;
 

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

@@ -34,10 +34,14 @@ public class BaseRecaller<Video> {
     private static final ExecutorService fetchQueueExecutorService = Executors.newFixedThreadPool(128);
     private final QueueProvider<Video> queueProvider;
 
-    private final FilterConfig filterConfig;
+    private static final FilterConfig filterConfig;
 
     private final long QUEUE_LOAD_TIMEOUT;
 
+    static {
+        filterConfig = new FilterConfig(FILTER_CONF);
+    }
+
     public BaseRecaller(QueueProvider<Video> queueProvider) {
         this(queueProvider, DEFAULT_QUEUE_LOAD_TIMEOUT);
     }
@@ -45,7 +49,6 @@ public class BaseRecaller<Video> {
     public BaseRecaller(QueueProvider<Video> queueProvider,
                         long queueLoadTimeout) {
         this.queueProvider = queueProvider;
-        this.filterConfig = new FilterConfig(FILTER_CONF);
         this.QUEUE_LOAD_TIMEOUT = queueLoadTimeout;
     }
 
@@ -54,7 +57,6 @@ public class BaseRecaller<Video> {
                         FilterConfig filterConfig,
                         long queueLoadTimeout) {
         this.queueProvider = queueProvider;
-        this.filterConfig = filterConfig;
         this.QUEUE_LOAD_TIMEOUT = queueLoadTimeout;
     }
 
@@ -196,7 +198,7 @@ public class BaseRecaller<Video> {
                                              User user) {
 
 
-        final FilterPipeline<Video> recallFilter = new FilterPipeline<>(this.filterConfig, requestData, user);
+        final FilterPipeline<Video> recallFilter = new FilterPipeline<>(filterConfig, requestData, user);
 
 
         final List<Callable<List<RankItem>>> callables = new ArrayList<>();
@@ -225,7 +227,7 @@ public class BaseRecaller<Video> {
 
                     // debug log for tracing
                     LOGGER.debug("recalled candidate [{}], queue length [{}], expected [{}], hit [{}]",
-                            new Object[]{candidate.getCandidateKey(), entry.getValue().size(), candidate.getCandidateNum(), candidateHits.size()});
+                            candidate.getCandidateKey(), entry.getValue().size(), candidate.getCandidateNum(), candidateHits.size());
                 } catch (Exception e) {
                     LOGGER.error("recall filter queue occur error, queue [{}], error: [{}]", candidate.toString(), ExceptionUtils.getFullStackTrace(e));
                 }

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

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.recommend.server.framework.recaller.provider;
 
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.recommend.server.util.JSONUtils;
 import lombok.Data;
@@ -22,7 +23,10 @@ public class Index {
             return;
         }
         this.indexName = indexName;
-        List<List<String>> videoScores = JSONUtils.fromJson(indexValue, new TypeToken<List<List<String>>>() {
+        JSONObject jsonObject = JSONObject.parseObject(indexValue);
+        String valueList = jsonObject.getString("value_list");
+        valueList = "[" + valueList + "]";
+        List<List<String>> videoScores = JSONUtils.fromJson(valueList, new TypeToken<List<List<String>>>() {
         }, Collections.emptyList());
 
         videoScores.stream().forEach(itemAndScore -> {

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

@@ -43,6 +43,7 @@ public class RedisBackedQueueWithoutMetaCacheLoader extends CacheLoader<QueueNam
             public Entry<Video> apply(IndexEntry indexEntry) {
                 Video recallData = new Video();
                 recallData.setVideoId(Long.valueOf(indexEntry.getItemId()));
+                recallData.setPushFrom(name.toString());
                 Entry<Video> entry = new Entry<Video>(recallData, indexEntry.getItemId());
                 entry.addScore("ordering", indexEntry.getScore());
                 return entry;

+ 14 - 9
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/FlowPoolRecommendPipeline.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.recommend.server.implement;
 
 
+import com.alibaba.fastjson.JSONObject;
 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;
@@ -50,7 +51,7 @@ public class FlowPoolRecommendPipeline implements ApplicationContextAware {
 
     private ApplicationContext applicationContext;
 
-    private ExecutorService pool = ThreadPoolFactory.recallPool();
+    private final ExecutorService pool = ThreadPoolFactory.recallPool();
 
     @PostConstruct
     public void init() {
@@ -63,28 +64,32 @@ public class FlowPoolRecommendPipeline implements ApplicationContextAware {
 
 
     public List<Video> feedByRec(final RecommendRequest requestData,
-                                     final int recommendType) {
+                                 final int recommendType, Boolean logPrint) {
         List<RecallStrategy> strategies = new ArrayList<>();
 
         RecommendParam param = recommendService.genRecommendParam(requestData, recommendType);
         RecallParam recallParam = recommendService.convertToRecallParam(param);
         RecallResult recallResult = getRecallResult(strategies, recallParam);
+        if (logPrint) {
+            log.info("traceId = {}, recallResult [{}]", requestData.getRequestId(),
+                    JSONObject.toJSONString(recallResult));
+        }
 
         if (recallResult == null || CollectionUtils.isEmpty(recallResult.getData())) {
             return Collections.emptyList();
         }
 
         RankParam rankParam = recommendService.convertToRankParam(param, recallResult);
-        return mergeAndRankFlowPoolRecall(rankParam);
+        List<Video> videoList = mergeAndRankFlowPoolRecall(rankParam);
+        if (logPrint) {
+            log.info("traceId = {}, videoList [{}]", requestData.getRequestId(),
+                    JSONObject.toJSONString(videoList));
+        }
+        return videoList;
     }
 
     public List<Video> mergeAndRankFlowPoolRecall(RankParam param) {
-        List<Video> quickFlowPoolVideos = sortFlowPoolByThompson(param, FlowPoolConstants.QUICK_PUSH_FORM);
-        if (CollectionUtils.isNotEmpty(quickFlowPoolVideos)) {
-            return quickFlowPoolVideos;
-        } else {
-            return sortFlowPoolByThompson(param, FlowPoolConstants.PUSH_FORM);
-        }
+        return sortFlowPoolByThompson(param, FlowPoolConstants.PUSH_FORM);
     }
 
     public List<Video> sortFlowPoolByThompson(RankParam param, String pushFrom) {

+ 41 - 11
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/TopRecommendPipeline.java

@@ -20,6 +20,7 @@ import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorIt
 import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorUserFeature;
 import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
 import com.tzld.piaoquan.recommend.server.util.JSONUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -52,12 +53,23 @@ public class TopRecommendPipeline {
 
     public List<Video> feeds(final RecommendRequest requestData,
                              final int requestIndex,
-                             final User userInfo) {
+                             final User userInfo, Boolean logPrint) {
         // Step 1: Attention extraction
-        List<RankItem> rankItems = feedByRec(requestData, requestIndex, userInfo);
+        List<RankItem> rankItems = feedByRec(requestData, requestIndex, userInfo, logPrint);
         if (rankItems == null || rankItems.isEmpty()) {
             return new ArrayList<>();
         }
+        if (logPrint) {
+            log.info("traceId = {}, rankItems = {}", requestData.getRequestId(), JSONUtils.toJson(rankItems));
+        }
+        List<Video> videos = rankVideos(rankItems, requestData.getRequestId());
+        if (logPrint) {
+            log.info("traceId = {}, videos = {}", requestData.getRequestId(), JSONUtils.toJson(videos));
+        }
+        return videos;
+    }
+
+    private List<Video> rankVideos(List<RankItem> rankItems, String requestId) {
         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();
@@ -123,8 +135,11 @@ public class TopRecommendPipeline {
                     item.scoresMap.getOrDefault("share2returnScore", 0.0)
                     + alpha * trendScore
                     + beta * newVideoScore;
-            Video video = new Video();
-            video.setVideoId(Long.parseLong(item.getId()));
+            Video video = item.getVideo();
+            if (video == null) {
+                log.error("video is null in rankVideos, traceId = {}, videoId = {}", requestId, item.getId());
+                continue;
+            }
             video.setScore(score);
             video.setSortScore(score);
             video.setScoreStr(item.getScoreStr());
@@ -194,7 +209,7 @@ public class TopRecommendPipeline {
 
     public List<RankItem> feedByRec(final RecommendRequest requestData,
                                     final int requestIndex,
-                                    final User userInfo) {
+                                    final User userInfo, Boolean logPrint) {
         int recallNum = 200;
 
         // Step 1: Attention extraction
@@ -204,11 +219,16 @@ public class TopRecommendPipeline {
 
         // Step 2: create top queue
         StrategyQueue topQueue = MergeUtils.createTopQueue(MERGE_CONF, "top-queue");
-
+        if (logPrint) {
+            log.info("traceId = {}, topQueue = {}", requestData.getRequestId(), JSONUtils.toJson(topQueue));
+        }
 
         // Step 3: Candidate
         Map<String, Candidate> candidates = new HashMap<String, Candidate>();
         topQueue.candidate(candidates, recallNum, userInfo, requestData, 0, 0);
+        if (logPrint) {
+            log.info("traceId = {}, candidates = {}", requestData.getRequestId(), JSONUtils.toJson(candidates));
+        }
 
 
         // Step 4: Recalling & Basic Scoring
@@ -216,28 +236,39 @@ public class TopRecommendPipeline {
 
         BaseRecaller recaller = new BaseRecaller(queueProvider);
         List<RankItem> items = recaller.recalling(requestData, userInfo, requestIndex, new ArrayList<>(candidates.values()));
+        if (logPrint) {
+            log.info("traceId = {}, items = {}", requestData.getRequestId(), JSONUtils.toJson(items));
+        }
 
 
         // Step 4: Advance Scoring
 //        timestamp = System.currentTimeMillis();
 //        ScorerPipeline scorerPipeline = getScorerPipeline(requestData);
 //        items = scorerPipeline.scoring(requestData, userInfo, requestIndex, items);
-
+        if (CollectionUtils.isEmpty(items)) {
+            return new ArrayList<>();
+        }
 
         // Step 5: Merger
         MergeUtils.distributeItemsToMultiQueues(topQueue, items);
         topQueue.merge(recallNum * 3, userInfo, requestData, requestIndex, 0);
+        if (logPrint) {
+            log.info("traceId = {}, topQueue after merge = {}", requestData.getRequestId(), JSONUtils.toJson(topQueue));
+        }
 
         // 多样性融合
-//        List<RankItem> mergeItems = topQueue.getItems();
+        List<RankItem> mergeItems = topQueue.getItems();
 //        MergeUtils.diversityRerank(mergeItems, SimilarityUtils.getIsSameUserTagOrCategoryFunc(), recallNum, 6, 2);
 
         // Step 6: Global Rank & subList
         // TODO 前置和后置处理逻辑 hardcode,后续优化
         Map<String, String> sceneFeatureMap = getSceneFeature(requestData);
-        Map<String, String> userFeatureMap = getUserFeatureMap(requestData, items);
+        Map<String, String> userFeatureMap = getUserFeatureMap(requestData, mergeItems);
         List<RankItem> rovRecallRankNewallScore = ScorerUtils.getScorerPipeline(ScorerUtils.BASE_CONF_NEW_FEED)
-                .scoring(sceneFeatureMap, userFeatureMap, items);
+                .scoring(sceneFeatureMap, userFeatureMap, mergeItems);
+        if (logPrint) {
+            log.info("traceId = {}, rovRecallRankNewallScore = {}", requestData.getRequestId(), JSONUtils.toJson(rovRecallRankNewallScore));
+        }
 
         return rovRecallRankNewallScore;
     }
@@ -455,7 +486,6 @@ public class TopRecommendPipeline {
                 "新竹市".equals(city) |
                 "嘉义市".equals(city)
         ){
-            ;
         }else{
             city = city.replaceAll("市$", "");
         }

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

@@ -1,9 +1,9 @@
 package com.tzld.piaoquan.recommend.server.implement.candidate;
 
 import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
-import com.tzld.piaoquan.recommend.server.framework.candidiate.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.candidiate.QueueName;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
+import com.tzld.piaoquan.recommend.server.framework.merger.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueConfig;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueInfo;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;

+ 1 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/HotCandidateQueue.java

@@ -1,8 +1,8 @@
 package com.tzld.piaoquan.recommend.server.implement.candidate;
 
 import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
-import com.tzld.piaoquan.recommend.server.framework.candidiate.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
+import com.tzld.piaoquan.recommend.server.framework.merger.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueConfig;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueInfo;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;

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

@@ -1,9 +1,9 @@
 package com.tzld.piaoquan.recommend.server.implement.candidate;
 
 import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
-import com.tzld.piaoquan.recommend.server.framework.candidiate.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.candidiate.QueueName;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
+import com.tzld.piaoquan.recommend.server.framework.merger.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueConfig;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueInfo;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
@@ -25,7 +25,7 @@ public class Region1hHotCandidate extends IndexCandidateQueue {
         String region = user.getRegion();
         Map<String, Candidate> simplifiedCandidates = new ConcurrentHashMap<String, Candidate>();
 
-        int num = recallNum / 5;
+        int num = recallNum / 3;
 
 
         // index key  video:queue:type=region1h:region=北京:ordering=rov
@@ -41,27 +41,12 @@ public class Region1hHotCandidate extends IndexCandidateQueue {
                 .addMatch("region", region);
         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, 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, 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, num, getStrategyQueueInfo().getQueueName());
-
         candidates.putAll(simplifiedCandidates);
         return currRecall;
     }

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

@@ -1,9 +1,9 @@
 package com.tzld.piaoquan.recommend.server.implement.candidate;
 
 import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
-import com.tzld.piaoquan.recommend.server.framework.candidiate.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.candidiate.QueueName;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
+import com.tzld.piaoquan.recommend.server.framework.merger.IndexCandidateQueue;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueConfig;
 import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueInfo;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;

+ 50 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/candidate/Region3hHotCandidate.java

@@ -0,0 +1,50 @@
+package com.tzld.piaoquan.recommend.server.implement.candidate;
+
+import com.tzld.piaoquan.recommend.server.framework.candidiate.Candidate;
+import com.tzld.piaoquan.recommend.server.framework.candidiate.QueueName;
+import com.tzld.piaoquan.recommend.server.framework.common.User;
+import com.tzld.piaoquan.recommend.server.framework.merger.IndexCandidateQueue;
+import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueConfig;
+import com.tzld.piaoquan.recommend.server.framework.merger.StrategyQueueInfo;
+import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class Region3hHotCandidate extends IndexCandidateQueue {
+
+    public static final String ItemType = "video";
+
+    public Region3hHotCandidate(StrategyQueueInfo strategyQueueInfo, StrategyQueueConfig strategyQueueConfig) {
+        super(strategyQueueInfo, strategyQueueConfig);
+    }
+
+    @Override
+    public int addCandidateKey(Map<String, Candidate> candidates, int recallNum, User user, RecommendRequest requestData, int requestIndex, int expId) {
+        int currRecall = 0;
+        String region = user.getRegion();
+        Map<String, Candidate> simplifiedCandidates = new ConcurrentHashMap<String, Candidate>();
+
+        int num = recallNum / 3;
+
+
+        // index key video:queue:type=region3h:region=北京:ordering=short_rov
+        QueueName queueName3HRegion = new QueueName(ItemType, "short_rov")
+                .addMatch("type", "region3h")
+                .addMatch("region", region);
+        currRecall += addCandidateKey(simplifiedCandidates, queueName3HRegion, num, getStrategyQueueInfo().getQueueName());
+
+        candidates.putAll(simplifiedCandidates);
+        return currRecall;
+    }
+
+    @Override
+    public String toString() {
+        return "Region3hHotCandidate{" +
+                "myCandidates=" + myCandidates +
+                ", rankerItemsList=" + rankerItemsList +
+                ", children=" + children +
+                ", items=" + items +
+                '}';
+    }
+}

+ 3 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/recall/PreViewedFilter.java

@@ -8,23 +8,22 @@ import com.tzld.piaoquan.recommend.server.framework.recaller.FilterConfigInfo;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import com.tzld.piaoquan.recommend.server.model.Video;
 import com.tzld.piaoquan.recommend.server.service.PreViewedService;
+import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.List;
 import java.util.Set;
 
 public class PreViewedFilter extends AbstractFilter<Video> {
 
-    @Autowired
-    private PreViewedService preViewedService;
+    private final PreViewedService preViewedService;
 
     public PreViewedFilter(FilterConfigInfo filterConfigInfo,
                            RecommendRequest recommendRequest,
                            User user) {
         super(filterConfigInfo, recommendRequest, user);
-
+        preViewedService = ServiceBeanFactory.getBean(PreViewedService.class);
     }
 
     @Override

+ 7 - 8
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/implement/recall/ViewedHistoryFilter.java

@@ -8,11 +8,11 @@ import com.tzld.piaoquan.recommend.server.framework.recaller.AbstractFilter;
 import com.tzld.piaoquan.recommend.server.framework.recaller.FilterConfigInfo;
 import com.tzld.piaoquan.recommend.server.gen.recommend.RecommendRequest;
 import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
+import com.tzld.piaoquan.recommend.server.service.SpringContextHolder;
 import com.tzld.piaoquan.recommend.server.service.filter.strategy.VideoView;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
@@ -32,19 +32,18 @@ public class ViewedHistoryFilter extends AbstractFilter<Video> {
 
     protected Set<String> historySet;
 
-    @Autowired
-    @Qualifier("longVideoRedisTemplate")
-    private RedisTemplate<String, String> redisTemplate;
+    private final RedisTemplate<String, String> redisTemplate;
 
-    @Autowired
-    private MongoTemplate mongoTemplate;
+    private final MongoTemplate mongoTemplate;
 
-    private String keyFormat = "user:exclude:videoidset:%s";
+    private final String keyFormat = "user:exclude:videoidset:%s";
 
     public ViewedHistoryFilter(FilterConfigInfo filterConfigInfo,
                                RecommendRequest recommendRequest,
                                User user) {
         super(filterConfigInfo, recommendRequest, user);
+        mongoTemplate = ServiceBeanFactory.getBean(MongoTemplate.class);
+        redisTemplate = SpringContextHolder.getBean("longVideoRedisTemplate", RedisTemplate.class);
         historySet = this.loadUserHistory(user);
         if (historySet == null) {
             historySet = new HashSet<>();

+ 33 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/SpringContextHolder.java

@@ -0,0 +1,33 @@
+package com.tzld.piaoquan.recommend.server.service;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SpringContextHolder implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        SpringContextHolder.applicationContext = applicationContext;
+    }
+
+    public static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    public static Object getBean(String beanName) {
+        return applicationContext.getBean(beanName);
+    }
+
+    public static <T> T getBean(String beanName, Class<T> clazz) {
+        return applicationContext.getBean(beanName, clazz);
+    }
+
+    public static <T> T getBean(Class<T> clazz) {
+        return applicationContext.getBean(clazz);
+    }
+}

+ 33 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/VideoRecommendService.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.recommend.server.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.base.Strings;
 import com.tzld.piaoquan.recommend.server.framework.common.User;
 import com.tzld.piaoquan.recommend.server.gen.common.Result;
@@ -10,10 +11,12 @@ import com.tzld.piaoquan.recommend.server.implement.FlowPoolRecommendPipeline;
 import com.tzld.piaoquan.recommend.server.implement.TopRecommendPipeline;
 import com.tzld.piaoquan.recommend.server.model.RecommendParam;
 import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.remote.FeatureRemoteService;
 import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
 import com.tzld.piaoquan.recommend.server.service.rank.RankResult;
 import com.tzld.piaoquan.recommend.server.service.rank.strategy.RankStrategy4RegionMergeModelV6;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -28,6 +31,11 @@ import java.util.List;
 public class VideoRecommendService {
 
     private final Boolean newRecommendSwitch = true;
+
+    @Value("${recommend.new.log.print:true}")
+    private Boolean newLogPrint;
+    @Resource
+    private FeatureRemoteService featureRemoteService;
     @Resource
     private RecommendService recommendService;
     @Resource
@@ -48,12 +56,34 @@ public class VideoRecommendService {
 
     private RecommendResponse recommendNew(RecommendRequest request, int recommendType) {
         User user = getUser(request);
-        List<Video> topRecommendVideoList = topRecommendPipeline.feeds(request, 0, user);
-        List<Video> flowPoolRecommendVideoList = flowPoolRecommendPipeline.feedByRec(request, recommendType);
+        List<Video> topRecommendVideoList = new ArrayList<>();
+        List<Video> flowPoolRecommendVideoList = new ArrayList<>();
+        try {
+            topRecommendVideoList = topRecommendPipeline.feeds(request, 0, user, newLogPrint);
+            if (newLogPrint) {
+                log.info("traceId = {}, topRecommendVideoList [{}]", request.getRequestId(),
+                        JSONObject.toJSONString(topRecommendVideoList));
+            }
+
+        } catch (Exception e) {
+            log.error("traceId = {}, topRecommendVideoList error", request.getRequestId(), e);
+        }
+        try {
+            flowPoolRecommendVideoList = flowPoolRecommendPipeline.feedByRec(request, recommendType, newLogPrint);
+            if (newLogPrint) {
+                log.info("traceId = {}, flowPoolRecommendVideoList [{}]", request.getRequestId(),
+                        JSONObject.toJSONString(flowPoolRecommendVideoList));
+            }
+        } catch (Exception e) {
+            log.error("traceId = {}, flowPoolRecommendVideoList error", request.getRequestId(), e);
+        }
         RecommendParam recommendParam = recommendService.genRecommendParam(request, recommendType);
         RankParam rankParam = recommendService.convertToRankParam(recommendParam, null);
 
         RankResult rankResult = rankStrategy4RegionMergeModelV6.mergeAndSort(rankParam, topRecommendVideoList, flowPoolRecommendVideoList);
+        if (newLogPrint) {
+            log.info("traceId = {}, rankResult [{}]", request.getRequestId(), JSONObject.toJSONString(rankResult));
+        }
 
         // 只返回size条数据
         List<Video> videos = rankResult.getVideos();
@@ -85,10 +115,9 @@ public class VideoRecommendService {
 
     private User getUser(RecommendRequest request) {
         User user = new User();
-        // TODO 从request中获取用户信息
         user.setMid(request.getMid());
         user.setUid(request.getUid());
-        user.setRegion(request.getCityCode());
+        user.setRegion(request.getProvince());
         return user;
     }
 

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

@@ -68,7 +68,7 @@ public class RecommendV2Controller {
 
         User user = new User();
         user.setRegion(httpRequest.getCityCode());
-        List<Video> videoList = topRecommendPipeline.feeds(httpRequest, 0, user);
+        List<Video> videoList = topRecommendPipeline.feeds(httpRequest, 0, user, true);
         String result = "";
         try {
             result = JSONObject.toJSONString(videoList);
@@ -82,7 +82,7 @@ public class RecommendV2Controller {
     public String flowPool(@RequestBody RecommendRequest httpRequest) {
         MDC.put("appType", String.valueOf(httpRequest.getAppType()));
 
-        List<Video> videoList = flowPoolRecommendPipeline.feedByRec(httpRequest, 0);
+        List<Video> videoList = flowPoolRecommendPipeline.feedByRec(httpRequest, 0, true);
         String result = "";
         try {
             result = JSONObject.toJSONString(videoList);

+ 5 - 2
recommend-server-service/src/main/resources/filter_config.conf

@@ -1,7 +1,10 @@
 recall-config = {
   filter-config = {
-    history-filter-config = {
-      filter-name = "com.tzld.piaoquan.recommend.server.implement.recall.HistoryLongPeriodFilter"
+    viewed-filter-config = {
+      filter-name = "com.tzld.piaoquan.recommend.server.implement.recall.ViewedHistoryFilter"
+    }
+    pre-viewed-filter-config = {
+      filter-name = "com.tzld.piaoquan.recommend.server.implement.recall.PreViewedFilter"
     }
   }
 }

+ 6 - 34
recommend-server-service/src/main/resources/merge_config.conf

@@ -5,22 +5,11 @@ queue-config = {
       hot-queue = {
         class = "com.tzld.piaoquan.recommend.server.framework.merger.SimpleMergeQueue"
         children = {
-          global1h-index = {
-            class = "com.tzld.piaoquan.recommend.server.implement.candidate.Global24hHotCandidate"
-          }
           region1h-index = {
             class = "com.tzld.piaoquan.recommend.server.implement.candidate.Region1hHotCandidate"
           }
-          region24h-index = {
-            class = "com.tzld.piaoquan.recommend.server.implement.candidate.Region24hHotCandidate"
-          }
-        }
-      }
-      explore-queue = {
-        class = "com.tzld.piaoquan.recommend.server.framework.merger.SimpleMergeQueue"
-        children = {
-          category-explore-index = {
-            class = "com.tzld.piaoquan.recommend.server.implement.candidate.HotCandidateQueue"
+          region3h-index = {
+            class = "com.tzld.piaoquan.recommend.server.implement.candidate.Region3hHotCandidate"
           }
         }
       }
@@ -35,42 +24,25 @@ rule-config = {
   top-queue = {
     merge-rule = {
       hot-queue = {
-        recall-percentage = 0.9
+        recall-percentage = 1
         min-merge-num = 1
         priority = 1
       }
-      explore-queue = {
-        recall-percentage = 0.1
-        min-merge-num = 1
-        priority = 5
-      }
     }
   }
 
   // 精选队列
   hot-queue = {
     merge-rule = {
-      global1h-index = {
-        recall-percentage = 0.3
-        min-merge-num = 1
-      }
       region1h-index = {
-        recall-percentage = 0.6
+        recall-percentage = 0.8
         min-merge-num = 1
       }
-      region24h-index = {
-        recall-percentage = 0.1
+      region3h-index = {
+        recall-percentage = 0.2
         min-merge-num = 1
       }
     }
   }
 
-  // 探索队列
-  explore-queue = {
-    merge-rule = {
-      category-explore-index = {
-        recall-percentage = 1
-      }
-    }
-  }
 }