MULTILANG_FEATURE.md
5.47 KB
多语言标题索引功能说明
功能概述
本功能实现了多语言标题索引的支持,允许不同语言的标题字段使用对应的分词器,同时对外提供统一的搜索接口。
主要特性
- 多语言字段分离索引:不同语言的标题字段(中文、英文、俄文等)使用对应的分词器
- 统一的搜索接口:对外仍然使用
default域搜索,内部自动处理多语言路由 - 智能查询路由:根据查询语言和配置,将查询路由到对应的语言字段
配置说明
字段配置
在 customer1_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. 查询解析阶段
当用户输入查询时:
- 语言检测:自动检测查询语言(中文、英文、俄文等)
- 翻译生成:如果启用了翻译,将查询翻译到其他支持的语言
- 域提取:如果查询包含域前缀(如
title:查询),提取域信息
2. 查询构建阶段
对于有 language_field_mapping 的域:
检测语言查询:使用检测到的语言和原始查询,搜索对应语言的字段
- 例如:中文查询 "芭比娃娃" → 搜索
name字段(中文分词器)
- 例如:中文查询 "芭比娃娃" → 搜索
翻译语言查询:使用翻译后的查询,搜索对应语言的字段
- 例如:中文查询翻译为英文 "Barbie doll" → 搜索
enSpuName字段(英文分词器)
- 例如:中文查询翻译为英文 "Barbie doll" → 搜索
查询组合:将多个语言查询组合为
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) - 不进行多语言路由
配置验证
系统会自动验证配置:
- 检查
language_field_mapping中引用的字段是否存在 - 验证字段类型是否为
TEXT - 警告字段分析器与语言不匹配的情况
API 使用
搜索接口
POST /search/
{
"query": "芭比娃娃",
"size": 10,
"enable_translation": true,
"enable_embedding": true
}
域搜索
POST /search/
{
"query": "title:芭比娃娃",
"size": 10,
"enable_translation": true
}
注意事项
- 翻译服务:需要配置 DeepL API 密钥才能使用翻译功能
- 字段配置:确保每个语言字段都配置了正确的分词器
- 性能考虑:多语言查询会产生多个子查询,可能略微影响性能
- 语言检测:语言检测的准确性会影响查询路由的效果
技术实现
- MultiLanguageQueryBuilder: 多语言查询构建器
- QueryParser: 查询解析器,支持语言检测和翻译
- ConfigLoader: 配置加载器,支持
language_field_mapping配置 - MappingGenerator: 映射生成器,确保字段使用正确的分析器
未来改进
- 支持更多语言
- 优化翻译缓存机制
- 支持自定义语言检测模型
- 添加查询性能监控