分面问题最终诊断.md 4.29 KB

分面问题最终诊断报告

ES数据检查结果

根据ES索引检查结果:

✅ specifications 分面有数据

ES聚合查询显示:

  • specifications.color: 有数据(Beige: 1226, Khaki: 1176, Red: 1168等)
  • specifications.size: 有数据(1: 1234, 12: 1234等)
  • specifications.material: 有数据(塑料英文包装: 17277等)

结论:ES中确实有specifications数据,聚合查询能正常返回结果。

❌ category1_name 几乎都为空

  • 总文档数:10000
  • 有category1_name的文档:只有1个
  • 该文档的category1_name值:593389466647815326,593389582007954165,593389582008019701(ID列表格式,不是分类名称)

结论:category1_name字段几乎都是空的,导致category分面为空。

问题根源分析

问题1:category1_name 为什么为空

MySQL数据情况(从诊断脚本结果):

  • category_path字段:11253个SPU为空,只有1个有值
  • 该唯一值:593389466647815326,593389582007954165,593389582008019701(ID列表格式,不是路径格式)

当前代码逻辑spu_transformer.py第228-240行):

if pd.notna(spu_row.get('category_path')):
    category_path = str(spu_row['category_path'])
    # 直接按"/"分割,但ID列表格式是逗号分隔的
    path_parts = category_path.split('/')
    # 如果category_path是ID列表,path_parts只有一个元素(整个ID列表)

问题

  1. 对于ID列表格式的category_path(如593389466647815326,593389582007954165,593389582008019701),按"/"分割后只有一个元素,会被错误地作为category1_name
  2. 对于空的category_path,会进入elif分支,使用category字段作为备选

需要检查

  • MySQL的category字段是否有值?如果有值,应该能生成category1_name
  • 如果category字段也为空,说明Excel导入时"专辑名称"没有正确映射

问题2:specifications 分面查询为什么为空

虽然ES聚合查询显示有数据,但前端显示为空,可能原因:

  1. 前端分面请求格式

    • 前端请求:["category1_name", "specifications.color", "specifications.size", "specifications.material"]
    • ES构建的聚合名称:specifications_color_facet(注意:是下划线,不是点号)
    • 字段匹配可能有问题
  2. ES聚合结果解析

    • ES返回的聚合字段名:specifications_color_facet
    • 前端期望的field:specifications.color
    • format_facets函数需要正确匹配

具体数据说明

MySQL数据情况

  • 总SPU数:11254
  • 有category_path的SPU:1个(值是ID列表格式)
  • 有option定义的SPU:886个
    • position=1, name='color': 885个
    • position=2, name='size': 885个
    • position=3, name='material': 885个
  • 总SKU数:43109个

ES数据情况

  • specifications数据:有数据,能够正常聚合
  • category1_name数据:几乎都是空的(只有1个,而且是ID列表格式)

解决方案

立即执行的操作

  1. 检查MySQL的category字段

    • 运行诊断脚本检查category字段是否有值
    • 如果category有值,修复后的代码应该能生成category1_name
    • 如果category也为空,需要检查Excel导入映射
  2. 重新导入数据到ES

    python scripts/recreate_and_import.py \
       --tenant-id 162 \
       --db-host <host> \
       --db-database saas \
       --db-username saas \
       --db-password <password> \
       --es-host http://localhost:9200
    
  3. 验证ES数据

    • 检查category1_name字段是否有值
    • 检查specifications字段是否有数据

如果category字段也为空

需要检查Excel导入到店匠系统时,"专辑名称"字段是否正确映射到MySQL的category字段。

关键发现

  1. specifications数据是存在的:ES聚合查询能正常返回color/size/material的分面数据
  2. category1_name几乎都是空的:这是因为category_path为空,而且可能category字段也为空
  3. 需要从category字段生成category1_name:代码已修复,但需要确保MySQL的category字段有值

下一步

  1. 检查MySQL的category字段是否有值
  2. 如果有值,重新导入数据到ES
  3. 如果也为空,需要检查Excel导入映射或修复数据