Browse Source

Merge branch 'wyp/1118-randomStrategy' of Server/long-article-recommend into master

wangyunpeng 7 months ago
parent
commit
61f1176a71

+ 1 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/common/enums/recommend/RankStrategyEnum.java

@@ -22,6 +22,7 @@ public enum RankStrategyEnum {
 
     INFINITE_STRATEGY("ArticleRankInfinite", "无限发表", "infiniteRankStrategy"),
     LATE_STRATEGY("ArticleRankLate", "晚间策略", "lateRankStrategy"),
+    RANDOM_STRATEGY("ArticleRankRandom", "随机策略", "randomRankStrategy"),
     DEFAULT_STRATEGY("ArticleRankV1", "默认策略", "defaultRankStrategy"),
     ;
 

+ 72 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/rank/strategy/RandomRankStrategy.java

@@ -0,0 +1,72 @@
+package com.tzld.longarticle.recommend.server.service.recommend.rank.strategy;
+
+import com.tzld.longarticle.recommend.server.model.dto.Content;
+import com.tzld.longarticle.recommend.server.service.recommend.config.AccountContentPoolConfigService;
+import com.tzld.longarticle.recommend.server.service.recommend.config.StrategyIndexScoreWeightService;
+import com.tzld.longarticle.recommend.server.service.recommend.rank.RankItem;
+import com.tzld.longarticle.recommend.server.service.recommend.rank.RankParam;
+import com.tzld.longarticle.recommend.server.service.recommend.rank.RankResult;
+import com.tzld.longarticle.recommend.server.service.recommend.rank.RankStrategy;
+import com.tzld.longarticle.recommend.server.service.recommend.score.ScoreService;
+import com.tzld.longarticle.recommend.server.util.CommonCollectionUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+@Slf4j
+public class RandomRankStrategy implements RankStrategy {
+
+    @Autowired
+    private ScoreService scoreService;
+    @Autowired
+    private AccountContentPoolConfigService accountContentPoolConfigService;
+    @Autowired
+    private StrategyIndexScoreWeightService weightService;
+
+    public RankResult rank(RankParam param) {
+        List<Content> result = new ArrayList<>();
+        String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName());
+
+        List<RankItem> items = CommonCollectionUtils.toList(param.getContents(), c -> {
+            RankItem item = new RankItem();
+            item.setContent(c);
+            return item;
+        });
+
+        List<Content> contents = CommonCollectionUtils.toList(items, RankItem::getContent);
+        // 3 文章按照内容池分组
+        Map<String, List<Content>> contentMap = new HashMap<>();
+        for (Content c : contents) {
+            List<Content> data = contentMap.computeIfAbsent(c.getContentPoolType(), k -> new ArrayList<>());
+            data.add(c);
+        }
+        // 头
+        List<Content> pool = contentMap.get(contentPools[0]);
+        if (CollectionUtils.isNotEmpty(pool)) {
+            Collections.shuffle(pool);
+            result.add(pool.get(0));
+        }
+        // 次
+        pool = contentMap.get(contentPools[1]);
+        if (CollectionUtils.isNotEmpty(pool)) {
+            Collections.shuffle(pool);
+            result.add(pool.get(0));
+            if (result.size() == 1 && pool.size() > 1) {
+                result.add(pool.get(1));
+            }
+        }
+        // 全部使用3-8内容池
+        pool = contentMap.get(contentPools[2]);
+        if (CollectionUtils.isNotEmpty(pool)) {
+            Collections.shuffle(pool);
+            result.addAll(pool.subList(0, Math.min(pool.size(), param.getSize())));
+        }
+
+        return new RankResult(result);
+    }
+
+}

+ 3 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/score/ScoreService.java

@@ -91,6 +91,9 @@ public class ScoreService implements ApplicationContextAware {
 
     private List<ScoreStrategy> getScoreStrategy(ScoreParam param) {
         List<ScoreStrategy> strategies = new ArrayList<>();
+        if (StringUtils.equals(param.getStrategy(), RankStrategyEnum.RANDOM_STRATEGY.getStrategy())) {
+            return strategies;
+        }
         strategies.add(strategyMap.get(ScoreStrategyEnum.CRAWLER_DAYS_DECREASE_STRATEGY.value()));
         if (!similarityStopStrategies.contains(param.getStrategy())) {
             strategies.add(strategyMap.get(ScoreStrategyEnum.SIMILARITY.value()));