Blame view

docs/分面数据问题根源分析.md 4.31 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
115
116
117
118
119
120
121
122
123
124
  # 分面数据问题根源分析
  
  ## 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字段
  
  ```sql
  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
  
  修复后,重新导入数据:
  ```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
  ```
  
  ### 步骤4:验证ES数据
  
  检查ES索引中的文档是否包含:
  - `category1_name`字段(应该有值)
  - `specifications`字段(应该已经有数据)
  
  ## 关键发现
  
  从ES检查结果看:
  1. **specifications数据是有的**,ES聚合查询能正常返回color/size/material的分面数据
  2. **category1_name几乎都是空的**,这是导致category分面为空的原因
  3. **如果specifications分面也显示为空**,可能是前端解析ES聚合结果的问题,而不是ES数据的问题