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

📝 更新的文件

核心代码

  1. offline_tasks/scripts/i2i_content_similar.py - 完全重写
    • 连接Elasticsearch
    • 查询最近1年活跃商品
    • 获取向量并计算相似度
    • 生成两份索引

配置文档

  1. offline_tasks/REDIS_DATA_SPEC.md - 更新Redis数据规范
    • 添加 i2i_content_name 规范
    • 添加 i2i_content_pic 规范
    • 更新内存占用估算(270,000 keys, ~160MB)

调度脚本

  1. offline_tasks/run_all.py - 简化参数

    • 移除 --only-* 参数
    • 移除 --skip-* 参数
    • 移除 --lookback_days--top_n 参数
    • 只保留 --debug 参数
    • 添加内容相似任务
  2. offline_tasks/scripts/load_index_to_redis.py - 更新加载逻辑

    • 添加 content_namecontent_pic 到索引类型列表

新增文档

  1. offline_tasks/scripts/ES_VECTOR_SIMILARITY.md - ES向量相似度说明

    • ES配置说明
    • 工作流程详解
    • 性能说明和优化建议
    • 故障排查指南
  2. 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]]

🔍 技术细节

数据源

  1. 活跃商品列表

    • 来源: 数据库 sensors_events
    • 条件: 最近1年内有行为记录
    • 行为类型: click, contactFactory, addToPool, addToCart, purchase
  2. 向量数据

    • 来源: Elasticsearch spu 索引
    • 字段:
      • embedding_name_zh: 名称文本向量 (1024维)
      • embedding_pic_h14.vector: 图片向量 (1024维)
      • name_zh: 商品中文名称

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分钟

优化建议

  1. 批量查询: 使用 _mget 批量获取向量
  2. 并发处理: 多线程/异步IO
  3. 增量更新: 只处理变化的商品
  4. 缓存向量: 避免重复查询

🆚 与其他算法对比

算法 数据源 计算方式 特点 更新频率
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] 编写技术文档
  • [ ] 添加单元测试
  • [ ] 性能优化(批量查询)
  • [ ] 添加监控和告警

⚠️ 注意事项

  1. ES连接: 确保能访问ES服务器
  2. 向量缺失: 部分商品可能没有向量,会被跳过
  3. 网络延迟: ES查询受网络影响,建议内网部署
  4. 内存占用: 处理大量商品时注意内存使用
  5. 依赖安装: 需要安装 elasticsearch Python包

🔗 相关文档

  • ES_VECTOR_SIMILARITY.md - ES向量相似度详细说明
  • REDIS_DATA_SPEC.md - Redis数据规范
  • OFFLINE_INDEX_SPEC.md - 离线索引规范
  • QUICKSTART.md - 快速开始指南

📞 联系方式

如有问题或建议,请联系开发团队。


更新日期: 2025-10-17
版本: v2.0
作者: AI Assistant