# 检索性能与复现

`SearchIndex::search` 和 `search_prefix` 从倒排表累加 BM25 得分，只给包含查询词的文档计分。之前的实现逐篇遍历文档，并在每篇文档中扫描查询词的 posting 列表。对于文档总数 `N`、查询词 posting 总长度 `P`、命中文档数 `M`，普通检索的主要工作量由约 `O(N × P)` 降为 `O(P + M log M)`；前缀检索仍需扫描词表找出匹配词。

## 测量结果

以下结果来自 2026-09-24 的一次本地 `moon bench --target wasm-gc`，使用 MoonBit `0.1.20260807` / `moonc 0.10.7`。同一机器、同一基准代码、同一目标，在修改前后分别运行。数字是基准均值，受机器负载和运行时状态影响，不能视为跨机器承诺。

| 负载 | 修改前 | 修改后 | 本次比值 |
| --- | ---: | ---: | ---: |
| 50 篇文档，查询 `RAG 检索` | 9.73 µs | 3.93 µs | 2.5× |
| 2,000 篇文档，仅最后一篇含 `raretarget` | 62.79 µs | 0.449 µs | 140× |
| 2,000 篇文档，全部含 `moonbit` | 1.15 ms | 99.05 µs | 11.6× |

基准负载在 `bench_test.mbt`，可用以下命令复测：

```bash
moon bench --target wasm-gc
```

基准之外，`index_test.mbt` 验证排序、BM25 分数、重复查询词、删除后检索及 JSON 往返；`boolean_prefix_test.mbt` 验证前缀检索的同分排序和结果上限。短语和布尔查询仍使用逐文档过滤路径，此次性能数字不适用于这两种模式。
