分面数据问题根源分析.md 4.31 KB

分面数据问题根源分析

ES数据检查结果

从ES索引数据检查结果可以看到:

1. category1_name 分面问题

检查结果

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

问题原因

  • MySQL中category_path字段几乎都是空的(只有1个,而且那个是ID列表格式,不是路径格式如"服装/男装")
  • MySQL中category字段可能也为空
  • 导致ES索引中的category1_name字段几乎都是空的

解决方案: 代码已修复(indexer/spu_transformer.py第241-259行),支持从category字段生成category1_name,但需要:

  1. 确保MySQL的category字段有值
  2. 重新导入数据到ES

2. specifications 分面问题

检查结果(从ES聚合查询):

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

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

问题根源

问题1:category1_name 几乎都为空

MySQL数据情况

  • category_path 字段:11253个SPU为空,只有1个有值(但那个值是ID列表格式)
  • category 字段:需要检查是否有值

ES索引情况

  • category1_name 字段:几乎都是None
  • 导致category分面查询结果为空

问题2:为什么specifications分面查询无结果

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

  1. 分面聚合结构不匹配

    • 前端请求:["category1_name", "specifications.color", "specifications.size", "specifications.material"]
    • ES构建的聚合名称:category1_name_facet, specifications_color_facet, specifications_size_facet, specifications_material_facet
    • 前端解析时的字段匹配可能有问题
  2. ES聚合结果格式

    • specifications.color分面的聚合名称是specifications_color_facet
    • 但前端期望的field是specifications.color
    • 需要在format_facets中正确匹配

解决方案

方案1:修复category1_name字段(必需)

问题:MySQL的category_path为空,需要从category字段生成

已修复代码indexer/spu_transformer.py):

  • 如果category_path为空,使用category字段作为备选
  • category字段解析多级分类(如果包含"/")
  • 如果category不包含"/",直接作为category1_name

但需要

  1. 检查MySQL的category字段是否有值
  2. 如果category也为空,需要检查Excel导入时"专辑名称"字段是否正确映射

方案2:验证specifications分面查询

虽然ES聚合查询显示有数据,但需要:

  1. 检查前端是否正确发送分面请求
  2. 检查ES返回的聚合结果格式
  3. 检查format_facets函数是否正确解析specifications分面

下一步操作

步骤1:检查MySQL的category字段

SELECT 
    COUNT(*) as total,
    COUNT(category) as has_category,
    COUNT(*) - COUNT(category) as null_category
FROM shoplazza_product_spu
WHERE tenant_id = 162 AND deleted = 0;

步骤2:检查Excel导入映射

确认Excel的"专辑名称"字段是否正确映射到MySQL的category字段:

  • 如果映射到category字段,应该有值
  • 如果映射到category_path字段,但值是ID列表格式,需要修复

步骤3:重新导入数据到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

步骤4:验证ES数据

检查ES索引中的文档是否包含:

  • category1_name字段(应该有值)
  • specifications字段(应该已经有数据)

关键发现

从ES检查结果看:

  1. specifications数据是有的,ES聚合查询能正常返回color/size/material的分面数据
  2. category1_name几乎都是空的,这是导致category分面为空的原因
  3. 如果specifications分面也显示为空,可能是前端解析ES聚合结果的问题,而不是ES数据的问题