wangyunpeng 5 dienas atpakaļ
vecāks
revīzija
a8d884d29f

+ 31 - 12
core/src/main/java/com/tzld/videoVector/job/ChannelDemandMatchJob.java

@@ -95,19 +95,31 @@ public class ChannelDemandMatchJob {
 
     // ============== 匹配结果默认值(固定文案) ==============
 
-    /** 匹配视频筛选-场景已看视频 */
+    /**
+     * 匹配视频筛选-场景已看视频
+     */
     private static final String VIDEO_FILTER_DIMENSION_STAT =
             "总UV占比大于0.2%&全局视频pv>10000&全局rov >0.03&品类排除:节日祝福、早中晚好";
-    /** 匹配视频筛选-人群需求·视频库_解构特征_向量相似匹配 */
+    /**
+     * 匹配视频筛选-人群需求·视频库_解构特征_向量相似匹配
+     */
     private static final String VIDEO_FILTER_CROWD_RECOMMEND = "相似度>=0.7&7日rov > 0.02";
-    /** 匹配视频筛选-优质相似·视频库_解构特征_向量相似匹配 */
+    /**
+     * 匹配视频筛选-优质相似·视频库_解构特征_向量相似匹配
+     */
     private static final String VIDEO_FILTER_QUALITY_SIM_RECOMMEND = "相似度>=0.7&近7天rov>0.02";
 
-    /** 匹配排序-场景已看视频 */
+    /**
+     * 匹配排序-场景已看视频
+     */
     private static final String SORT_DIMENSION_STAT = "人群rov";
-    /** 匹配排序-人群需求·视频库_解构特征_向量相似匹配 */
+    /**
+     * 匹配排序-人群需求·视频库_解构特征_向量相似匹配
+     */
     private static final String SORT_CROWD_RECOMMEND = "向量相似度+全局推荐rov";
-    /** 匹配排序-优质相似·视频库_解构特征_向量相似匹配 */
+    /**
+     * 匹配排序-优质相似·视频库_解构特征_向量相似匹配
+     */
     private static final String SORT_QUALITY_SIM_RECOMMEND = "向量相似度+全局推荐rov";
 
     /**
@@ -774,12 +786,18 @@ public class ChannelDemandMatchJob {
             return;
         }
 
+        // 按Apollo配置对增长的头部等维度执行分组TOP过滤
+        String channelName = config.getChannelName();
+        int beforeFilterCount = results.size();
+        List<ChannelDemandMatchResult> filteredResults = filterTopRovByGroup(results, channelName);
+        log.info("场景已看视频 渠道 {} 分组过滤后 {} -> {} 条", channelName, beforeFilterCount, filteredResults.size());
+
         // 批量写入
-        for (List<ChannelDemandMatchResult> partition : Lists.partition(results, 1000)) {
+        for (List<ChannelDemandMatchResult> partition : Lists.partition(filteredResults, 1000)) {
             resultMapperExt.batchInsert(partition);
         }
-        totalMatched.addAndGet(results.size());
-        log.info("场景已看视频数据源写入完成, 共 {} 条", results.size());
+        totalMatched.addAndGet(filteredResults.size());
+        log.info("场景已看视频数据源写入完成, 共 {} 条", filteredResults.size());
     }
 
     /**
@@ -827,7 +845,7 @@ public class ChannelDemandMatchJob {
         sb.append(" AND 总uv占比 > ").append(dimensionStatMinUvRatio);
         sb.append(" AND 总访问uv > 2000 AND 全局分发pv > 10000 ");
 //        sb.append(" AND `merge二级品类` not in ('早中晚好','节日祝福') ");
-        sb.append(" AND 维度 = '传播的头部' ");
+        sb.append(" AND 维度 in ('传播的头部', '增长的头部') ");
         // 渠道筛选
         if (StringUtils.hasText(config.getChannelName())) {
             sb.append(" AND 渠道类 = '").append(config.getChannelName().replace("'", "''")).append("'");
@@ -839,11 +857,12 @@ public class ChannelDemandMatchJob {
 
     /**
      * 对单个维度执行ODPS查询并返回需求列表
+     *
      * @param dimension 单个维度值,传null表示不加维度过滤
      */
     private List<ChannelDemandMatchResult> queryDemandsForDimension(ChannelDemandMatchConfig config, String dt,
-                                                                     int minUv, double minRov, String dimension,
-                                                                     String channelName, AtomicInteger producedCount) {
+                                                                    int minUv, double minRov, String dimension,
+                                                                    String channelName, AtomicInteger producedCount) {
         String sql = buildDemandSql(config, dt, minUv, minRov, dimension);
         log.info("查询ODPS需求, 渠道: {}, dimension: {}, sql长度: {}", channelName, dimension, sql.length());