# 索引重构v2方案

## 概述

根据 `索引字段说明v2.md` 的要求重构Elasticsearch索引映射结构和MySQL到ES的数据导入脚本。

## 主要变更点

### 1. 索引映射结构重构

#### 1.1 多语言文本字段

- 为文本字段添加中英文双字段支持（title.zh/title.en, brief.zh/brief.en, description.zh/description.en, vendor.zh/vendor.en）
- 中文字段使用 `index_ik`/`query_ik` 分析器（对应文档中的hanlp_index/hanlp_standard）
- 英文字段使用 `english` 分析器
- **暂时只填充中文字段，英文字段设为空**（不需要语言检测，每个tenant的语言预先知道）

#### 1.2 分类字段多层级支持

类别数据源：
在spu表中：
Field Type
category  varchar(255)
category_id bigint(20)
category_google_id  bigint(20)
category_level  int(11)
category_path varchar(500)

mapping：

      "category_path.zh": { // 提供模糊查询功能，辅助相关性计算
        "type": "text",
        "analyzer": "hanlp_index",
        "search_analyzer": "hanlp_standard"
      },
      "category_path.en": {  // 提供模糊查询功能，辅助相关性计算
        "type": "text",
        "analyzer": "english",
        "search_analyzer": "english"
      },
      "category_name_text.zh": { // 提供模糊查询功能，辅助相关性计算
        "type": "text",
        "analyzer": "hanlp_index",
        "search_analyzer": "hanlp_standard"
      },
      "category_name_text.en": {  // 提供模糊查询功能，辅助相关性计算
        "type": "text",
        "analyzer": "english",
        "search_analyzer": "english"
      },

      "category_id": {
        "type": "keyword"
      },
      "category_name": {
        "type": "keyword"
      },
      "category_level": {
        "type": "integer"
      },
      "category1_name": { // 不同层级下 可能有同名的情况，因此提供一二三级分开的查询方式
        "type": "keyword"
      },
      "category2_name": {
        "type": "keyword"
      },
      "category3_name": {
        "type": "keyword"
      },


#### 1.3 SKU字段展开

- 添加 `sku_prices` (float数组) - 所有SKU价格列表
- 添加 `sku_weights` (long数组) - 重量数值列表（转换为整数克）
- 添加 `sku_weight_units` (keyword数组) - 重量+单位字符串列表
- 添加 `total_inventory` (long) - SKU库存总和
- 保留 `min_price`, `max_price` (float)

#### 1.4 选项字段处理

- 添加 `option1_name`, `option2_name`, `option3_name` (keyword) - SPU级别的选项名称定义
- 修改SKU嵌套结构：将 `options` 对象改为 `option1_value`, `option2_value`, `option3_value` (keyword)
- 添加 `specifications` (nested, index=false) - 动态属性，仅用于返回

#### 1.5 标签字段

- `tags` 改为 keyword 数组类型（分割逗号分隔的字符串）

#### 1.6 SKU嵌套结构更新

- 添加 `sku_code` (keyword) 字段
- 添加 `weight` (float), `weight_unit` (keyword)
- 将 `options` 对象改为 `option1_value`, `option2_value`, `option3_value`
- 添加 `image_src` (keyword, index=false)

#### 1.7 删除SEO字段

- **完全删除** `seo_title`, `seo_description`, `seo_keywords` 字段
- 从索引映射中移除
- 从数据转换脚本中移除相关处理

### 2. 数据转换脚本重构

#### 2.1 多语言文本处理

- **简化处理**：暂时只填充中文字段（title.zh, brief.zh, description.zh, vendor.zh）
- 英文字段（title.en, brief.en, description.en, vendor.en）设为空或None
- 不需要语言检测逻辑

#### 2.2 分类路径解析

- 从 `category_path` 字段按 "/" 分割提取分类层级
- 分割结果赋值给 `category1_name`, `category2_name`, `category3_name`
- 生成 `category_path.zh`（暂时填充，`category_path.en` 设为空）

#### 2.3 SKU字段展开计算

- 提取所有SKU的价格，生成 `sku_prices` 数组
- 提取所有SKU的重量，转换为克（乘以1000），生成 `sku_weights` 数组
- 生成 `sku_weight_units` 数组（格式："重量值单位"）
- 计算所有SKU库存总和，赋值给 `total_inventory`
- 计算 `min_price` 和 `max_price`

#### 2.4 选项字段处理

- SPU级别的选项名称：需要从SPU数据或SKU数据推断（如果SPU表中没有，需要查看是否有选项表）
- SKU级别的选项值：从SKU的 `option1`, `option2`, `option3` 字段提取
- 生成 `specifications` 嵌套数组（从选项名称和值对生成）

#### 2.5 标签处理

- `tags` 字段按逗号分割转换为数组

#### 2.6 删除SEO字段处理

- **完全移除** seo_title, seo_description, seo_keywords 相关代码

## 实施步骤

### 步骤1：修改索引映射生成器

**文件**: `indexer/mapping_generator.py` 和相关字段配置

- 更新 `get_es_mapping_for_field` 函数以支持多语言字段
- 添加分类字段的完整映射生成逻辑
- 添加SKU展开字段的映射
- 添加选项字段的映射
- **删除SEO字段的映射生成**

### 步骤2：重构数据转换脚本

**文件**: `indexer/spu_transformer.py`

- **简化多语言处理**：只填充中文字段（title.zh, brief.zh等），英文字段设为空或None
- 实现分类路径的解析和展开
- 实现SKU字段的展开计算（价格、重量、库存）
- 实现选项字段的处理
- 更新SKU嵌套结构的生成
- 处理标签的分割
- **删除所有SEO字段相关代码**

### 步骤3：更新配置文件

**文件**: `config/config.yaml`

- **删除SEO字段配置**：移除 seo_title, seo_description, seo_keywords 的字段定义
- 可能需要添加新字段的配置定义，或者直接在代码中生成映射（如果配置系统不支持这些复杂字段）