CONTENT_SIMILARITY_UPDATE.md
6.03 KB
内容相似索引更新说明
📋 更新概述
重构了 i2i_content_similar.py,从基于数据库属性计算改为基于Elasticsearch向量计算,生成两份内容相似索引。
🔄 主要变化
1. 算法改变
之前 (旧版本):
- 基于商品属性(分类、供应商、包装等)
- 使用TF-IDF + 余弦相似度
- 提供
--method参数选择: tfidf / category / hybrid - 复杂的参数配置
现在 (新版本):
- 基于Elasticsearch的向量相似度
- 使用KNN向量查询
- 无需任何参数,开箱即用
- 自动生成两份索引
2. 生成的索引
| 索引名称 | 向量来源 | 文件名 | Redis Key | TTL |
|---|---|---|---|---|
| 名称向量相似 | embedding_name_zh |
i2i_content_name_YYYYMMDD.txt |
item:similar:content_name:{item_id} |
30天 |
| 图片向量相似 | embedding_pic_h14 |
i2i_content_pic_YYYYMMDD.txt |
item:similar:content_pic:{item_id} |
30天 |
3. 参数简化
之前:
python i2i_content_similar.py --top_n 50 --method hybrid --debug
现在:
python i2i_content_similar.py
# 就这么简单!无需任何参数
所有配置都在代码中预设好:
TOP_N = 50: 返回前50个相似商品KNN_K = 100: KNN查询返回100个候选KNN_CANDIDATES = 200: 候选池大小200
📝 更新的文件
核心代码
- ✅
offline_tasks/scripts/i2i_content_similar.py- 完全重写- 连接Elasticsearch
- 查询最近1年活跃商品
- 获取向量并计算相似度
- 生成两份索引
配置文档
- ✅
offline_tasks/REDIS_DATA_SPEC.md- 更新Redis数据规范- 添加
i2i_content_name规范 - 添加
i2i_content_pic规范 - 更新内存占用估算(270,000 keys, ~160MB)
- 添加
调度脚本
✅
offline_tasks/run_all.py- 简化参数- 移除
--only-*参数 - 移除
--skip-*参数 - 移除
--lookback_days和--top_n参数 - 只保留
--debug参数 - 添加内容相似任务
- 移除
✅
offline_tasks/scripts/load_index_to_redis.py- 更新加载逻辑- 添加
content_name和content_pic到索引类型列表
- 添加
新增文档
✅
offline_tasks/scripts/ES_VECTOR_SIMILARITY.md- ES向量相似度说明- ES配置说明
- 工作流程详解
- 性能说明和优化建议
- 故障排查指南
✅
offline_tasks/CONTENT_SIMILARITY_UPDATE.md- 本文档
🚀 使用指南
安装依赖
需要安装Elasticsearch客户端:
pip install elasticsearch
配置ES连接
在 i2i_content_similar.py 中修改ES配置(如需要):
ES_CONFIG = {
'host': 'http://localhost:9200',
'index_name': 'spu',
'username': 'essa',
'password': '4hOaLaf41y2VuI8y'
}
运行脚本
单独运行
cd /home/tw/recommendation/offline_tasks
python scripts/i2i_content_similar.py
通过run_all运行
python run_all.py
加载到Redis
python scripts/load_index_to_redis.py --date 20251017
📊 输出示例
文件格式
3302275 香蕉干 3302276:0.9234,3302277:0.8756,3302278:0.8432
Redis存储
# 名称向量相似
GET item:similar:content_name:3302275
# 返回: [[3302276,0.9234],[3302277,0.8756],[3302278,0.8432]]
# 图片向量相似
GET item:similar:content_pic:3302275
# 返回: [[4503826,0.8123],[4503827,0.7856],[4503828,0.7645]]
🔍 技术细节
数据源
活跃商品列表
- 来源: 数据库
sensors_events表 - 条件: 最近1年内有行为记录
- 行为类型: click, contactFactory, addToPool, addToCart, purchase
- 来源: 数据库
向量数据
- 来源: Elasticsearch
spu索引 - 字段:
embedding_name_zh: 名称文本向量 (1024维)embedding_pic_h14.vector: 图片向量 (1024维)name_zh: 商品中文名称
- 来源: Elasticsearch
ES查询
1. 获取商品向量
{
"query": {
"term": {"_id": "商品ID"}
},
"_source": {
"includes": ["_id", "name_zh", "embedding_name_zh", "embedding_pic_h14"]
}
}
2. KNN相似度查询
{
"knn": {
"field": "embedding_name_zh",
"query_vector": [向量],
"k": 100,
"num_candidates": 200
},
"_source": ["_id", "name_zh"],
"size": 100
}
⚡ 性能说明
运行时间
- 活跃商品数: ~50,000
- 向量查询: ~50,000次 × 10ms = 8-10分钟
- KNN查询: ~50,000次 × 50ms = 40-50分钟
- 总计: 约50-60分钟
优化建议
- 批量查询: 使用
_mget批量获取向量 - 并发处理: 多线程/异步IO
- 增量更新: 只处理变化的商品
- 缓存向量: 避免重复查询
🆚 与其他算法对比
| 算法 | 数据源 | 计算方式 | 特点 | 更新频率 |
|---|---|---|---|---|
| Swing | 用户行为 | 共现关系 | 捕获真实交互 | 每天 |
| W2V | 用户会话 | 序列学习 | 捕获序列关系 | 每天 |
| DeepWalk | 行为图 | 图游走 | 发现深层关联 | 每天 |
| 名称向量 | ES向量 | KNN查询 | 语义相似 | 每周 |
| 图片向量 | ES向量 | KNN查询 | 视觉相似 | 每周 |
📋 待办事项
- [x] 重写
i2i_content_similar.py - [x] 更新
REDIS_DATA_SPEC.md - [x] 简化
run_all.py参数 - [x] 更新
load_index_to_redis.py - [x] 编写技术文档
- [ ] 添加单元测试
- [ ] 性能优化(批量查询)
- [ ] 添加监控和告警
⚠️ 注意事项
- ES连接: 确保能访问ES服务器
- 向量缺失: 部分商品可能没有向量,会被跳过
- 网络延迟: ES查询受网络影响,建议内网部署
- 内存占用: 处理大量商品时注意内存使用
- 依赖安装: 需要安装
elasticsearchPython包
🔗 相关文档
ES_VECTOR_SIMILARITY.md- ES向量相似度详细说明REDIS_DATA_SPEC.md- Redis数据规范OFFLINE_INDEX_SPEC.md- 离线索引规范QUICKSTART.md- 快速开始指南
📞 联系方式
如有问题或建议,请联系开发团队。
更新日期: 2025-10-17
版本: v2.0
作者: AI Assistant