|
|
@@ -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());
|
|
|
|