Blame view

MULTILANG_FEATURE.md 5.47 KB
b926f678   tangwang   多语言查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  # 多语言标题索引功能说明
  
  ## 功能概述
  
  本功能实现了多语言标题索引的支持,允许不同语言的标题字段使用对应的分词器,同时对外提供统一的搜索接口。
  
  ## 主要特性
  
  1. **多语言字段分离索引**:不同语言的标题字段(中文、英文、俄文等)使用对应的分词器
  2. **统一的搜索接口**:对外仍然使用 `default` 域搜索,内部自动处理多语言路由
  3. **智能查询路由**:根据查询语言和配置,将查询路由到对应的语言字段
  
  ## 配置说明
  
  ### 字段配置
  
ae5a294d   tangwang   命名修改、代码清理
17
  `tenant1_config.yaml` 中,需要为不同语言的标题字段配置对应的分词器:
b926f678   tangwang   多语言查询
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
  
  ```yaml
  fields:
    # 中文标题 - 使用中文电商分词器
    - name: "name"
      type: "TEXT"
      analyzer: "chinese_ecommerce"
      boost: 2.0
      
    # 英文标题 - 使用英文分词器
    - name: "enSpuName"
      type: "TEXT"
      analyzer: "english"
      boost: 2.0
      
    # 俄文标题 - 使用俄文分词器
    - name: "ruSkuName"
      type: "TEXT"
      analyzer: "russian"
      boost: 2.0
  ```
  
  ### 索引域配置
  
  在索引配置中添加 `language_field_mapping` 来指定每种语言对应的字段:
  
  ```yaml
  indexes:
    - name: "default"
      label: "默认索引"
      fields:
        - "name"
        - "enSpuName"
        - "ruSkuName"
        - "categoryName"
        - "brandName"
      analyzer: "chinese_ecommerce"
      boost: 1.0
      language_field_mapping:
        zh:
          - "name"
          - "categoryName"
          - "brandName"
        en:
          - "enSpuName"
        ru:
          - "ruSkuName"
  
    - name: "title"
      label: "标题索引"
      fields:
        - "name"
        - "enSpuName"
        - "ruSkuName"
      analyzer: "chinese_ecommerce"
      boost: 2.0
      language_field_mapping:
        zh:
          - "name"
        en:
          - "enSpuName"
        ru:
          - "ruSkuName"
  ```
  
  ### 查询配置
  
  `query_config` 中配置支持的语言:
  
  ```yaml
  query_config:
    supported_languages:
      - "zh"
      - "en"
      - "ru"
    default_language: "zh"
    enable_translation: true
    enable_text_embedding: true
  ```
  
  ## 工作原理
  
  ### 1. 查询解析阶段
  
  当用户输入查询时:
  1. **语言检测**:自动检测查询语言(中文、英文、俄文等)
  2. **翻译生成**:如果启用了翻译,将查询翻译到其他支持的语言
  3. **域提取**:如果查询包含域前缀(如 `title:查询`),提取域信息
  
  ### 2. 查询构建阶段
  
  对于有 `language_field_mapping` 的域:
  
  1. **检测语言查询**:使用检测到的语言和原始查询,搜索对应语言的字段
     - 例如:中文查询 "芭比娃娃" → 搜索 `name` 字段(中文分词器)
  
  2. **翻译语言查询**:使用翻译后的查询,搜索对应语言的字段
     - 例如:中文查询翻译为英文 "Barbie doll" → 搜索 `enSpuName` 字段(英文分词器)
  
  3. **查询组合**:将多个语言查询组合为 `should` 子句,提高召回率
     - 检测语言的查询权重更高(boost * 1.5)
     - 翻译语言的查询使用正常权重(boost * 1.0)
  
  ### 3. 字段级别分析器
  
  Elasticsearch 会自动为每个字段使用其配置的分析器:
  - `name` 字段使用 `chinese_ecommerce` 分词器
  - `enSpuName` 字段使用 `english` 分词器
  - `ruSkuName` 字段使用 `russian` 分词器
  
  ## 使用示例
  
  ### 示例 1: 默认域搜索(中文查询)
  
  ```
  查询: "芭比娃娃"
  域: default
  检测语言: zh
  ```
  
  **生成的查询**
  - 中文查询 "芭比娃娃" → 搜索 `name`, `categoryName`, `brandName` 字段(boost * 1.5)
  - 英文翻译 "Barbie doll" → 搜索 `enSpuName` 字段(boost * 1.0)
  - 俄文翻译 "Кукла Барби" → 搜索 `ruSkuName` 字段(boost * 1.0)
  
  ### 示例 2: 标题域搜索(英文查询)
  
  ```
  查询: "title:Barbie doll"
  域: title
  检测语言: en
  ```
  
  **生成的查询**
  - 英文查询 "Barbie doll" → 搜索 `enSpuName` 字段(boost * 2.0 * 1.5)
  - 中文翻译 "芭比娃娃" → 搜索 `name` 字段(boost * 2.0)
  - 俄文翻译 "Кукла Барби" → 搜索 `ruSkuName` 字段(boost * 2.0)
  
  ### 示例 3: 无语言映射的域
  
  ```
  查询: "category:玩具"
  域: category
  ```
  
  **生成的查询**
  - 使用所有配置的字段进行搜索(`categoryName`
  - 不进行多语言路由
  
  ## 配置验证
  
  系统会自动验证配置:
  1. 检查 `language_field_mapping` 中引用的字段是否存在
  2. 验证字段类型是否为 `TEXT`
  3. 警告字段分析器与语言不匹配的情况
  
  ## API 使用
  
  ### 搜索接口
  
  ```python
  POST /search/
  {
      "query": "芭比娃娃",
      "size": 10,
      "enable_translation": true,
      "enable_embedding": true
  }
  ```
  
  ### 域搜索
  
  ```python
  POST /search/
  {
      "query": "title:芭比娃娃",
      "size": 10,
      "enable_translation": true
  }
  ```
  
  ## 注意事项
  
  1. **翻译服务**:需要配置 DeepL API 密钥才能使用翻译功能
  2. **字段配置**:确保每个语言字段都配置了正确的分词器
  3. **性能考虑**:多语言查询会产生多个子查询,可能略微影响性能
  4. **语言检测**:语言检测的准确性会影响查询路由的效果
  
  ## 技术实现
  
  - **MultiLanguageQueryBuilder**: 多语言查询构建器
  - **QueryParser**: 查询解析器,支持语言检测和翻译
  - **ConfigLoader**: 配置加载器,支持 `language_field_mapping` 配置
  - **MappingGenerator**: 映射生成器,确保字段使用正确的分析器
  
  ## 未来改进
  
  1. 支持更多语言
  2. 优化翻译缓存机制
  3. 支持自定义语言检测模型
  4. 添加查询性能监控