在现代电商平台中,向量聚类自动聚合 和 动态套餐推荐算法 是提升商品组织效率与转化率的核心能力。借助 Elasticsearch 的 向量搜索(kNN) 与机器学习能力,我们可以实现:
- 自动发现语义相似的商品并聚合成 SPU;
- 用户浏览或选择商品时,实时推荐“常一起购买”的套餐。
本文将为你提供 Elasticsearch 向量聚类自动聚合 与 动态套餐推荐算法 的完整详细设计方案。
一、向量聚类自动聚合(Vector-based Clustering for SPU)
1. 目标
- 不依赖人工规则,自动识别语义相似的商品(如不同颜色/容量的 iPhone);
- 将其聚合成一个 SPU,用于搜索去重与统一展示;
- 支持新商品上线后自动归类。
2. 技术架构
商品文本 → 文本向量化 → 写入 ES 向量字段 → kNN 搜索 → 聚类 → 生成 SPU
3. 数据建模:添加向量字段
PUT /product-catalog/_mapping
{
"properties": {
"title_vector": {
"type": "dense_vector",
"dims": 384,
"index": true,
"similarity": "cosine"
},
"spu_id": { "type": "keyword" },
"product_type": { "type": "keyword" }
}
}
✅
dims=384:使用轻量级模型(如all-MiniLM-L6-v2)
✅similarity: cosine:适合文本相似度计算
4. 文本向量化流程
步骤 1:构造输入文本
def build_text(sku):
return f"{sku['brand']} {sku['category']} {sku['title']} {' '.join([f'{s['name']}:{s['value']}' for s in sku['specifications']])}"
示例:
"Apple 手机 iPhone 15 Pro 型号:iPhone 15 Pro 颜色:白色 容量:256GB"
步骤 2:使用 Sentence-BERT 模型生成向量
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
vector = model.encode("Apple 手机 iPhone 15 Pro ...")
步骤 3:写入 Elasticsearch
POST /product-catalog/_doc/sku_1001
{
"title": "iPhone 15 Pro 256GB 白色",
"brand": "Apple",
"specifications": [...],
"title_vector": [0.12, -0.45, ..., 0.78] // 384维
}
5. 聚类算法:基于 kNN 的自动聚合
方案一:实时 kNN 搜索(轻量级)
当新商品写入时,查找最相似的 K 个商品:
POST /product-catalog/_knn_search
{
"knn": {
"field": "title_vector",
"query_vector": [0.12, -0.45, ..., 0.78],
"k": 5,
"num_candidates": 50
},
"query": {
"bool": {
"filter": [
{ "term": { "brand": "Apple" } },
{ "term": { "category_path": "手机" } }
]
}
}
}
- 如果最近邻的相似度 > 0.9(余弦),则归入其
spu_id; - 否则创建新 SPU。
方案二:批量聚类(离线)
使用 K-Means / DBSCAN 对全量商品向量聚类:
from sklearn.cluster import DBSCAN
import numpy as np
vectors = es.search(index="product-catalog", _source=["title_vector"])["hits"]["hits"]
X = np.array([hit["_source"]["title_vector"] for hit in vectors])
clustering = DBSCAN(eps=0.3, min_samples=2, metric='cosine').fit(X)
labels = clustering.labels_
# label == -1 表示噪声(无聚合)
for i, label in enumerate(labels):
if label != -1:
update_spu_id(doc_id[i], f"spu_cluster_{label}")
✅ 每天凌晨执行一次,更新
spu_id字段。
6. 聚合结果应用
- 更新所有匹配 SKU 的
spu_id; - 生成 SPU 汇总文档(见前文);
- 标记主图 SKU(销量最高);
- 支持人工审核与调整。
7. 优化建议
| 优化点 | 说明 |
|---|---|
| 分层聚类 | 先按 brand + category 过滤,再做向量聚类 |
| 混合特征 | 向量 = 0.7×文本 + 0.3×类目/品牌 one-hot |
| 增量更新 | 新商品实时聚类,老数据定期重聚类 |
| 相似度阈值 | 可配置 similarity_threshold: 0.85~0.95 |
二、动态套餐推荐算法(Dynamic Bundle Recommendation)
1. 目标
- 用户在商品页或购物车页,实时推荐“搭配购买”的套餐;
- 提高客单价与转化率;
- 支持个性化(基于用户画像)。
2. 推荐策略
| 策略 | 说明 |
|---|---|
| 协同过滤(Co-purchase) | “买了 A 的人也买了 B” |
| 内容相似度 | 基于向量推荐同类配件(如手机 → 保护壳) |
| 规则引擎 | 运营配置“强关联”组合(如相机 → 存储卡) |
| 个性化 | 基于用户历史行为调整排序 |
3. 数据准备
1. 构建共现矩阵(Co-occurrence Matrix)
从订单数据中统计商品对的共现次数:
{
"pair": "sku_1001:sku_2002",
"co_occurrence": 150,
"lift": 3.2, // 提升度 = P(A,B)/(P(A)*P(B))
"created_at": "2024-06-01"
}
写入索引 product-cooccurrence:
PUT /product-cooccurrence/_doc/sku1001_sku2002
{
"sku_a": "sku_1001",
"sku_b": "sku_2002",
"co_occurrence": 150,
"lift": 3.2
}
2. 向量相似度(辅助推荐)
使用 title_vector 查找语义相似的配件:
POST /product-catalog/_knn_search
{
"knn": {
"field": "title_vector",
"query_vector": [0.12, -0.45, ...],
"k": 10,
"num_candidates": 100
},
"query": {
"terms": { "category_path": ["配件", "保护壳", "耳机"] }
}
}
4. 推荐服务 API 设计
GET /api/recommend/bundle?sku_id=sku_1001&user_id=u123
响应示例:
{
"bundles": [
{
"name": "手机+保护壳",
"items": [
{ "sku_id": "sku_1001", "title": "iPhone 15 Pro" },
{ "sku_id": "sku_case_001", "title": "官方保护壳" }
],
"price": 849900,
"original_price": 899800,
"savings": 49900,
"reason": "常一起购买",
"score": 0.92
}
]
}
5. 推荐算法流程
graph TD
A[用户访问商品页] --> B{获取当前 SKU}
B --> C[查询 co-occurrence 表 top 10]
C --> D[查询向量相似配件 top 10]
D --> E[合并去重]
E --> F[过滤库存、类目]
F --> G[个性化排序]
G --> H[生成套餐组合]
H --> I[返回推荐结果]
个性化排序公式:
final_score = (
0.5 * log(1 + co_occurrence) +
0.3 * vector_similarity +
0.2 * user_preference_score
)
user_preference_score来自用户画像(如偏好品牌、价格区间)。
6. Elasticsearch 查询示例
获取共现商品:
GET /product-cooccurrence/_search
{
"query": {
"bool": {
"should": [
{ "term": { "sku_a": "sku_1001" } },
{ "term": { "sku_b": "sku_1001" } }
]
}
},
"sort": [ { "lift": "desc" } ],
"size": 10
}
获取语义相似配件:
POST /product-catalog/_knn_search
{
"knn": { ... },
"query": {
"bool": {
"must_not": { "term": { "id": "sku_1001" } },
"filter": { "terms": { "category_path": ["配件"] } }
}
}
}
7. 性能优化
| 优化点 | 方案 |
|---|---|
| 缓存推荐结果 | Redis 缓存 sku_id → recommendations,TTL=1h |
| 异步更新共现矩阵 | 每日凌晨从订单表重建 |
| 向量索引加速 | 使用 HNSW 算法(ES 默认支持) |
| 降级策略 | 服务不可用时返回热门套餐 |
三、系统集成架构图
+------------------+ +---------------------+
| 订单系统 / 日志 | --> | 离线 Job (Spark) |
+------------------+ +----------+----------+
|
v
+--------------------------+
| product-cooccurrence |
| title_vector 更新 |
+------------+-------------+
|
v
+--------------------------+
| Elasticsearch Cluster |
| - product-catalog |
| - product-cooccurrence |
+------------+-------------+
|
v
+--------------------------+
| Recommendation Service |
| - kNN 搜索 |
| - 混合排序 |
+------------+-------------+
|
v
+--------------------------+
| 前端(商品页 / 购物车) |
| 动态展示“搭配购买” |
+--------------------------+
四、监控与评估
| 指标 | 监控方式 |
|---|---|
| 聚类覆盖率 | (被聚合 SKU 数 / 总 SKU 数) |
| 推荐点击率 | 埋点统计“推荐位点击” |
| 套餐转化率 | (套餐下单数 / 推荐曝光数) |
| 向量查询延迟 | ES Profiler 监控 kNN 查询性能 |
五、总结
| 能力 | 技术方案 |
|---|---|
| 向量聚类自动聚合 | dense_vector + kNN / DBSCAN + 文本向量化 |
| 动态套餐推荐 | 共现矩阵 + 向量相似度 + 个性化排序 |
| 实时性 | 事件驱动更新,缓存降级 |
| 可扩展性 | 支持个性化、AB 测试、人工干预 |
815

被折叠的 条评论
为什么被折叠?



