MULTILANG_FEATURE.md 5.47 KB

多语言标题索引功能说明

功能概述

本功能实现了多语言标题索引的支持,允许不同语言的标题字段使用对应的分词器,同时对外提供统一的搜索接口。

主要特性

  1. 多语言字段分离索引:不同语言的标题字段(中文、英文、俄文等)使用对应的分词器
  2. 统一的搜索接口:对外仍然使用 default 域搜索,内部自动处理多语言路由
  3. 智能查询路由:根据查询语言和配置,将查询路由到对应的语言字段

配置说明

字段配置

tenant1_config.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 来指定每种语言对应的字段:

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 中配置支持的语言:

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 使用

搜索接口

POST /search/
{
    "query": "芭比娃娃",
    "size": 10,
    "enable_translation": true,
    "enable_embedding": true
}

域搜索

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. 添加查询性能监控