Blame view

docs/分面问题最终诊断.md 4.29 KB
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  # 分面问题最终诊断报告
  
  ## 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行):
  ```python
  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**
     ```bash
     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导入映射或修复数据