Pārlūkot izejas kodu

Merge branch 'feature/zhangbo_rank' of algorithm/recommend-server into master

zhangbo 1 gadu atpakaļ
vecāks
revīzija
37a92d7147

+ 18 - 29
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankService.java

@@ -1,6 +1,7 @@
 package com.tzld.piaoquan.recommend.server.service.rank;
 
 
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.recommend.feature.domain.video.base.ItemFeature;
 import com.tzld.piaoquan.recommend.feature.domain.video.base.RequestContext;
@@ -49,7 +50,8 @@ public class RankService {
     private boolean newRankSwitch;
     @Value("${newRankAbExpCode:528}")
     private String newRankAbExpCode;
-
+    @ApolloJsonValue("${region.recall.return.size:{}}")
+    protected Map<String, Map<String, Integer>> regionRecallReturnSize;
 
     public RankResult rank(RankParam param) {
         if (param == null
@@ -104,6 +106,14 @@ public class RankService {
         rovRecallRank.addAll(extractAndSort(param, RegionRelative24HRecallStrategy.PUSH_FORM));
         rovRecallRank.addAll(extractAndSort(param, RegionRelative24HDupRecallStrategy.PUSH_FORM));
 
+        // @zhangbo 增加不同召回子策略的返回数量-阿波罗:region.recall.return.size
+        String abCode = param.getAbCode();
+        int sizeReturn = param.getSize();
+        if (abCode != null && this.regionRecallReturnSize != null &&
+                this.regionRecallReturnSize.containsKey(abCode) &&
+                this.regionRecallReturnSize.get(abCode) != null ){
+            sizeReturn = this.regionRecallReturnSize.get(abCode).getOrDefault("result_size", sizeReturn);
+        }
 
         if (param.getAbCode().equals("60054")
                 || param.getAbCode().equals("60068")
@@ -119,37 +129,16 @@ public class RankService {
                 || param.getAbCode().equals("60094")
                 || param.getAbCode().equals("60095")
                 || param.getAbCode().equals("60096")
-                || param.getAbCode().equals("60097")) {
+                || param.getAbCode().equals("60097")
+                || param.getAbCode().equals("60098")
+                || param.getAbCode().equals("60103")
+                || param.getAbCode().equals("60104")
+                || param.getAbCode().equals("60105")) {
             // 地域召回要做截取,再做融合排序
             removeDuplicate(rovRecallRank);
-            rovRecallRank = rovRecallRank.size() <= param.getSize()
+            rovRecallRank = rovRecallRank.size() <= sizeReturn
                     ? rovRecallRank
-                    : rovRecallRank.subList(0, param.getSize());
-
-            // merge sim recall 和 return recall
-            rovRecallRank.addAll(extractAndSort(param, SimHotVideoRecallStrategy.PUSH_FORM));
-            rovRecallRank.addAll(extractAndSort(param, ReturnVideoRecallStrategy.PUSH_FORM));
-            removeDuplicate(rovRecallRank);
-
-            // 融合排序
-            List<String> videoIdKeys = rovRecallRank.stream()
-                    .map(t -> param.getRankKeyPrefix() + t.getVideoId())
-                    .collect(Collectors.toList());
-            List<String> videoScores = redisTemplate.opsForValue().multiGet(videoIdKeys);
-//            log.info("rank mergeAndRankRovRecall videoIdKeys={}, videoScores={}", JSONUtils.toJson(videoIdKeys),
-//                    JSONUtils.toJson(videoScores));
-            if (CollectionUtils.isNotEmpty(videoScores)
-                    && videoScores.size() == rovRecallRank.size()) {
-                for (int i = 0; i < videoScores.size(); i++) {
-                    rovRecallRank.get(i).setSortScore(NumberUtils.toDouble(videoScores.get(i), 0.0));
-                }
-                Collections.sort(rovRecallRank, Comparator.comparingDouble(o -> -o.getSortScore()));
-            }
-        } else if (param.getAbCode().equals("60098")) {
-
-            int sizeNew = param.getSize();
-            removeDuplicate(rovRecallRank);
-            rovRecallRank = rovRecallRank.size() <= sizeNew ? rovRecallRank : rovRecallRank.subList(0, sizeNew);
+                    : rovRecallRank.subList(0, sizeReturn);
 
             // merge sim recall 和 return recall
             rovRecallRank.addAll(extractAndSort(param, SimHotVideoRecallStrategy.PUSH_FORM));

+ 5 - 9
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java

@@ -118,18 +118,14 @@ public class RecallService implements ApplicationContextAware {
                 case "60096":
                 case "60097":
                 case "60098":
-                case "60101":
-                case "60102": // 通过更改param中的配置实现使用不同数据源 data66 rule68
+                case "60101": // 排序str实验
+                case "60102": // 通过更改param中的配置实现使用不同数据源 data66 rule68 + 无排序模块
+                case "60103": // 增加地域1小时扩量,通过配置实现
+                case "60105": // 通过更改param中的配置实现使用不同数据源 data66 rule68 + 有排序模块
                     strategies.add(strategyMap.get(SimHotVideoRecallStrategy.class.getSimpleName()));
                     strategies.add(strategyMap.get(ReturnVideoRecallStrategy.class.getSimpleName()));
                     break;
-                case "60103":
-                    // todo 增加地域1小时扩量
-                    strategies.add(strategyMap.get(SimHotVideoRecallStrategy.class.getSimpleName()));
-                    strategies.add(strategyMap.get(ReturnVideoRecallStrategy.class.getSimpleName()));
-                    break;
-                case "60104":
-                    // 去掉sim的对比实验
+                case "60104": // 去掉sim的对比实验
                     strategies.add(strategyMap.get(ReturnVideoRecallStrategy.class.getSimpleName()));
                     break;
                 default:

+ 15 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/AbstractRegionRecallStrategy.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.recommend.server.service.recall.strategy;
 
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.google.common.collect.Lists;
 import com.google.common.reflect.TypeToken;
 import com.tzld.piaoquan.recommend.server.model.Video;
@@ -16,6 +17,7 @@ import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.ZSetOperations;
 
@@ -29,7 +31,8 @@ import java.util.concurrent.TimeUnit;
 public abstract class AbstractRegionRecallStrategy implements RecallStrategy {
     @Autowired
     protected RedisTemplate<String, String> redisTemplate;
-
+    @ApolloJsonValue("${region.recall.return.size:{}}")
+    protected Map<String, Map<String, Integer>> regionRecallReturnSize;
 
     @Autowired
     protected RegionFilterService filterService;
@@ -158,8 +161,17 @@ public abstract class AbstractRegionRecallStrategy implements RecallStrategy {
             redisTemplate.opsForValue().set(lastVideoKey, lastVideoId, 2, TimeUnit.HOURS);
         }
 
-        return results.subList(0, results.size() < param.getSize() ? results.size() : param.getSize());
-        // return results;
+        // @zhangbo 增加不同召回子策略的返回数量-阿波罗:region.recall.return.size
+        String abCode = param.getAbCode();
+        String pushFrom = this.pushFrom();
+        int sizeReturn = param.getSize();
+        if (abCode != null && this.regionRecallReturnSize != null &&
+                this.regionRecallReturnSize.containsKey(abCode) &&
+                this.regionRecallReturnSize.get(abCode) != null ){
+            sizeReturn = this.regionRecallReturnSize.get(abCode).getOrDefault(pushFrom, sizeReturn);
+        }
+
+        return results.subList(0, results.size() < sizeReturn ? results.size() : sizeReturn);
     }
 
     private int getIdx(String lastVideoKey, String poolKey) {