# 多语言标题索引功能说明 ## 功能概述 本功能实现了多语言标题索引的支持,允许不同语言的标题字段使用对应的分词器,同时对外提供统一的搜索接口。 ## 主要特性 1. **多语言字段分离索引**:不同语言的标题字段(中文、英文、俄文等)使用对应的分词器 2. **统一的搜索接口**:对外仍然使用 `default` 域搜索,内部自动处理多语言路由 3. **智能查询路由**:根据查询语言和配置,将查询路由到对应的语言字段 ## 配置说明 ### 字段配置 在 `tenant1_config.yaml` 中,需要为不同语言的标题字段配置对应的分词器: ```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. 添加查询性能监控