Commit f201859ee7d3ee235fc66099443acf1f81efc94b
1 parent
22ae00c7
docs
Showing
1 changed file
with
24 additions
and
25 deletions
Show diff stats
docs/系统设计文档.md
| ... | ... | @@ -20,10 +20,10 @@ |
| 20 | 20 | |
| 21 | 21 | ### 1.2 索引结构(SPU维度) |
| 22 | 22 | |
| 23 | -**统一索引架构**: | |
| 24 | -- 所有客户共享同一个Elasticsearch索引:`search_products` | |
| 23 | +**索引架构**: | |
| 24 | +- 每个租户使用独立的 Elasticsearch 索引(索引名称由 `get_tenant_index_name(tenant_id)` 动态生成) | |
| 25 | 25 | - 索引粒度:SPU级别(每个文档代表一个SPU) |
| 26 | -- 数据隔离:通过`tenant_id`字段实现租户隔离 | |
| 26 | +- 数据隔离:通过“分索引 + `tenant_id` 字段”双重隔离(索引级 + 文档级) | |
| 27 | 27 | - 嵌套结构:每个SPU文档包含嵌套的`skus`数组 |
| 28 | 28 | |
| 29 | 29 | **索引文档结构**: |
| ... | ... | @@ -87,10 +87,10 @@ |
| 87 | 87 | ### 1.3 索引结构简化方案 |
| 88 | 88 | |
| 89 | 89 | **简化原则**: |
| 90 | -- **硬编码映射**:ES mapping 结构直接定义在 JSON 文件中(`mappings/search_products.json`) | |
| 91 | -- **统一索引结构**:所有租户共享相同的索引结构,通过 `tenant_id` 隔离数据 | |
| 90 | +- **硬编码映射**:ES mapping 结构直接定义在 JSON 文件中(`mappings/search_products.json`),所有租户索引共享相同结构 | |
| 91 | +- **分索引 + 公共结构**:每个租户拥有独立索引,但索引结构一致 | |
| 92 | 92 | - **数据源统一**:所有租户使用相同的 MySQL 表结构(店匠标准表) |
| 93 | -- **查询配置硬编码**:查询相关配置(字段 boost、查询域等)硬编码在 `search/query_config.py` | |
| 93 | +- **查询配置集中**:查询相关配置(字段 boost、查询域等)集中在配置文件中管理 | |
| 94 | 94 | |
| 95 | 95 | **索引结构特点**: |
| 96 | 96 | 1. **多语言字段**:所有文本字段支持中英文(`title.zh/en`, `brief.zh/en`, `description.zh/en`, `vendor.zh/en`, `category_path.zh/en`, `category_name_text.zh/en`) |
| ... | ... | @@ -114,8 +114,8 @@ |
| 114 | 114 | |
| 115 | 115 | **实现方式**: |
| 116 | 116 | - ES mapping 直接定义在 `mappings/search_products.json` 文件中 |
| 117 | -- 所有租户共享相同的索引结构 | |
| 118 | -- 查询配置硬编码在 `search/query_config.py` | |
| 117 | +- 所有租户索引共享相同的 mapping 结构 | |
| 118 | +- 查询配置集中在配置系统中(如 `config/config.yaml` 等) | |
| 119 | 119 | |
| 120 | 120 | **索引字段结构**: |
| 121 | 121 | |
| ... | ... | @@ -371,28 +371,27 @@ query_config: |
| 371 | 371 | |
| 372 | 372 | **实现情况**: |
| 373 | 373 | |
| 374 | -#### 配置方式 | |
| 374 | +#### 配置方式(示意) | |
| 375 | +翻译能力通过统一的 provider 配置管理,支持多种后端实现(如本地服务或外部 API): | |
| 375 | 376 | ```yaml |
| 376 | 377 | query_config: |
| 377 | 378 | supported_languages: |
| 378 | 379 | - "zh" |
| 379 | 380 | - "en" |
| 380 | - - "ru" | |
| 381 | - default_language: "zh" | |
| 382 | - translation_service: "deepl" | |
| 383 | - translation_api_key: null # 通过环境变量设置 | |
| 381 | + default_language: "en" | |
| 382 | + # 实际翻译 provider 与模型在通用 services 配置中定义 | |
| 384 | 383 | ``` |
| 385 | 384 | |
| 385 | +实际代码中,通过通用的 translation provider 抽象来选择具体后端和模型,文档不固定绑定某一个具体翻译服务或模型名称,以保持可配置性。 | |
| 386 | + | |
| 386 | 387 | #### 功能特性 |
| 387 | 388 | 1. **语言检测**:自动检测查询语言 |
| 388 | 389 | 2. **智能翻译**: |
| 389 | - - 如果查询是中文,翻译为英文、俄文 | |
| 390 | - - 如果查询是英文,翻译为中文、俄文 | |
| 391 | - - 如果查询是其他语言,翻译为所有支持的语言 | |
| 390 | + - 将源语言 query 翻译到当前租户配置的索引语言集合 | |
| 392 | 391 | 3. **域感知翻译**: |
| 393 | 392 | - 如果域有 `language_field_mapping`,只翻译到映射中存在的语言 |
| 394 | 393 | - 避免不必要的翻译,提高效率 |
| 395 | -4. **翻译缓存**:缓存翻译结果,避免重复调用 API | |
| 394 | +4. **翻译缓存**:缓存翻译结果,避免重复调用翻译后端 | |
| 396 | 395 | |
| 397 | 396 | #### 工作流程 |
| 398 | 397 | ``` |
| ... | ... | @@ -401,7 +400,7 @@ query_config: |
| 401 | 400 | |
| 402 | 401 | #### 实现模块 |
| 403 | 402 | - `query/language_detector.py` - 语言检测器 |
| 404 | -- `query/translator.py` - 翻译器(DeepL API) | |
| 403 | +- `query/translator.py` - 翻译 provider 抽象与调用 | |
| 405 | 404 | - `query/query_parser.py` - 查询解析器(集成翻译功能) |
| 406 | 405 | |
| 407 | 406 | ### 4.3 文本向量化(Text Embedding) |
| ... | ... | @@ -420,11 +419,11 @@ query_config: |
| 420 | 419 | 1. **条件生成**: |
| 421 | 420 | - 仅当 `enable_text_embedding=true` 时生成向量 |
| 422 | 421 | - 仅对 `default` 域查询生成向量 |
| 423 | -2. **向量模型**:Qwen3-Embedding-0.6B(1024维向量) | |
| 422 | +2. **向量模型**:使用可配置的文本向量模型(例如 1024 维通用语义 embedding),具体模型通过配置与 embedding 服务选择,不在文档中固定写死 | |
| 424 | 423 | 3. **用途**:用于语义搜索(KNN 检索) |
| 425 | 424 | |
| 426 | 425 | #### 实现模块 |
| 427 | -- `embeddings/text_encoder.py` + `embeddings/server.py` - 文本向量服务客户端与服务端实现 | |
| 426 | +- `embeddings/text_encoder.py` + `embeddings/server.py` - 文本向量服务客户端与服务端实现(支持可配置的模型后端) | |
| 428 | 427 | - `query/query_parser.py` - 查询解析器(集成向量生成) |
| 429 | 428 | |
| 430 | 429 | --- |
| ... | ... | @@ -611,10 +610,10 @@ ranking: |
| 611 | 610 | - ✅ 嵌套字段(skus, specifications, image_embedding) |
| 612 | 611 | - ✅ 规格字段(specifications)支持过滤和分面 |
| 613 | 612 | - ✅ 扁平化字段(价格、库存等)用于过滤和排序 |
| 614 | -- ✅ 统一索引(search_products) | |
| 615 | -- ✅ 租户隔离(tenant_id) | |
| 613 | +- ✅ 按租户分索引(索引名通过 `get_tenant_index_name` 生成),各租户索引结构一致 | |
| 614 | +- ✅ 文档内仍包含 `tenant_id` 字段,可用于额外校验或跨索引场景 | |
| 616 | 615 | - ✅ 硬编码映射(mappings/search_products.json) |
| 617 | -- ✅ 硬编码查询配置(search/query_config.py) | |
| 616 | +- ✅ 集中查询配置(config/config.yaml 等) | |
| 618 | 617 | |
| 619 | 618 | --- |
| 620 | 619 | |
| ... | ... | @@ -623,8 +622,8 @@ ranking: |
| 623 | 622 | - **后端**:Python 3.6+ |
| 624 | 623 | - **搜索引擎**:Elasticsearch |
| 625 | 624 | - **数据库**:MySQL(Shoplazza) |
| 626 | -- **向量模型**:Qwen3-Embedding-0.6B(文本)、CN-CLIP(图片) | |
| 627 | -- **翻译服务**:DeepL API | |
| 625 | +- **向量服务**:可配置的文本/图像向量模型(通过 embedding 服务与配置选择具体模型) | |
| 626 | +- **翻译服务**:可配置的翻译 provider(通过 translation 服务与配置选择具体后端与模型) | |
| 628 | 627 | - **API 框架**:FastAPI |
| 629 | 628 | - **前端**:HTML + JavaScript |
| 630 | 629 | ... | ... |