| 
														
															@@ -91,13 +91,34 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return videos; 
														 | 
														
														 | 
														
															         return videos; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    private List<Video> rankItem2Video(List<RankItem> rankItems) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        List<Video> videos = new ArrayList<>(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        for (RankItem item : rankItems) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            Video video = new Video(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setVideoId(Long.parseLong(item.getId())); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setPushFrom(item.getQueue()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setScore(item.getScore()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setSortScore(item.getScore()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setScoreStr(item.getScoreStr()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setScoresMap(item.getScoresMap()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            Map<String, List<String>> pushFromIndex = new HashMap<>(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            pushFromIndex.put(item.getQueue(), item.getCandidateInfoList().stream() 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    .map(CandidateInfo::getCandidateQueueName).collect(Collectors.toList())); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            video.setPushFromIndex(pushFromIndex); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            videos.add(video); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        videos.sort(Comparator.comparing(Video::getScore).reversed()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        return videos; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     public List<Double> getStaticData(Map<String, Map<String, Double>> itemRealMap, 
														 | 
														
														 | 
														
															     public List<Double> getStaticData(Map<String, Map<String, Double>> itemRealMap, 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                                      List<String> datehours, String key){ 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                                      List<String> datehours, String key) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         List<Double> views = new LinkedList<>(); 
														 | 
														
														 | 
														
															         List<Double> views = new LinkedList<>(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         Map<String, Double> tmp = itemRealMap.getOrDefault(key, new HashMap<>()); 
														 | 
														
														 | 
														
															         Map<String, Double> tmp = itemRealMap.getOrDefault(key, new HashMap<>()); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        for (String dh : datehours){ 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        for (String dh : datehours) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             views.add(tmp.getOrDefault(dh, 0.0D) + 
														 | 
														
														 | 
														
															             views.add(tmp.getOrDefault(dh, 0.0D) + 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                    (views.isEmpty() ? 0.0: views.get(views.size()-1)) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    (views.isEmpty() ? 0.0 : views.get(views.size() - 1)) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             ); 
														 | 
														
														 | 
														
															             ); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return views; 
														 | 
														
														 | 
														
															         return views; 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -158,14 +179,18 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         timeLogMap.put("recalling-cost", stopwatch.elapsed().toMillis() + ""); 
														 | 
														
														 | 
														
															         timeLogMap.put("recalling-cost", stopwatch.elapsed().toMillis() + ""); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         timeLogMap.put("recalling-size", items == null ? "0" : items.size() + ""); 
														 | 
														
														 | 
														
															         timeLogMap.put("recalling-size", items == null ? "0" : items.size() + ""); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        // Step 4: Advance Scoring 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-//        timestamp = System.currentTimeMillis(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-//        ScorerPipeline scorerPipeline = getScorerPipeline(requestData); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-//        items = scorerPipeline.scoring(requestData, userInfo, requestIndex, items); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         if (CollectionUtils.isEmpty(items)) { 
														 | 
														
														 | 
														
															         if (CollectionUtils.isEmpty(items)) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             return new ArrayList<>(); 
														 | 
														
														 | 
														
															             return new ArrayList<>(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // Step 4: Advance Scoring 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        stopwatch.reset().start(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        videoScoredByFeature(items); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        if (logPrint) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            log.info("traceId = {}, cost = {}, items = {}", requestData.getRequestId(), 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                    stopwatch.elapsed().toMillis(), JSONUtils.toJson(items)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         stopwatch.reset().start(); 
														 | 
														
														 | 
														
															         stopwatch.reset().start(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         // Step 5: Merger 
														 | 
														
														 | 
														
															         // Step 5: Merger 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         MergeUtils.distributeItemsToMultiQueues(topQueue, items); 
														 | 
														
														 | 
														
															         MergeUtils.distributeItemsToMultiQueues(topQueue, items); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -188,18 +213,7 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 //        MergeUtils.diversityRerank(mergeItems, SimilarityUtils.getIsSameUserTagOrCategoryFunc(), recallNum, 6, 2); 
														 | 
														
														 | 
														
															 //        MergeUtils.diversityRerank(mergeItems, SimilarityUtils.getIsSameUserTagOrCategoryFunc(), recallNum, 6, 2); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															         // Step 6: Global Rank & subList 
														 | 
														
														 | 
														
															         // Step 6: Global Rank & subList 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        // TODO 前置和后置处理逻辑 hardcode,后续优化 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        stopwatch.reset().start(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        List<RankItem> rovRecallRankNewScore = rankByScore(mergeItems, requestData); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        timeLogMap.put("rankByScore-cost", stopwatch.elapsed().toMillis() + ""); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        timeLogMap.put("rankByScore-size", rovRecallRankNewScore.size() + ""); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        if (logPrint) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            log.info("traceId = {}, cost = {}, rovRecallRankNewScore = {}", requestData.getRequestId(), 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                    stopwatch.elapsed().toMillis(), JSONUtils.toJson(rovRecallRankNewScore)); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        } 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        return rovRecallRankNewScore; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        return mergeItems; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     public Double calScoreWeightNoTimeDecay(List<Double> data) { 
														 | 
														
														 | 
														
															     public Double calScoreWeightNoTimeDecay(List<Double> data) { 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -212,7 +226,7 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return down > 1E-8 ? up / down : 0.0; 
														 | 
														
														 | 
														
															         return down > 1E-8 ? up / down : 0.0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-    private List<Video> rankItem2Video(List<RankItem> items) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+    private void videoScoredByFeature(List<RankItem> items) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         // 1 模型分 
														 | 
														
														 | 
														
															         // 1 模型分 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         List<String> rtFeaPartKey = new ArrayList<>(Arrays.asList("item_rt_fea_1day_partition", "item_rt_fea_1h_partition")); 
														 | 
														
														 | 
														
															         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); 
														 | 
														
														 | 
														
															         List<String> rtFeaPartKeyResult = this.redisTemplate.opsForValue().multiGet(rtFeaPartKey); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -280,7 +294,6 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         // 3 融合公式 
														 | 
														
														 | 
														
															         // 3 融合公式 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        List<Video> result = new ArrayList<>(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         double a = mergeWeight.getOrDefault("a", 0.1); 
														 | 
														
														 | 
														
															         double a = mergeWeight.getOrDefault("a", 0.1); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         double b = mergeWeight.getOrDefault("b", 0.0); 
														 | 
														
														 | 
														
															         double b = mergeWeight.getOrDefault("b", 0.0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         double c = mergeWeight.getOrDefault("c", 0.000001); 
														 | 
														
														 | 
														
															         double c = mergeWeight.getOrDefault("c", 0.000001); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -300,7 +313,7 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             double share2allreturnScore = item.scoresMap.getOrDefault("share2allreturnScore", 0.0); 
														 | 
														
														 | 
														
															             double share2allreturnScore = item.scoresMap.getOrDefault("share2allreturnScore", 0.0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             double view2allreturnScore = item.scoresMap.getOrDefault("view2allreturnScore", 0.0); 
														 | 
														
														 | 
														
															             double view2allreturnScore = item.scoresMap.getOrDefault("view2allreturnScore", 0.0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             double preturnsScore = Math.log(1 + item.scoresMap.getOrDefault("preturnsScore", 0.0)); 
														 | 
														
														 | 
														
															             double preturnsScore = Math.log(1 + item.scoresMap.getOrDefault("preturnsScore", 0.0)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            double score = 0.0; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            double score; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             if (ifAdd < 0.5) { 
														 | 
														
														 | 
														
															             if (ifAdd < 0.5) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 score = Math.pow(strScore, a) * Math.pow(rosScore, b) + c * preturnsScore + 
														 | 
														
														 | 
														
															                 score = Math.pow(strScore, a) * Math.pow(rosScore, b) + c * preturnsScore + 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                         (newVideoScore > 1E-8 ? d * trendScore * (e + newVideoScore) : 0.0); 
														 | 
														
														 | 
														
															                         (newVideoScore > 1E-8 ? d * trendScore * (e + newVideoScore) : 0.0); 
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -313,22 +326,9 @@ public class TopRecommendPipeline { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             if (allreturnsScore > h) { 
														 | 
														
														 | 
														
															             if (allreturnsScore > h) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 score += (f * share2allreturnScore + g * view2allreturnScore); 
														 | 
														
														 | 
														
															                 score += (f * share2allreturnScore + g * view2allreturnScore); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             } 
														 | 
														
														 | 
														
															             } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            Video video = new Video(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setVideoId(Long.parseLong(item.getId())); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setPushFrom(item.getQueue()); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setScore(score); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setSortScore(score); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setScoreStr(item.getScoreStr()); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setScoresMap(item.getScoresMap()); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            Map<String, List<String>> pushFromIndex = new HashMap<>(); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            pushFromIndex.put(item.getQueue(), item.getCandidateInfoList().stream() 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                    .map(CandidateInfo::getCandidateQueueName).collect(Collectors.toList())); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            video.setPushFromIndex(pushFromIndex); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            result.add(video); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            // 设置计算好的分数 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            item.setScore(score); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        Collections.sort(result, Comparator.comparingDouble(o -> -o.getSortScore())); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        return result; 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															     public double calNewVideoScore(Map<String, String> itemBasicMap) { 
														 | 
														
														 | 
														
															     public double calNewVideoScore(Map<String, String> itemBasicMap) { 
														 |