1. 项目概述:基于协同过滤的重庆旅游推荐系统
这个项目是我去年为重庆本地一家旅游服务平台开发的智能推荐系统,核心目标是通过分析用户历史行为数据,为游客个性化推荐重庆地区的旅游景点。系统采用前后端分离架构,前端使用Vue.js+Element UI构建响应式界面,后端基于Spring Boot实现推荐算法和API服务,数据层使用MySQL存储结构化数据,Redis作为缓存加速推荐结果获取。
在实际运营中,这套系统将用户对景点的点击、收藏、评分等行为转化为用户-物品交互矩阵,通过协同过滤算法挖掘用户潜在兴趣。与简单的内容推荐不同,协同过滤能发现"用户不知道但可能会喜欢"的景点,比如通过分析发现喜欢洪崖洞的用户也常对长江索道感兴趣,这种隐性关联是传统分类推荐难以捕捉的。
关键设计原则:推荐结果既要保证准确性(用户确实感兴趣),又要保持多样性(避免推荐同质化景点),同时控制计算复杂度以保证实时响应。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体架构设计
系统采用典型的三层架构:
- 表现层:Vue 3组合式API开发,Element Plus组件库
- 业务层:Spring Boot 2.7 + MyBatis-Plus
- 数据层:MySQL 8.0主从集群 + Redis 7缓存
mermaid复制graph TD
A[用户端] -->|HTTP请求| B[Nginx]
B -->|API路由| C[Spring Cloud Gateway]
C -->|推荐请求| D[Recommend Service]
C -->|用户行为| E[Behavior Collect Service]
D --> F[Redis Cluster]
D --> G[MySQL Cluster]
E --> H[Kafka]
H --> I[Flink实时计算]
2.2 关键技术选型考量
-
Vue.js选择理由:
- 响应式编程模型适合频繁更新的推荐结果展示
- 组件化开发便于复用评分、景点卡片等UI元素
- 丰富的生态系统(Vue Router、Pinia等)
-
协同过滤算法选型:
- 用户基础协同过滤(UserCF):适合用户量大的场景
- 物品基础协同过滤(ItemCF):适合物品稳定的场景
- 最终采用混合模式:新用户用ItemCF,老用户用UserCF
-
数据库设计:
sql复制CREATE TABLE `user_behavior` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` varchar(32) NOT NULL, `spot_id` int NOT NULL, `behavior_type` tinyint COMMENT '1-浏览 2-收藏 3-评分', `rating` decimal(3,1) DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user_spot` (`user_id`,`spot_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 数据工程实现
3.1 数据采集方案
我们通过三种渠道获取初始数据:
-
公开平台爬取(合规前提下):
- 使用Python+Scrapy爬取携程、美团等平台的景点数据
- 关键字段:景点名称、坐标、标签、评分、评论数
- 反爬策略:动态UserAgent+IP代理池+请求间隔控制
-
人工校验补充:
- 对爬取数据人工核对坐标准确性
- 补充官方闭园时间、特殊活动等信息
-
用户行为埋点:
javascript复制// 前端埋点示例 export const trackBehavior = (userId, spotId, eventType) => { navigator.sendBeacon('/log', JSON.stringify({ userId, spotId, eventType, timestamp: Date.now() })); };
