**非單一技術**,而是 **「標識用戶 → 采集行為 → 建模畫像 → 實時推薦」** 完整鏈路。
| 層級 | 技術 | 作用 | 典型方案 |
|---|---|---|---|
| 用戶標識 | Cookie (第一方/第三方) | 跨會話、跨頁面識別同一瀏覽器 | `_ga`, `_fbp`, `session_id`, `user_uuid` (HttpOnly + Secure + SameSite=Lax) |
| LocalStorage / IndexedDB | 存儲更大、不隨請求發送、可存設備指紋 | 設備指紋、偏好設定、離線數據 | |
| 登錄態 (User ID) | 最高精度,關聯後台業務數據 | JWT / Session ID + Redis | |
| 行為采集 | 埋點 SDK (JS/移動端) | 頁面浏覽、點擊、停留、搜索、加購 | Google Analytics, Mixpanel, 自建 `track.gif?event=...` |
| 畫像構建 | 實時/離線計算 | 標簽化:興趣、意圖、價值、生命週期 | Flink/Spark Streaming + HBase/Redis + 標簽體系 |
| 推薦服務 | 召回 → 粗排 → 精排 → 重排 | 毫秒級返回「常去/猜你喜歡」列表 | Faiss/Annoy (向量檢索) + LightGBM/XGBoost (CTR預估) |
// 後端 API: GET /api/user/frequent-sites?userId=xxx&limit=10
public List getFrequentSites(Long userId) {
// 1. 讀取用戶最近 30 天訪問日志 (ClickHouse / Elasticsearch)
List logs = visitLogRepo.findByUserIdAndTimeRange(userId, now.minusDays(30));
// 2. 聚合統計
Map statMap = logs.stream()
.collect(Collectors.groupingBy(VisitLog::getSiteDomain,
Collectors.collectingAndThen(Collectors.toList(), list -> {
SiteStat s = new SiteStat();
s.domain = list.get(0).getSiteDomain();
s.name = list.get(0).getSiteName();
s.visitCount = list.size();
s.lastVisit = list.stream().max(Comparator.comparing(VisitLog::getTime)).get().getTime();
s.avgStaySeconds = (int) list.stream().mapToLong(VisitLog::getStaySeconds).average().orElse(0);
return s;
})));
// 3. 綜合評分: 訪問頻次 * 0.6 + 最近度 * 0.3 + 停留時長 * 0.1
return statMap.values().stream()
.sorted(Comparator.comparingDouble(s ->
s.visitCount * 0.6 +
(1.0 / (1 + ChronoUnit.DAYS.between(s.lastVisit, LocalDate.now()))) * 0.3 +
Math.log1p(s.avgStaySeconds) * 0.1).reversed())
.limit(10)
.map(s -> new SiteVO(s.domain, s.name, s.visitCount))
.collect(Collectors.toList());
}
**Cookie 只是「身份證」,推薦系統才是「大腦」**。現代實現:埋點采集 → 實時流計算畫像 → 向量檢索 + 模型精排 → API 下發 → 前端渲染。單靠 Cookie 無法實現智能「常去網站」推薦。