Ver código fonte

feat:rerank配置功能

zhaohaipeng 3 semanas atrás
pai
commit
b91d4bd0c3

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/RerankParam.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.recommend.server.service.rerank;
 
 import com.tzld.piaoquan.recommend.server.model.MachineInfo;
 import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.rerank.config.RerankConfigManager;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -37,4 +38,5 @@ public class RerankParam {
     private Long headVid = 0L;
     private Long hotSceneType = 0L;
 
+    private RerankConfigManager rerankConfigManager;
 }

+ 6 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/RerankService.java

@@ -1,10 +1,12 @@
 package com.tzld.piaoquan.recommend.server.service.rerank;
 
 import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.rerank.config.RerankConfigDefaultManager;
 import com.tzld.piaoquan.recommend.server.service.rerank.strategy.FlowPoolVideoInsertRerankStrategy;
 import com.tzld.piaoquan.recommend.server.service.rerank.strategy.VideoAttrWeightRerankStrategy;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Service;
@@ -22,6 +24,9 @@ public class RerankService implements ApplicationContextAware {
     private final Map<String, RerankStrategy> strategyMap = new HashMap<>();
     private ApplicationContext applicationContext;
 
+    @Autowired
+    private RerankConfigDefaultManager rerankConfigDefaultManager;
+
     @PostConstruct
     public void init() {
         Map<String, RerankStrategy> type = applicationContext.getBeansOfType(RerankStrategy.class);
@@ -36,7 +41,7 @@ public class RerankService implements ApplicationContextAware {
      */
     public RerankResult rerank(RerankParam param) {
         List<RerankStrategy> rerankStrategies = this.getRerankStrategies(param);
-
+        param.setRerankConfigManager(this.rerankConfigDefaultManager);
         // 遍历每个重排策略,以最后一个重排策略的结果为最终结果
         List<Video> videos = new ArrayList<>();
         for (RerankStrategy rerankStrategy : rerankStrategies) {

+ 31 - 30
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/strategy/BasicRerankStrategy.java → recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/config/RerankConfigBasicManager.java

@@ -1,61 +1,62 @@
-package com.tzld.piaoquan.recommend.server.service.rerank.strategy;
+package com.tzld.piaoquan.recommend.server.service.rerank.config;
 
-import com.tzld.piaoquan.recommend.server.service.rerank.RerankStrategy;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.data.redis.core.RedisTemplate;
 
-import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Objects;
+import java.util.function.Function;
 
 @Slf4j
-public abstract class BasicRerankStrategy implements RerankStrategy {
-
-    @Resource
-    @Qualifier("redisTemplate")
-    public RedisTemplate<String, String> redisTemplate;
+public abstract class RerankConfigBasicManager implements RerankConfigManager {
 
     private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHH");
 
-    /**
-     * 是否在时间范围条件内
-     */
-    protected boolean isInTimeRangeCondition(String timeRange) {
+    protected Function<LocalDateTime, Boolean> parseTimeToFunction(String timeRange) {
         if (StringUtils.isBlank(timeRange)) {
-            return true;
+            return localDateTime -> true;
         }
+
         String[] split = timeRange.split("-");
         if (split.length != 2) {
-            return false;
+            return localDateTime -> true;
         }
 
         String start = split[0].trim();
         String end = split[1].trim();
 
-        LocalDateTime now = LocalDateTime.now();
+        Pair<LocalDateTime, LocalDateTime> dateTimePair = this.parseDateTimeRange(start, end);
+        if (Objects.nonNull(dateTimePair)) {
+            return new Function<LocalDateTime, Boolean>() {
+                private final Pair<LocalDateTime, LocalDateTime> localDateTimePair = dateTimePair;
 
-        // 具体的时间判断
-        Pair<LocalDateTime, LocalDateTime> localDateTimePair = this.parseDateTimeRange(start, end);
-        if (Objects.nonNull(localDateTimePair)) {
-            LocalDateTime startDt = localDateTimePair.getLeft();
-            LocalDateTime endDt = localDateTimePair.getRight();
+                @Override
+                public Boolean apply(LocalDateTime now) {
+                    LocalDateTime startDt = localDateTimePair.getLeft();
+                    LocalDateTime endDt = localDateTimePair.getRight();
 
-            // 等价于 startDt <= now <= endDt
-            return !now.isBefore(startDt) && !now.isAfter(endDt);
+                    // 等价于 startDt <= now <= endDt
+                    return !now.isBefore(startDt) && !now.isAfter(endDt);
+                }
+            };
         }
 
-        // 小时判断
-        Pair<Integer, Integer> hourPair = this.parseHourRange(start, end);
-        if (Objects.nonNull(hourPair)) {
-            int nowHour = now.getHour();
-            return hourPair.getLeft() <= nowHour && nowHour <= hourPair.getRight();
+        Pair<Integer, Integer> hourRangePair = this.parseHourRange(start, end);
+        if (Objects.nonNull(hourRangePair)) {
+            return new Function<LocalDateTime, Boolean>() {
+                private final Pair<Integer, Integer> hourPair = hourRangePair;
+
+                @Override
+                public Boolean apply(LocalDateTime now) {
+                    int nowHour = now.getHour();
+                    return hourPair.getLeft() <= nowHour && nowHour <= hourPair.getRight();
+                }
+            };
         }
 
-        return false;
+        return localDateTime -> true;
     }
 
     // 判断是否符合 yyyyMMddHH 格式

+ 42 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/config/RerankConfigDefaultManager.java

@@ -0,0 +1,42 @@
+package com.tzld.piaoquan.recommend.server.service.rerank.config;
+
+import com.alibaba.fastjson.JSON;
+import com.tzld.piaoquan.recommend.server.service.rerank.config.model.VideoAttrWeightConfigItem;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Component
+public class RerankConfigDefaultManager extends RerankConfigBasicManager {
+
+    private List<VideoAttrWeightConfigItem> videoAttrWeightConfigItems = new ArrayList<>();
+
+    @Override
+    public List<VideoAttrWeightConfigItem> getVideoAttrWeightConfigItems() {
+        return videoAttrWeightConfigItems;
+    }
+
+
+    @Value("${video.attr.weight.rerank.config:[]}")
+    public void setVideoAttrWeightConfigItems(String paramStr) {
+        List<VideoAttrWeightConfigItem> paramConfigList = new ArrayList<>();
+        try {
+            paramConfigList = JSON.parseArray(paramStr, VideoAttrWeightConfigItem.class);
+        } catch (Exception e) {
+            log.error("parse video.attr.weight.rerank.config error. paramStr: {} \n", paramStr, e);
+        }
+        if (CollectionUtils.isEmpty(paramConfigList)) {
+            return;
+        }
+        for (VideoAttrWeightConfigItem item : paramConfigList) {
+            item.setTimeFunc(this.parseTimeToFunction(item.getTime()));
+        }
+
+        videoAttrWeightConfigItems = paramConfigList;
+    }
+}

+ 15 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/config/RerankConfigManager.java

@@ -0,0 +1,15 @@
+package com.tzld.piaoquan.recommend.server.service.rerank.config;
+
+import com.tzld.piaoquan.recommend.server.service.rerank.config.model.VideoAttrWeightConfigItem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public interface RerankConfigManager {
+
+    default List<VideoAttrWeightConfigItem> getVideoAttrWeightConfigItems() {
+        return new ArrayList<>();
+    }
+
+
+}

+ 24 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/config/model/VideoAttrWeightConfigItem.java

@@ -0,0 +1,24 @@
+package com.tzld.piaoquan.recommend.server.service.rerank.config.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+import java.util.function.Function;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VideoAttrWeightConfigItem {
+
+    private String key;
+    private String value;
+    private Function<LocalDateTime, Boolean> timeFunc;
+    private String type;
+    private String time;
+    private Double weight;
+
+}

+ 20 - 24
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rerank/strategy/VideoAttrWeightRerankStrategy.java

@@ -1,17 +1,18 @@
 package com.tzld.piaoquan.recommend.server.service.rerank.strategy;
 
-import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.tzld.piaoquan.recommend.server.model.Video;
 import com.tzld.piaoquan.recommend.server.service.rerank.RerankParam;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
+import com.tzld.piaoquan.recommend.server.service.rerank.RerankStrategy;
+import com.tzld.piaoquan.recommend.server.service.rerank.config.RerankConfigManager;
+import com.tzld.piaoquan.recommend.server.service.rerank.config.model.VideoAttrWeightConfigItem;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
+import java.time.LocalDateTime;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -19,22 +20,25 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Component
-public class VideoAttrWeightRerankStrategy extends BasicRerankStrategy {
-
-    @ApolloJsonValue("${video.attr.weight.rerank.config:[]}")
-    private List<VideoAttributeConfigItem> configItems;
+public class VideoAttrWeightRerankStrategy implements RerankStrategy {
 
     @Override
     public List<Video> rerank(RerankParam param) {
 
         List<Video> rovVideos = param.getRovVideos();
-        if (CollectionUtils.isEmpty(rovVideos) || CollectionUtils.isEmpty(configItems)) {
+
+        RerankConfigManager configManager = param.getRerankConfigManager();
+
+        if (CollectionUtils.isEmpty(rovVideos) || Objects.isNull(configManager) || CollectionUtils.isEmpty(configManager.getVideoAttrWeightConfigItems())) {
             return rovVideos;
         }
 
+        List<VideoAttrWeightConfigItem> configItems = configManager.getVideoAttrWeightConfigItems();
+        LocalDateTime now = LocalDateTime.now();
+
         // 重新计算分数,并重新排序
         for (Video video : rovVideos) {
-            this.reCalcVideoScore(video);
+            this.reCalcVideoScore(video, configItems, now);
         }
 
         rovVideos.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
@@ -42,20 +46,21 @@ public class VideoAttrWeightRerankStrategy extends BasicRerankStrategy {
         return rovVideos;
     }
 
-    private void reCalcVideoScore(Video video) {
+    private void reCalcVideoScore(Video video, List<VideoAttrWeightConfigItem> configItems, LocalDateTime now) {
         double score = video.getScore();
         video.getScoresMap().put("rerankBeforeScore", score);
 
         Map<String, String> basicInfo = video.getMetaFeatureMap().getOrDefault("alg_vid_feature_basic_info", new HashMap<>());
 
-        for (VideoAttributeConfigItem configItem : configItems) {
 
-            String time = configItem.getTime();
+        for (VideoAttrWeightConfigItem configItem : configItems) {
+
+            Function<LocalDateTime, Boolean> timeFunc = configItem.getTimeFunc();
             String key = configItem.getKey();
             String value = configItem.getValue();
 
             // 当前时间不需要加权,直接跳过
-            if (!this.isInTimeRangeCondition(time)) {
+            if (Objects.nonNull(timeFunc) && !timeFunc.apply(now)) {
                 continue;
             }
 
@@ -75,7 +80,7 @@ public class VideoAttrWeightRerankStrategy extends BasicRerankStrategy {
             double weight = configItem.getWeight();
 
             score *= weight;
-            video.getScoresMap().put(String.format("%s_%s_%s", key, value, time), weight);
+            video.getScoresMap().put(String.format("%s_%s_%s", key, value, configItem.getTime()), weight);
 
         }
 
@@ -84,13 +89,4 @@ public class VideoAttrWeightRerankStrategy extends BasicRerankStrategy {
         video.setSortScore(score);
     }
 
-    @Data
-    @NoArgsConstructor
-    @AllArgsConstructor
-    private static class VideoAttributeConfigItem {
-        private String key;
-        private String value;
-        private String time;
-        private Double weight;
-    }
 }