浏览代码

homepage recommend

丁云鹏 1 年之前
父节点
当前提交
dbeebe7575

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

@@ -52,10 +52,10 @@ public class RecommendService {
     private Map<Integer, String> ab_initial_config_map = new HashMap<>();
 
     @ApolloJsonValue("${ab_exp_code:{}}")
-    private Map<String, Map<String, String>> abExpCodeMap = new HashMap<>();
+    private Map<String, Map<String, String>> abExpCodeMap;
 
     @ApolloJsonValue("${app_ab_code:{}}")
-    private Map<String, Map<String, Map<String, String>>> appAbCodeMap = new HashMap<>();
+    private Map<String, Map<String, Map<String, String>>> appAbCodeMap;
 
     @ApolloJsonValue("${flow.pool.ids:[7, 8, 9, 10, 11, 12, 13, 14, 15, 16]}")
     private List<Integer> flowPoolIds;

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

@@ -45,8 +45,20 @@ public abstract class AbstractRegionRecallStrategy implements RecallStrategy {
         String poolKey = "";
 
         // TODO 整段逻辑很奇怪,需要重新理解
+        /**
+         *  TODO 问题:召回时按照降序获取idx,再降序取数据,但是融合排序实验会按照score重新排序,可能导致数据被跳过
+         *  比如:地域 [[1, 0.1],[2, 0.2],[3, 0.3][4, 0.4]]
+         *  排序实验 [[1, 0.9],[2, 0.8],[3, 0.7][4, 0.6]]
+         *
+         *  返回2个视频是 1和2,但是会记录最后一个视频的id是2,那么当地域再次召回时,会召回1,不会召回3、4
+         *
+         */
+
+
+        // recordKey: 每小时生成一个召回源,用来决定用哪个召回源
+        // poolKey: 召回源的key
+        // lastVideoLKey: 上次返回的最后一个视频
         String record = redisTemplate.opsForValue().get(recordKey);
-        log.info("recall recordKey:[{}], record:[{}]", recordKey, record);
         if (StringUtils.isNotBlank(record)) {
             Map<String, String> recordMap = JSONUtils.fromJson(record, new TypeToken<Map<String, String>>() {
             }, Collections.emptyMap());
@@ -78,7 +90,7 @@ public abstract class AbstractRegionRecallStrategy implements RecallStrategy {
             redisTemplate.delete(lastVideoKey);
             poolKey = updateLastVideoRecord(recordKey, param);
         }
-        log.info("recall poolKey={}", poolKey);
+        log.info("recall recordKey={}, record={}, poolKey={}, idx={}, ", recordKey, record, poolKey, idx);
         if (StringUtils.isBlank(poolKey)) {
             return null;
         }
@@ -126,7 +138,7 @@ public abstract class AbstractRegionRecallStrategy implements RecallStrategy {
         Collections.sort(results, Comparator.comparingDouble(o -> -o.getRovScore()));
 
         if (StringUtils.isNotBlank(lastVideoId)
-                && CollectionUtils.isNotEmpty(results)
+                && CollectionUtils.isEmpty(results)
                 && StringUtils.isNotBlank(param.getMid())) {
             // 召回数据不为空 & 过滤后结果为空 &  mid不为空时,更新召回获取的末位视频id记录到定位的key中
             redisTemplate.opsForValue().set(lastVideoKey, lastVideoId, 2, TimeUnit.HOURS);

+ 5 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/SpecialRecallStrategy.java

@@ -5,6 +5,7 @@ import com.tzld.piaoquan.recommend.server.service.recall.RecallParam;
 import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
 import com.tzld.piaoquan.recommend.server.util.DateUtils;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.math.NumberUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -45,8 +46,11 @@ public class SpecialRecallStrategy implements RecallStrategy {
             idx = redisTemplate.opsForZSet().reverseRank(specialKeyName, value);
             if (idx == null) {
                 idx = 0L;
+            } else {
+                idx += 1;
             }
         }
+        log.info("lastSpecialRecallKey={}, value={}, specialKeyName={},idx={}", lastSpecialRecallKey, value, specialKeyName, idx);
 
         int getSize = param.getSize() * 5;
         int freq = 0;
@@ -63,7 +67,7 @@ public class SpecialRecallStrategy implements RecallStrategy {
             idx += getSize;
             data.stream().forEach(t -> {
                 Video video = new Video();
-                video.setVideoId(Long.getLong(t.getValue(), 0L));
+                video.setVideoId(NumberUtils.toLong(t.getValue(), 0L));
                 video.setRovScore(t.getScore());
                 video.setAbCode("99999");
                 video.setPushFrom(PUSH_FROM);