1. 项目背景与核心价值

鲜花电商行业近年来呈现爆发式增长,但同质化竞争严重。传统鲜花店铺线上化过程中,普遍面临"商品展示有余,精准推荐不足"的痛点。我们团队为某连锁鲜花品牌开发的这套推荐系统,上线后使客户复购率提升37%,客单价提高22%。

这个基于SpringBoot和协同过滤算法的推荐引擎,核心解决了三个业务问题:

  • 新客户面对数百种花束无从选择
  • 老客户重复购买相同花束缺乏新鲜感
  • 季节性商品和库存周转的平衡难题

2. 系统架构设计

2.1 技术栈选型

后端采用SpringBoot 2.7 + MyBatis Plus组合,主要考虑因素:

  • 快速迭代:鲜花行业营销活动频繁,需要快速响应需求变更
  • 高并发处理:情人节等高峰时段QPS可达800+
  • 与现有ERP系统无缝集成

数据库使用MySQL 8.0配合Redis缓存:

CREATE TABLE user_behavior (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  user_id BIGINT NOT NULL,
  item_id BIGINT NOT NULL,
  behavior_type TINYINT COMMENT '1浏览 2收藏 3购买',
  behavior_time DATETIME,
  INDEX idx_user (user_id),
  INDEX idx_item (item_id)
);

2.2 推荐引擎设计

采用混合推荐策略:

  1. 新客冷启动阶段:基于商品标签的Content-Based推荐
  2. 常规场景:改进的Item-CF协同过滤
  3. 特殊场景:实时点击流补充推荐

核心算法实现:

// 相似度计算示例
public double cosineSimilarity(Map<Long, Double> vec1, Map<Long, Double> vec2) {
    double dotProduct = 0.0;
    double norm1 = 0.0;
    double norm2 = 0.0;
    
    for (Long key : vec1.keySet()) {
        if (vec2.containsKey(key)) {
            dotProduct += vec1.get(key) * vec2.get(key);
        }
        norm1 += Math.pow(vec1.get(key), 2);
    }
    
    for (Double value : vec2.values()) {
        norm2 += Math.pow(value, 2);
    }
    
    return dotProduct / (Math.sqrt(norm1) * Math.sqrt(norm2));
}

3. 关键实现细节

3.1 数据预处理管道

用户行为数据ETL流程:

  1. 实时采集:使用Kafka接收前端埋点数据
  2. 特征工程:
    • 时间衰减因子: weight = 1/(1+log(小时差))
    • 行为权重:浏览1分,收藏3分,购买5分
  3. 数据增强:合并天气、节假日等外部数据

重要提示:鲜花品类具有强时效性,需要设置7天的滑动时间窗口,超过该窗口的行为数据应降权处理

3.2 推荐结果生成

分阶段推荐策略实现:

public List<RecommendItem> generateRecommend(Long userId) {
    // 阶段1:实时行为补充
    List<RecommendItem> realtimeItems = realtimeService.getRecentItems(userId);
    
    // 阶段2:常规推荐
    List<RecommendItem> cfItems = cfService.recommend(userId);
    
    // 阶段3:多样性保障
    List<RecommendItem> diverseItems = diversityService.supplement(cfItems);
    
    return mergeStrategy.merge(realtimeItems, cfItems, diverseItems);
}

3.3 性能优化方案

  1. 离线计算:

    • 每日凌晨使用Spark计算全量商品相似度矩阵
    • 分段存储相似度结果,按相似度降序保留Top50
  2. 在线服务:

    • 使用Guava LoadingCache缓存用户最近推荐结果
    • 采用布隆过滤器过滤已购买商品
  3. AB测试框架:

# 伪代码示例
def ab_test(recommend_list):
    control_group = apply_baseline_algorithm()
    test_group = apply_new_algorithm()
    
    monitor_metrics = [
        'click_rate', 
        'conversion_rate',
        'avg_order_value'
    ]
    
    return calculate_significance(control_group, test_group, monitor_metrics)

4. 业务效果与调优

4.1 核心指标对比

指标 上线前 上线后 提升幅度
转化率 2.3% 3.7% +60.8%
客单价(元) 158 193 +22.1%
复购周期(天) 45 28 -37.8%

4.2 典型问题排查

  1. 节日流量突增时的服务降级:

    • 问题现象:情人节当天API响应时间从200ms飙升到2s
    • 解决方案:
      • 提前预热缓存
      • 限流降级策略
      • 静态化兜底推荐结果
  2. 相似商品过度集中:

    • 问题现象:推荐列表出现多款相似玫瑰花束
    • 改进方案:
      • 引入品类多样性约束
      • 添加价格带分布控制
      • 混合搭配推荐(主花+配花组合)

5. 部署与监控方案

5.1 容器化部署

Docker Compose配置示例:

version: '3'
services:
  recommender:
    image: flower-recommender:1.2.0
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    ports:
      - "8080:8080"
    depends_on:
      - redis
      - mysql

  redis:
    image: redis:6.2-alpine
    ports:
      - "6379:6379"

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - ./mysql-data:/var/lib/mysql

5.2 监控指标配置

Prometheus监控重点指标:

  • 推荐响应时间P99
  • 缓存命中率
  • 推荐结果点击率
  • 算法覆盖率(推荐商品占全量商品比例)

Grafana看板应包含:

  1. 实时推荐质量仪表盘
  2. 算法效果对比视图
  3. 系统健康状态监控

6. 扩展优化方向

在实际运营中,我们发现三个值得深化的优化点:

  1. 视觉推荐增强:通过CNN提取花束图像特征,补充基于视觉的相似度计算
  2. 情境感知推荐:结合LBS信息,在母亲节等特殊日期推荐附近可配送的康乃馨
  3. 供应链协同:根据推荐热度预测调整采购计划,降低库存周转天数

这套系统经过6个月迭代,目前日均处理推荐请求120万次,关键接口响应时间稳定在150ms以内。特别提醒:在实现相似度计算时,务必对鲜花品类建立专属的特征权重体系,比如花期属性应该比颜色属性具有更高的权重系数。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐