推荐系统听起来很高大上——深度学习、Embedding、实时特征工程——但对于一个月活几十万的电商系统,用UserCF(基于用户的协同过滤)加上标签匹配,已经能满足80%的推荐场景。关键是落地,不是炫技。

一、两种推荐策略的组合

我采用的策略是协同过滤为主,标签匹配为补充

  • 协同过滤:找到与当前用户行为相似的用户群体,推荐他们也喜欢的商品。适用于有足够行为数据的活跃用户。
  • 标签匹配:基于商品标签与用户历史偏好标签的匹配度推荐。适用于新用户或行为数据不足的冷启动场景。

两者混合推荐:协同过滤结果占70%权重,标签匹配结果占30%,最终按加权分数排序。

二、UserCF的实现

核心流程三步走:

第一步:构建用户-商品评分矩阵。

从订单表和浏览记录中提取隐式反馈数据。购买权重设为5,加购物车3,浏览1,未发生行为的为0。

第二步:计算用户相似度。

用余弦相似度计算两个用户之间的行为相似性

public double cosineSimilarity(Map<Long, Double> userA, Map<Long, Double> userB) {
    double dotProduct = userA.entrySet().stream()
        .filter(e -> userB.containsKey(e.getKey()))
        .mapToDouble(e -> e.getValue() * userB.get(e.getKey()))
        .sum();

    double normA = Math.sqrt(userA.values().stream().mapToDouble(v -> v * v).sum());
    double normB = Math.sqrt(userB.values().stream().mapToDouble(v -> v * v).sum());

    return normA == 0 || normB == 0 ? 0 : dotProduct / (normA * normB);
}

实际生产中不会实时计算所有用户对的相似度——O(n²)的复杂度扛不住。做法是只计算与当前用户有过共同商品交互的"候选邻居用户",把计算范围从全量用户降到几百个。

第三步:推荐生成。

找到Top-K个最相似用户,汇总他们的高评分商品(当前用户未购买过的),按加权分数排序取Top-N。

三、标签匹配的冷启动策略

新用户没有行为数据,协同过滤失效。这时用标签匹配顶上:根据用户在注册时选择的兴趣标签、或者落地页来源,匹配对应标签的商品。

标签体系设计示例:

{
  "productId": 10001,
  "tags": [
    {"name": "数码", "weight": 1.0},
    {"name": "手机配件", "weight": 0.8},
    {"name": "蓝牙", "weight": 0.9},
    {"name": "性价比", "weight": 0.6}
  ]
}

用户行为也会反向更新其偏好标签权重——用户多次浏览"蓝牙"标签的商品,该标签在用户画像中的权重自动提升。

四、推荐结果的后处理

原始推荐结果可能出现同一品牌的商品扎堆、价格分布不均等问题。后处理环节做以下优化:

  • 多样性打散:同一类目/品牌的商品限制出现次数,强制插入跨类目的探索性推荐。
  • 价格过滤:如果用户从未购买过单价超过500元的商品,推荐结果中过滤高价商品。
  • 已购去重:已购买商品从推荐列表中移除。

五、性能与更新策略

用户行为数据和相似度矩阵不需要实时计算。定时任务每天凌晨跑一次全量计算,结果写入Redis或MySQL推荐结果表。API接口直接从缓存中读取,响应时间控制在50ms以内。

// 从推荐缓存中直接读取
String cacheKey = "recommend:user:" + userId;
List<ProductDTO> recommendations = redisTemplate.opsForValue().get(cacheKey);

如果行为数据变化频繁,可以加入准实时增量更新:新行为产生后,不重算全部相似度,只更新该用户的邻居用户列表和推荐结果。

推荐系统的落地需要一个完整的电商底座来验证效果。CRMEB的Java版可以作为搭建推荐引擎的业务基础,直接在其商品和订单数据上构建推荐层。此外,CRMEB在用户行为数据采集方面的埋点方案也值得参考。


SEO小贴士

  • 核心关键词:Java商城推荐系统、协同过滤Java实现、电商推荐算法、Spring Boot推荐引擎
  • 长尾词:余弦相似度计算、标签匹配推荐、用户画像构建、冷启动策略
  • 内容优势:给出可直接运行的余弦相似度Java代码,比纯理论文章更实用
  • 搜索意图:用户搜"电商推荐系统"时分两类——想看深度学习方案的和想找可落地简单方案的,本文覆盖后者

更多推荐