52 lines
1.7 KiB
Markdown
52 lines
1.7 KiB
Markdown
# search-engine-app(子模块规范)
|
||
|
||
## 子模块名称
|
||
|
||
search-engine-app(APP 搜索器:DP + TopK)
|
||
|
||
## 目标描述
|
||
|
||
在 APP 场景实现多行换行的确定性组合搜索:
|
||
|
||
- 使用 DP + TopK 生成候选 layout
|
||
- 对每个候选应用硬约束过滤
|
||
- 调用 `scoring-tiebreak` 计算评分与 tieKey
|
||
- 保留 TopK 并在结束时选最优
|
||
|
||
要求性能可控且输出完全确定性。
|
||
|
||
## 输入/输出定义
|
||
|
||
### 输入
|
||
|
||
- `tokens: Token[]`
|
||
- `breakpoints: Breakpoint[]`(来自 `breakpoint-candidates`)
|
||
- `availableWidth: number`
|
||
- `maxLines: number`
|
||
- `lineMode: 'AUTO' | 'FIXED'`
|
||
- `context: 'APP'`
|
||
- `measure: { measureWidth?: fn; fontSpec?: any; cache: ... }`(来自 `width-measurement` 的实现)
|
||
- `config: { topK: number }`
|
||
|
||
### 输出
|
||
|
||
- `bestLayout: { breaks: number[]; lines: string[]; wrappedText: string; meta?: { breaks: number[]; scoreTopTerms?: ... } }`
|
||
- 若无解:返回可解释的 fallback(由 `overflow-fallback` 统一处理语义)
|
||
|
||
## 验收标准(可验证)
|
||
|
||
- **确定性**:同输入(tokens/breakpoints/availableWidth/maxLines/configVersion)必定同输出(breaks 与 lines 完全一致)
|
||
- **TopK 维护一致**:
|
||
- K 默认 10(可配置但必须固定)
|
||
- 排序:score desc;tieKey 逐项比较
|
||
- 去重:同 breaks 序列只保留最高分
|
||
- **lineMode=FIXED 行为**:
|
||
- 优先选刚好 `maxLines` 的解;无解时按固定降级链路处理并打点
|
||
- **复杂度可控**:超长输入触发裁剪/兜底并返回 reason(如 `TOO_LONG`)
|
||
|
||
## 依赖与关联
|
||
|
||
- **依赖**:`core-contract`、`width-measurement`、`breakpoint-candidates`、`scoring-tiebreak`、`overflow-fallback`
|
||
- **被依赖**:`integration`、`golden-tests`
|
||
|