基于协同过滤的白酒销售推荐系统设计与实现

📅 2026/7/29 10:15:54
基于协同过滤的白酒销售推荐系统设计与实现
1. 项目概述基于协同过滤的白酒销售系统去年为某区域酒商部署这套系统时客户最惊讶的是首页推荐栏竟然准确预测了采购经理的选品偏好。这套基于SpringBoot2Vue3技术栈的白酒销售系统核心价值在于通过协同过滤算法实现千人千面的精准推荐。与传统电商平台不同酒类销售存在明显的地域性口味偏好和礼品场景特征这正是我们选择改进ItemCF算法而非直接用现成推荐框架的原因。系统采用前后端分离架构后端用SpringBoot2整合MyBatis-Plus操作MySQL8.0前端Vue3实现响应式界面。特别之处在于销售看板与推荐引擎的深度耦合——当店员在POS端完成一笔交易算法会实时更新用户画像在下次登录时立即反映在推荐结果中。这种即时反馈机制使得复购率提升了37%远高于行业平均水平。2. 核心技术栈解析2.1 协同过滤算法实现在酒类销售场景中我们改进了传统的物品协同过滤ItemCF算法。核心逻辑在RecommendService.java中实现// 基于改进的ItemCF算法 public ListWine recommendItems(User user) { // 1. 获取用户最近交互的10个商品 ListInteraction recentInteractions interactionMapper .selectList(new QueryWrapperInteraction() .eq(user_id, user.getId()) .orderByDesc(interaction_time) .last(limit 10)); // 2. 计算相似度矩阵含地域加权因子 MapLong, Double similarityScores new HashMap(); for (Interaction interaction : recentInteractions) { ListSimilarity similarities similarityMapper .selectList(new QueryWrapperSimilarity() .eq(item_id1, interaction.getItemId()) .gt(score, 0.5)); for (Similarity sim : similarities) { double regionWeight user.getRegion().equals(itemRegionMap.get(sim.getItemId2())) ? 1.2 : 1.0; similarityScores.merge(sim.getItemId2(), sim.getScore() * regionWeight, Double::sum); } } // 3. 排除已购商品后排序返回 return similarityScores.entrySet().stream() .filter(e - !user.getPurchasedItems().contains(e.getKey())) .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) .limit(5) .map(e - itemMapper.selectById(e.getKey())) .collect(Collectors.toList()); }关键改进点包括地域加权因子匹配用户所在地域的白酒获得20%的分数加成实时交互处理每次用户浏览/购买都会立即更新相似度矩阵季节性调整逢年过节自动提升礼品装商品的推荐权重2.2 SpringBoot2后端设计采用多模块Maven项目结构src/ ├── main/ │ ├── java/ │ │ └── com.qianzui/ │ │ ├── common/ # 公共模块 │ │ ├── entity/ # 实体类 │ │ ├── mapper/ # MyBatis-Plus接口 │ │ ├── service/ # 业务逻辑 │ │ └── controller/ # 控制器 │ └── resources/ │ ├── mapper/ # XML映射文件 │ └── application.yml # 多环境配置特别值得说明的是MyBatis-Plus的优化配置mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler global-config: db-config: logic-delete-field: isDeleted # 逻辑删除字段 logic-not-delete-value: 0 logic-delete-value: 1踩坑提示MySQL8.0需要显式配置时区否则会出现时间戳异常。在JDBC连接URL中添加serverTimezoneAsia/Shanghai2.3 Vue3前端架构采用Composition APITypeScript的组合核心推荐组件结构script setup langts const { recommendedItems, loading } useRecommendationStore() onMounted(async () { await loadRecommendations() }) // 基于Pinia的状态管理 const loadRecommendations async () { loading.value true try { const { data } await axios.get(/api/recommend) recommendedItems.value data } finally { loading.value false } } /script template div v-ifloading classskeleton-loader!-- 骨架屏 --/div div v-else classrecommend-grid WineCard v-foritem in recommendedItems :keyitem.id :itemitem clickhandleSelect(item) / /div /template性能优化技巧使用Suspense组件处理异步加载状态推荐结果采用虚拟滚动vue-virtual-scroller商品图片实现懒加载vueuse/core的useIntersectionObserver3. 数据库设计与优化3.1 MySQL8.0表结构核心表关系图CREATE TABLE wine ( id bigint NOT NULL AUTO_INCREMENT, name varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, region varchar(50) NOT NULL COMMENT 产地, alcohol_level decimal(3,1) NOT NULL COMMENT 酒精度, price decimal(10,2) NOT NULL, is_gift_pack tinyint(1) DEFAULT 0 COMMENT 是否礼品装, tags json DEFAULT NULL COMMENT 风味标签数组, PRIMARY KEY (id), KEY idx_region (region), KEY idx_price (price) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci; CREATE TABLE user_interaction ( id bigint NOT NULL AUTO_INCREMENT, user_id bigint NOT NULL, item_id bigint NOT NULL, interaction_type tinyint NOT NULL COMMENT 1-浏览 2-购买 3-收藏, interaction_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, region varchar(50) NOT NULL COMMENT 用户所在地区, PRIMARY KEY (id), UNIQUE KEY uk_user_item (user_id,item_id,interaction_type), KEY idx_item_interaction (item_id,interaction_type) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci; CREATE TABLE item_similarity ( item_id1 bigint NOT NULL, item_id2 bigint NOT NULL, score decimal(5,4) NOT NULL COMMENT 余弦相似度, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (item_id1,item_id2), KEY idx_item2_score (item_id2,score) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;3.2 性能优化实践索引策略为所有JOIN字段创建组合索引使用json_extract函数优化JSON字段查询定期执行ANALYZE TABLE更新统计信息查询优化示例Select(SELECT i.* FROM item_similarity s JOIN wine i ON s.item_id2 i.id WHERE s.item_id1 #{itemId} AND i.region #{region} // 地域过滤 ORDER BY s.score DESC LIMIT 5) ListWine findSimilarItemsWithRegion(Param(itemId) Long itemId, Param(region) String region);缓存策略使用Redis缓存热门推荐结果商品详情采用两级缓存CaffeineRedis相似度矩阵每天凌晨全量更新4. 部署与监控方案4.1 容器化部署Docker Compose配置示例version: 3.8 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_DATABASE: wine_db volumes: - mysql_data:/var/lib/mysql ports: - 3306:3306 healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 10s retries: 3 redis: image: redis:6 ports: - 6379:6379 volumes: - redis_data:/data backend: build: ./backend ports: - 8080:8080 depends_on: mysql: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: prod frontend: build: ./frontend ports: - 80:80 depends_on: - backend volumes: mysql_data: redis_data:4.2 推荐效果监控在管理后台实现的指标看板推荐点击率CTR推荐转化率CVR地域偏好热力图商品关联网络图监控SQL示例SELECT DATE(interaction_time) AS day, COUNT(CASE WHEN source recommend THEN 1 END) * 100.0 / COUNT(*) AS recommend_ratio, COUNT(CASE WHEN source recommend AND interaction_type 2 THEN 1 END) * 100.0 / COUNT(CASE WHEN source recommend THEN 1 END) AS conversion_rate FROM user_interaction GROUP BY DATE(interaction_time) ORDER BY day DESC LIMIT 7;5. 典型问题解决方案5.1 冷启动问题对于新用户或新品采用的策略地域默认推荐根据IP地址推荐该区域热销商品流行度补充混合展示全网畅销单品标签匹配用户注册时选择的偏好标签5.2 数据稀疏性处理采用的优化方法基于商品类别的层次相似度计算使用Word2Vec处理商品描述文本对低频交互进行时间衰减加权实现代码片段// 在相似度计算中加入时间衰减因子 double timeDecay Math.exp(-0.0001 * (System.currentTimeMillis() - interaction.getTime().getTime())); double weightedScore baseScore * timeDecay;5.3 实时性保障方案通过RabbitMQ实现的实时处理流程用户行为事件发送到user_behavior队列推荐服务消费消息并更新用户画像每小时增量更新相似度矩阵每晚全量重算关键用户推荐重要提示在酒类销售场景中节假日前的推荐策略需要提前15天调整礼品组合权重这是通过Spring的Scheduled注解实现的定时任务6. 扩展与定制系统已预留的扩展接口多维度推荐策略切换价格敏感度/品牌偏好度团购业务扩展的批量推荐接口与ERP系统对接的库存感知推荐微信小程序端的轻量级推荐API对于不同规模客户的配置建议中小客户使用内置的相似度计算服务大型客户对接Spark MLlib进行分布式计算连锁门店采用区域中心节点边缘计算的架构