分面数据问题根源分析.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,但需要:
- 确保MySQL的
category字段有值 - 重新导入数据到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聚合查询显示有数据,但前端显示为空,可能原因:
分面聚合结构不匹配:
- 前端请求:
["category1_name", "specifications.color", "specifications.size", "specifications.material"] - ES构建的聚合名称:
category1_name_facet,specifications_color_facet,specifications_size_facet,specifications_material_facet - 前端解析时的字段匹配可能有问题
- 前端请求:
ES聚合结果格式:
- specifications.color分面的聚合名称是
specifications_color_facet - 但前端期望的field是
specifications.color - 需要在
format_facets中正确匹配
- specifications.color分面的聚合名称是
解决方案
方案1:修复category1_name字段(必需)
问题:MySQL的category_path为空,需要从category字段生成
已修复代码(indexer/spu_transformer.py):
- 如果
category_path为空,使用category字段作为备选 - 从
category字段解析多级分类(如果包含"/") - 如果
category不包含"/",直接作为category1_name
但需要:
- 检查MySQL的
category字段是否有值 - 如果
category也为空,需要检查Excel导入时"专辑名称"字段是否正确映射
方案2:验证specifications分面查询
虽然ES聚合查询显示有数据,但需要:
- 检查前端是否正确发送分面请求
- 检查ES返回的聚合结果格式
- 检查
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检查结果看:
- specifications数据是有的,ES聚合查询能正常返回color/size/material的分面数据
- category1_name几乎都是空的,这是导致category分面为空的原因
- 如果specifications分面也显示为空,可能是前端解析ES聚合结果的问题,而不是ES数据的问题