|
|
@@ -8904,7 +8904,7 @@ private void runMigration100() {
|
|
|
log.warn("插入admin_menu种子数据失败: {}", ex.getMessage());
|
|
|
}
|
|
|
|
|
|
- // 迁移231: 画像驱动推荐 - member_profile_dimension + article/activity_dimension_mapping 表
|
|
|
+ // 迁移231: 画像驱动推荐 - member_profile_dimension 表
|
|
|
try {
|
|
|
jdbcTemplate.execute(
|
|
|
"CREATE TABLE IF NOT EXISTS member_profile_dimension (" +
|
|
|
@@ -8928,75 +8928,43 @@ private void runMigration100() {
|
|
|
} catch (Exception ex) {
|
|
|
log.warn("创建member_profile_dimension表失败: {}", ex.getMessage());
|
|
|
}
|
|
|
- try {
|
|
|
- jdbcTemplate.execute(
|
|
|
- "CREATE TABLE IF NOT EXISTS article_dimension_mapping (" +
|
|
|
- "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
- "article_id BIGINT NOT NULL, " +
|
|
|
- "dimension_code VARCHAR(50) NOT NULL, " +
|
|
|
- "match_score INT DEFAULT 50 COMMENT '关联度 0-100', " +
|
|
|
- "match_reason VARCHAR(200) COMMENT '关联原因', " +
|
|
|
- "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
- "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
- "INDEX idx_article_dim (article_id, dimension_code), " +
|
|
|
- "INDEX idx_dim_article (dimension_code, match_score)" +
|
|
|
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章-维度映射'"
|
|
|
- );
|
|
|
- log.info("已创建article_dimension_mapping表");
|
|
|
- } catch (Exception ex) {
|
|
|
- log.warn("创建article_dimension_mapping表失败: {}", ex.getMessage());
|
|
|
- }
|
|
|
- try {
|
|
|
- jdbcTemplate.execute(
|
|
|
- "CREATE TABLE IF NOT EXISTS activity_dimension_mapping (" +
|
|
|
- "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
- "activity_id BIGINT NOT NULL, " +
|
|
|
- "dimension_code VARCHAR(50) NOT NULL, " +
|
|
|
- "match_score INT DEFAULT 50 COMMENT '关联度 0-100', " +
|
|
|
- "match_reason VARCHAR(200) COMMENT '关联原因', " +
|
|
|
- "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
- "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
|
|
|
- "INDEX idx_activity_dim (activity_id, dimension_code), " +
|
|
|
- "INDEX idx_dim_activity (dimension_code, match_score)" +
|
|
|
- ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动-维度映射'"
|
|
|
- );
|
|
|
- log.info("已创建activity_dimension_mapping表");
|
|
|
- } catch (Exception ex) {
|
|
|
- log.warn("创建activity_dimension_mapping表失败: {}", ex.getMessage());
|
|
|
- }
|
|
|
|
|
|
// 迁移232: recommendation_logs 追加 recommend_type 字段
|
|
|
ensureColumn("recommendation_logs", "recommend_type", "VARCHAR(20) DEFAULT 'tag' COMMENT '推荐方式: profile/dimension/tag'");
|
|
|
log.info("已添加recommendation_logs.recommend_type列");
|
|
|
|
|
|
- // 迁移233: Article/Activity 维度映射一次性迁移(从现有字段导入)
|
|
|
+ // 迁移233: 将 Article/Activity 现有 dimension_weights JSON 同步到 dimension_weights 表
|
|
|
try {
|
|
|
jdbcTemplate.execute(
|
|
|
- "INSERT IGNORE INTO article_dimension_mapping (article_id, dimension_code, match_score, match_reason) " +
|
|
|
- "SELECT id, 'body', COALESCE(JSON_EXTRACT_CAST(dimension_weights, '$.body'), 50), CONCAT('自动迁移: 文章原始维度配置') " +
|
|
|
- "FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT_CAST(dimension_weights, '$.body') IS NOT NULL " +
|
|
|
+ "INSERT IGNORE INTO dimension_weights (target_type, target_id, dimension, weight, enabled) " +
|
|
|
+ "SELECT 'article', id, 'body', COALESCE(CAST(JSON_EXTRACT(dimension_weights, '$.body') AS SIGNED), 0), 1 " +
|
|
|
+ "FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT(dimension_weights, '$.body') IS NOT NULL " +
|
|
|
"UNION ALL " +
|
|
|
- "SELECT id, 'mind', COALESCE(JSON_EXTRACT_CAST(dimension_weights, '$.mind'), 50), '自动迁移' FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT_CAST(dimension_weights, '$.mind') IS NOT NULL " +
|
|
|
+ "SELECT 'article', id, 'mind', COALESCE(CAST(JSON_EXTRACT(dimension_weights, '$.mind') AS SIGNED), 0), 1 " +
|
|
|
+ "FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT(dimension_weights, '$.mind') IS NOT NULL " +
|
|
|
"UNION ALL " +
|
|
|
- "SELECT id, 'wisdom', COALESCE(JSON_EXTRACT_CAST(dimension_weights, '$.wisdom'), 50), '自动迁移' FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT_CAST(dimension_weights, '$.wisdom') IS NOT NULL " +
|
|
|
+ "SELECT 'article', id, 'wisdom', COALESCE(CAST(JSON_EXTRACT(dimension_weights, '$.wisdom') AS SIGNED), 0), 1 " +
|
|
|
+ "FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT(dimension_weights, '$.wisdom') IS NOT NULL " +
|
|
|
"UNION ALL " +
|
|
|
- "SELECT id, 'action', COALESCE(JSON_EXTRACT_CAST(dimension_weights, '$.action'), 50), '自动迁移' FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT_CAST(dimension_weights, '$.action') IS NOT NULL " +
|
|
|
+ "SELECT 'article', id, 'action', COALESCE(CAST(JSON_EXTRACT(dimension_weights, '$.action') AS SIGNED), 0), 1 " +
|
|
|
+ "FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT(dimension_weights, '$.action') IS NOT NULL " +
|
|
|
"UNION ALL " +
|
|
|
- "SELECT id, 'wealth', COALESCE(JSON_EXTRACT_CAST(dimension_weights, '$.wealth'), 50), '自动迁移' FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT_CAST(dimension_weights, '$.wealth') IS NOT NULL"
|
|
|
+ "SELECT 'article', id, 'wealth', COALESCE(CAST(JSON_EXTRACT(dimension_weights, '$.wealth') AS SIGNED), 0), 1 " +
|
|
|
+ "FROM article WHERE dimension_weights IS NOT NULL AND dimension_weights != '' AND JSON_EXTRACT(dimension_weights, '$.wealth') IS NOT NULL"
|
|
|
);
|
|
|
- log.info("已完成article_dimension_mapping一次性迁移");
|
|
|
+ log.info("已完成article维度权重到dimension_weights表的一次性迁移");
|
|
|
} catch (Exception ex) {
|
|
|
- log.warn("article维度映射迁移失败(可能MySQL版本不支持JSON_EXTRACT_CAST): {}", ex.getMessage());
|
|
|
+ log.warn("article维度迁移失败: {}", ex.getMessage());
|
|
|
}
|
|
|
try {
|
|
|
jdbcTemplate.execute(
|
|
|
- "INSERT IGNORE INTO activity_dimension_mapping (activity_id, dimension_code, match_score, match_reason) " +
|
|
|
- "SELECT id, dimension_code, COALESCE(CAST(dimension_weights AS UNSIGNED), 50), '自动迁移' " +
|
|
|
+ "INSERT IGNORE INTO dimension_weights (target_type, target_id, dimension, weight, enabled) " +
|
|
|
+ "SELECT 'activity', id, dimension_code, COALESCE(CAST(dimension_weights AS SIGNED), 50), 1 " +
|
|
|
"FROM activity WHERE dimension_code IS NOT NULL AND dimension_code != '' AND dimension_weights IS NOT NULL"
|
|
|
);
|
|
|
- log.info("已完成activity_dimension_mapping一次性迁移");
|
|
|
+ log.info("已完成activity维度权重到dimension_weights表的一次性迁移");
|
|
|
} catch (Exception ex) {
|
|
|
- log.warn("activity维度映射迁移失败: {}", ex.getMessage());
|
|
|
+ log.warn("activity维度迁移失败: {}", ex.getMessage());
|
|
|
}
|
|
|
}
|
|
|
}
|