bcada818
tangwang
last
|
1
|
# 相关性检索优化说明(当前实现)
|
7bc756c5
tangwang
优化 ES 查询构建
|
2
|
|
bcada818
tangwang
last
|
3
|
## 1. 文档目标
|
7bc756c5
tangwang
优化 ES 查询构建
|
4
|
|
bcada818
tangwang
last
|
5
|
本文描述当前线上代码的文本检索策略,重点覆盖:
|
7bc756c5
tangwang
优化 ES 查询构建
|
6
|
|
bcada818
tangwang
last
|
7
8
9
10
|
- 多语言检索路由(`detector` / `translator` / `indexed` 的关系)
- 统一文本召回表达式(无布尔 AST 分支)
- 翻译缺失时的兜底策略
- 典型场景下实际生成的 ES 查询结构
|
7bc756c5
tangwang
优化 ES 查询构建
|
11
|
|
bcada818
tangwang
last
|
12
|
> 说明:向量召回(KNN)是另一维度,本篇仅简要提及,不展开。
|
7bc756c5
tangwang
优化 ES 查询构建
|
13
|
|
bcada818
tangwang
last
|
14
|
## 2. 核心流程
|
7bc756c5
tangwang
优化 ES 查询构建
|
15
|
|
bcada818
tangwang
last
|
16
|
查询链路(文本相关):
|
7bc756c5
tangwang
优化 ES 查询构建
|
17
|
|
bcada818
tangwang
last
|
18
19
20
21
22
23
|
1. `QueryParser.parse()`
输出 `detected_language`、`query_text_by_lang`、`search_langs`、`index_languages`、`source_in_index_languages`。
2. `ESQueryBuilder._build_advanced_text_query()`
按 `search_langs` 动态拼接 `title/brief/description/vendor/category_*` 的 `.{lang}` 字段,叠加 shared 字段(`tags`、`option*_values`)。
3. `build_query()`
统一走文本策略,不再有布尔 AST 枝路。
|
7bc756c5
tangwang
优化 ES 查询构建
|
24
|
|
bcada818
tangwang
last
|
25
|
## 3. 能力矩阵(Detector / Translator / Indexed)
|
7bc756c5
tangwang
优化 ES 查询构建
|
26
|
|
bcada818
tangwang
last
|
27
|
三类能力的职责边界:
|
7bc756c5
tangwang
优化 ES 查询构建
|
28
|
|
bcada818
tangwang
last
|
29
30
31
|
- **Detector**:识别 query 源语言(`detected_language`)
- **Indexed**:租户可检索语言集合(`tenant_config.*.index_languages`)
- **Translator**:源语言到目标语言的可翻译能力及实时成功率
|
7bc756c5
tangwang
优化 ES 查询构建
|
32
|
|
bcada818
tangwang
last
|
33
|
### 3.1 决策规则
|
7bc756c5
tangwang
优化 ES 查询构建
|
34
|
|
bcada818
tangwang
last
|
35
36
37
38
39
40
|
1. 若 `detected_language in index_languages`:
源语言字段做主召回;其他语言走翻译补召回(低权重)。
2. 若 `detected_language not in index_languages`:
翻译到 `index_languages` 是主路径;源语言字段仅作弱召回。
3. 若第 2 步翻译部分失败或全部失败:
对缺失翻译的 `index_languages` 字段,追加“原文低权重兜底”子句,避免完全丢失这些语种索引面的召回机会。
|
7bc756c5
tangwang
优化 ES 查询构建
|
41
|
|
bcada818
tangwang
last
|
42
|
### 3.2 翻译等待策略
|
7bc756c5
tangwang
优化 ES 查询构建
|
43
|
|
bcada818
tangwang
last
|
44
|
`QueryParser.parse()` 中:
|
7bc756c5
tangwang
优化 ES 查询构建
|
45
|
|
bcada818
tangwang
last
|
46
47
|
- 当源语种不在 `index_languages`:使用 `translate_multi_async(...)` 并等待 futures 收敛
- 当源语种在 `index_languages`:使用 `translate_multi(..., async_mode=True)`,优先缓存命中,未命中可后台补齐
|
7bc756c5
tangwang
优化 ES 查询构建
|
48
|
|
bcada818
tangwang
last
|
49
|
这保证了“必须翻译才能检索”的场景不会直接空跑。
|
7bc756c5
tangwang
优化 ES 查询构建
|
50
|
|
bcada818
tangwang
last
|
51
|
## 4. 统一文本召回表达式
|
ea118f2b
tangwang
build_query:根据 qu...
|
52
|
|
bcada818
tangwang
last
|
53
|
每个语言子句的基础形态:
|
ea118f2b
tangwang
build_query:根据 qu...
|
54
|
|
bcada818
tangwang
last
|
55
56
57
58
59
60
61
62
63
64
65
66
|
```json
{
"multi_match": {
"_name": "base_query|base_query_trans_xx|fallback_original_query_xx",
"query": "<text>",
"fields": ["title.xx^3.0", "brief.xx^1.5", "...", "tags", "option1_values^0.5", "..."],
"minimum_should_match": "75%",
"tie_breaker": 0.9,
"boost": "<按策略决定,可省略>"
}
}
```
|
ea118f2b
tangwang
build_query:根据 qu...
|
67
|
|
bcada818
tangwang
last
|
68
|
最终按 `bool.should` 组合,`minimum_should_match: 1`。
|
ea118f2b
tangwang
build_query:根据 qu...
|
69
|
|
bcada818
tangwang
last
|
70
|
## 5. 关键配置项(文本策略)
|
7bc756c5
tangwang
优化 ES 查询构建
|
71
|
|
bcada818
tangwang
last
|
72
|
位于 `config/config.yaml -> query_config.text_query_strategy`:
|
7bc756c5
tangwang
优化 ES 查询构建
|
73
|
|
bcada818
tangwang
last
|
74
75
76
77
78
79
80
81
82
83
|
- `base_minimum_should_match`
- `translation_minimum_should_match`
- `translation_boost`
- `translation_boost_when_source_missing`
- `source_boost_when_missing`
- `original_query_fallback_boost_when_translation_missing`(新增)
- `keywords_boost`
- `enable_phrase_query`
- `tie_breaker_base_query`
- `tie_breaker_keywords`
|
7bc756c5
tangwang
优化 ES 查询构建
|
84
|
|
bcada818
tangwang
last
|
85
|
新增项说明:
|
7bc756c5
tangwang
优化 ES 查询构建
|
86
|
|
bcada818
tangwang
last
|
87
88
|
- `original_query_fallback_boost_when_translation_missing`:
当源语种不在索引语言且翻译缺失时,原文打到缺失目标语字段的低权重系数,默认 `0.2`。
|
7bc756c5
tangwang
优化 ES 查询构建
|
89
|
|
bcada818
tangwang
last
|
90
|
## 6. 典型场景与实际 DSL
|
7bc756c5
tangwang
优化 ES 查询构建
|
91
|
|
bcada818
tangwang
last
|
92
|
以下示例来自当前 `ESQueryBuilder` 生成结果(已按当前代码验证)。
|
7bc756c5
tangwang
优化 ES 查询构建
|
93
|
|
bcada818
tangwang
last
|
94
|
### 场景 A:源语种已在索引语言中,且翻译成功
|
7bc756c5
tangwang
优化 ES 查询构建
|
95
|
|
bcada818
tangwang
last
|
96
97
98
|
- `detected_language=de`
- `index_languages=[de,en]`
- `query_text_by_lang={de:"herren schuhe", en:"men shoes"}`
|
7bc756c5
tangwang
优化 ES 查询构建
|
99
|
|
bcada818
tangwang
last
|
100
|
策略结果:
|
7bc756c5
tangwang
优化 ES 查询构建
|
101
|
|
bcada818
tangwang
last
|
102
103
|
- `base_query`:德语字段,正常权重
- `base_query_trans_en`:英语字段,`boost=translation_boost`(默认 0.4)
|
7bc756c5
tangwang
优化 ES 查询构建
|
104
|
|
bcada818
tangwang
last
|
105
|
### 场景 B:源语种不在索引语言中,部分翻译缺失
|
7bc756c5
tangwang
优化 ES 查询构建
|
106
|
|
bcada818
tangwang
last
|
107
108
109
|
- `detected_language=de`
- `index_languages=[en,zh]`
- 只翻译出 `en`,`zh` 失败
|
7bc756c5
tangwang
优化 ES 查询构建
|
110
|
|
bcada818
tangwang
last
|
111
|
策略结果:
|
7bc756c5
tangwang
优化 ES 查询构建
|
112
|
|
bcada818
tangwang
last
|
113
114
115
|
- `base_query`(德语字段):`boost=source_boost_when_missing`(默认 0.6)
- `base_query_trans_en`(英文字段):`boost=translation_boost_when_source_missing`(默认 1.0)
- `fallback_original_query_zh`(中文字段):原文低权重兜底(默认 0.2)
|
7bc756c5
tangwang
优化 ES 查询构建
|
116
|
|
bcada818
tangwang
last
|
117
|
### 场景 C:源语种不在索引语言中,翻译全部失败
|
7bc756c5
tangwang
优化 ES 查询构建
|
118
|
|
bcada818
tangwang
last
|
119
120
121
|
- `detected_language=de`
- `index_languages=[en,zh]`
- `query_text_by_lang` 仅有 `de`
|
7bc756c5
tangwang
优化 ES 查询构建
|
122
|
|
bcada818
tangwang
last
|
123
|
策略结果:
|
7bc756c5
tangwang
优化 ES 查询构建
|
124
|
|
bcada818
tangwang
last
|
125
126
127
|
- `base_query`(德语字段,低权重)
- `fallback_original_query_en`(英文字段原文兜底)
- `fallback_original_query_zh`(中文字段原文兜底)
|
7bc756c5
tangwang
优化 ES 查询构建
|
128
|
|
bcada818
tangwang
last
|
129
|
这能避免“只有源语种字段查询,且该语种字段在商家索引中稀疏/为空”导致的弱召回问题。
|
7bc756c5
tangwang
优化 ES 查询构建
|
130
|
|
bcada818
tangwang
last
|
131
|
## 7. QueryParser 与 ESBuilder 的职责分工
|
7bc756c5
tangwang
优化 ES 查询构建
|
132
|
|
bcada818
tangwang
last
|
133
134
135
136
137
138
139
140
141
|
- `QueryParser` 负责“语言计划”与“可用文本”:
- `search_langs`
- `query_text_by_lang`
- `source_in_index_languages`
- `index_languages`
- `ESQueryBuilder` 负责“表达式展开”:
- 动态字段组装
- 子句权重分配
- 翻译缺失兜底子句拼接
|
7bc756c5
tangwang
优化 ES 查询构建
|
142
|
|
bcada818
tangwang
last
|
143
|
这种分层让策略调优主要落在配置和 Builder,不破坏 Parser 的职责边界。
|
7bc756c5
tangwang
优化 ES 查询构建
|
144
|
|
bcada818
tangwang
last
|
145
|
## 8. 兼容与注意事项
|
7bc756c5
tangwang
优化 ES 查询构建
|
146
|
|
bcada818
tangwang
last
|
147
148
149
150
151
152
153
|
1. 当前文本主链路已移除布尔 AST 分支。
2. 文档中的旧描述(如 `operator: AND` 固定开启)不再适用,当前实现未强制设置该参数。
3. `HanLP` 为可选依赖;不可用时退化到轻量分词,不影响主链路可用性。
4. 若后续扩展到更多语种,请确保:
- mapping 中存在对应 `.<lang>` 字段
- `index_languages` 配置在支持列表内
- 翻译 provider 对目标语种可用
|
7bc756c5
tangwang
优化 ES 查询构建
|
154
|
|
bcada818
tangwang
last
|
155
|
## 9. 建议测试清单
|
7bc756c5
tangwang
优化 ES 查询构建
|
156
|
|
bcada818
tangwang
last
|
157
|
建议在 `tests/` 增加文本策略用例:
|
7bc756c5
tangwang
优化 ES 查询构建
|
158
|
|
bcada818
tangwang
last
|
159
160
161
162
163
|
1. 源语种在索引语言,翻译命中缓存
2. 源语种不在索引语言,翻译部分失败(验证 fallback 子句)
3. 源语种不在索引语言,翻译全部失败(验证多目标 fallback)
4. 自定义 `original_query_fallback_boost_when_translation_missing` 生效
5. 非 `zh/en` 语种字段动态拼接(如 `de/fr/es`)
|