Просмотр исходного кода

priorScene 池识别改为 demand_strategy='人群需求' AND match_method='场景已看视频'(0519+ 起,上游不再用旧值'人群需求-场景');prior/posterior 池加 match_method='票圈推荐库' 过滤,与新 priorScene 互斥防抓重;VO 透出 matchMethod 给前端 hover 展示。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
刘立冬 10 часов назад
Родитель
Сommit
a3f4b3e6af

+ 1 - 0
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ext/ContentPlatformDemandVideoMapperExt.java

@@ -46,6 +46,7 @@ public interface ContentPlatformDemandVideoMapperExt {
                                                        @Param("channelLevel3") String channelLevel3,
                                                        @Param("driveDimensionTime") String driveDimensionTime,
                                                        @Param("category") String category,
+                                                       @Param("matchMethod") String matchMethod,
                                                        @Param("limit") int limit,
                                                        @Param("excludeSelfTitle") boolean excludeSelfTitle);
 

+ 3 - 0
api-module/src/main/java/com/tzld/piaoquan/api/model/vo/contentplatform/VideoContentItemVO.java

@@ -119,4 +119,7 @@ public class VideoContentItemVO {
 
     @ApiModelProperty(value = "场景汇总ROV")
     private Double sceneSumRov;
+
+    @ApiModelProperty(value = "匹配手段")
+    private String matchMethod;
 }

+ 17 - 10
api-module/src/main/java/com/tzld/piaoquan/api/service/contentplatform/impl/ContentPlatformPlanServiceImpl.java

@@ -621,9 +621,12 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
     private static final int HOT_CANDIDATE_LIMIT = 10000;
     private static final int TOP_K_PER_DEMAND = 3;
     private static final String DEMAND_STRATEGY_PRIOR = "人群需求";
-    private static final String DEMAND_STRATEGY_PRIOR_SCENE = "人群需求-场景";
     private static final String DEMAND_STRATEGY_POSTERIOR = "优质相似";
     private static final String PRIOR_PREMIUM_DIMENSION = "传播的头部";
+    /** match_method 取值,priorScene 池识别用(0519+ 起替代旧 demand_strategy='人群需求-场景') */
+    private static final String MATCH_METHOD_PRIOR_SCENE = "场景已看视频";
+    /** match_method 取值,prior / posterior 池识别用 */
+    private static final String MATCH_METHOD_PRIOR = "票圈推荐库";
     /** prior/posterior 池视频近 7 日 rov 下限(质量过滤):0.02 在 prior 池 0513 全量保留 ~41%,
      * cdjh 优质相似 0514 验证保留 ~54%,量大有意义;
      * priorScene 池基数小(单 channel 几十~百条),仍保持 >0(在 groupAndTopK 内兜底)。 */
@@ -882,16 +885,17 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         String channelName = resolveChannelName(param);
 
         String category = StringUtils.hasText(param.getCategory()) ? param.getCategory() : null;
+        // priorScene 池新识别:demand_strategy='人群需求' AND match_method='场景已看视频'(0519+ 起,旧 demand_strategy='人群需求-场景' 已迁走)
         List<ContentPlatformDemandVideo> rows = demandVideoMapperExt.selectForRecommend(
-                dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR_SCENE, null, null, null, ghName, null, category, limit, false);
+                dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR, null, null, null, ghName, null, category, MATCH_METHOD_PRIOR_SCENE, limit, false);
         if (ghName != null && rows.isEmpty()) {
             rows = demandVideoMapperExt.selectForRecommend(
-                    dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR_SCENE, null, null, null, null, null, category, limit, false);
+                    dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR, null, null, null, null, null, category, MATCH_METHOD_PRIOR_SCENE, limit, false);
         }
         // 跨渠道退化:channel_name 命中但 crowd_segment 在对侧渠道下 0 行(如公众号账号切到企微入口)→ 去 crowd_segment,只按 channel_name 拉通用数据
         if (channelName != null && rows.isEmpty()) {
             rows = demandVideoMapperExt.selectForRecommend(
-                    dt, channelName, null, DEMAND_STRATEGY_PRIOR_SCENE, null, null, null, null, null, category, limit, false);
+                    dt, channelName, null, DEMAND_STRATEGY_PRIOR, null, null, null, null, null, category, MATCH_METHOD_PRIOR_SCENE, limit, false);
         }
         // 1. 同 video_id 取 total_rov 最大的代表行(SQL 已排序,putIfAbsent 保留首次)
         LinkedHashMap<Long, ContentPlatformDemandVideo> bestPerVideo = new LinkedHashMap<>();
@@ -937,18 +941,19 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         int fetchLimit = Math.max(limit * 3, DEMAND_CANDIDATE_LIMIT);
 
         String category = StringUtils.hasText(param.getCategory()) ? param.getCategory() : null;
+        // prior 池加 match_method='票圈推荐库' 过滤,与 priorScene 池('场景已看视频')互斥,避免在新数据格式下两池抓重
         List<ContentPlatformDemandVideo> rows = demandVideoMapperExt.selectForRecommend(
-                dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR, PRIOR_PREMIUM_DIMENSION, null, null, ghName, null, category, fetchLimit, false);
+                dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR, PRIOR_PREMIUM_DIMENSION, null, null, ghName, null, category, MATCH_METHOD_PRIOR, fetchLimit, false);
 
         // 退化:该 ghName 无数据 → 退回渠道粒度
         if (ghName != null && rows.isEmpty()) {
             rows = demandVideoMapperExt.selectForRecommend(
-                    dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR, PRIOR_PREMIUM_DIMENSION, null, null, null, null, category, fetchLimit, false);
+                    dt, channelName, crowdSegment, DEMAND_STRATEGY_PRIOR, PRIOR_PREMIUM_DIMENSION, null, null, null, null, category, MATCH_METHOD_PRIOR, fetchLimit, false);
         }
         // 跨渠道退化:channel_name 命中但 crowd_segment 在对侧 0 行 → 去 crowd_segment 拉通用数据
         if (channelName != null && rows.isEmpty()) {
             rows = demandVideoMapperExt.selectForRecommend(
-                    dt, channelName, null, DEMAND_STRATEGY_PRIOR, PRIOR_PREMIUM_DIMENSION, null, null, null, null, category, fetchLimit, false);
+                    dt, channelName, null, DEMAND_STRATEGY_PRIOR, PRIOR_PREMIUM_DIMENSION, null, null, null, null, category, MATCH_METHOD_PRIOR, fetchLimit, false);
         }
 
         // 近 7 日 rov 下限,过滤掉低质量近期表现的视频(0513 验证 ≥0.02 保留 ~41%)
@@ -1018,19 +1023,20 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
         int fetchLimit = Math.max(limit * 3, DEMAND_CANDIDATE_LIMIT);
 
         String category = StringUtils.hasText(param.getCategory()) ? param.getCategory() : null;
+        // posterior 池加 match_method='票圈推荐库' 兜底,防止未来上游对优质相似分量出别的 match_method 值后污染本池
         // 优质相似池:drive_dimension_time 一律不限制(含主查与退化路径),避免仅「昨日」窗口召回过少。
         List<ContentPlatformDemandVideo> rows = demandVideoMapperExt.selectForRecommend(
-                dt, channelName, crowdSegment, DEMAND_STRATEGY_POSTERIOR, null, null, null, ghName, null, category, fetchLimit, true);
+                dt, channelName, crowdSegment, DEMAND_STRATEGY_POSTERIOR, null, null, null, ghName, null, category, MATCH_METHOD_PRIOR, fetchLimit, true);
 
         // 退化:该 ghName 无数据 → 退回渠道粒度
         if (ghName != null && rows.isEmpty()) {
             rows = demandVideoMapperExt.selectForRecommend(
-                    dt, channelName, crowdSegment, DEMAND_STRATEGY_POSTERIOR, null, null, null, null, null, category, fetchLimit, true);
+                    dt, channelName, crowdSegment, DEMAND_STRATEGY_POSTERIOR, null, null, null, null, null, category, MATCH_METHOD_PRIOR, fetchLimit, true);
         }
         // 跨渠道退化:channel_name 命中但 crowd_segment 在对侧 0 行 → 去 crowd_segment 拉通用数据
         if (channelName != null && rows.isEmpty()) {
             rows = demandVideoMapperExt.selectForRecommend(
-                    dt, channelName, null, DEMAND_STRATEGY_POSTERIOR, null, null, null, null, null, category, fetchLimit, true);
+                    dt, channelName, null, DEMAND_STRATEGY_POSTERIOR, null, null, null, null, null, category, MATCH_METHOD_PRIOR, fetchLimit, true);
         }
 
         // 近 7 日 rov 下限,与 prior 池一致(cdjh 0514 验证 ≥0.02 保留 ~54%)
@@ -1915,6 +1921,7 @@ public class ContentPlatformPlanServiceImpl implements ContentPlatformPlanServic
             item.setUvRatio(video.getUvRatio());
             item.setTotalRov(video.getTotalRov());
             item.setSceneSumRov(video.getSceneSumRov());
+            item.setMatchMethod(video.getMatchMethod());
             result.add(item);
         }
         return result;

+ 3 - 0
api-module/src/main/resources/mapper/contentplatform/ext/ContentPlatformDemandVideoMapperExt.xml

@@ -122,6 +122,9 @@
         <if test="category != null and category != ''">
             AND category = #{category}
         </if>
+        <if test="matchMethod != null and matchMethod != ''">
+            AND match_method = #{matchMethod}
+        </if>
         <if test="excludeSelfTitle">
             AND (title IS NULL OR demand_content_title IS NULL OR title &lt;&gt; demand_content_title)
         </if>