935 字
约 3 分钟
8
S13-A04 · 聚合搜索设计与文档库(MongoDB)

适用读者:要做"跨多个数据源的统一搜索"、或在选文档库的人。
前置:S13-A02。
覆盖旧文:437(通用型聚合搜索设计,277 点)+ S12 移交的 5 张 MongoDB 卡(2616/1844/494/1571/1580,duplicate_ref)。
覆盖扩展:E-S13-013(聚合设计)、E-S13-014(MongoDB 边界)。
上一篇:S13-A03 · 向量库选型:ES vs 专用向量库
下一篇:S13-X01 · 八股速查。


1. 一句话结论

聚合搜索的本质是"统一查询协议 + 多源适配 + 统一排序";它不要求把所有数据搬进一个库,而是要求"对外像一张表"。

客户端 → 统一查询 DSL
            ├─ 适配器 A(ES)   → 相关度排序
            ├─ 适配器 B(MySQL)→ 精确过滤
            └─ 适配器 C(向量库)→ 语义召回
                    ↓
                合并 + 重排 + 权限过滤

2. 聚合设计的五个组件(E-S13-013)

组件 职责
统一查询协议 分页/过滤/排序/关键词的公共表达
适配器 把统一协议翻译成各源的原生查询
合并层 去重、打分归一、分页对齐
权限过滤 在合并前过滤(安全边界)
降级 某源超时 → 返回部分结果并标注

两条铁律:

铁律 原因
权限过滤必须在召回阶段 合并后再过滤会泄露结果数/顺序
分页要"源内多取、合并后截断" 各源分页语义不同

3. MongoDB 的适用边界(E-S13-014、S12 移交卡)

适合 不适合
文档型数据(结构不固定) 强事务/多表关联
快速迭代的 schema 复杂聚合统计(性能)
内容/聊天记录/日志型数据 需要严格 ACID 的账务

"MongoDB vs MySQL vs ES":

需求 选
事务与关系 MySQL
灵活文档 + 中等查询 MongoDB
全文检索/聚合分析 ES

判据:"我的数据结构会频繁变吗?" 会 → MongoDB;固定且要事务 → MySQL。

3.1 与缓存的关系(S12 移交卡 A-1571/A-1580)

"MongoDB 与 Ehcache/Redis 的选型" 本质是"存储 vs 缓存":MongoDB 是数据源,Redis 是缓存层——两者不是竞品。


4. 聚合搜索的验收指标

指标 说明
召回率 相关结果是否被找到
延迟 P99 多源中最慢的那个决定整体
部分失败率 降级比例
权限正确性 越权返回数必须为 0

5. 五个误区

误区 真相
"聚合搜索要先把数据都搬到一个库" 适配器模式即可
"先合并再过滤权限" 会泄露信息
"MongoDB 能替代 MySQL" 事务与关联弱
"MongoDB 和 Redis 是竞品" 存储 vs 缓存
"多源聚合延迟取平均" 取最慢的(木桶效应)

6. 自检(架构师版)

  1. 聚合搜索的五个组件?
  2. 两条铁律是什么?
  3. MongoDB 的三个适用场景与三个禁区?
  4. 多源聚合延迟为什么取最慢?
  5. 权限过滤为什么必须在召回阶段?

7. 下一篇

S13-X01 · 搜索八股速查

最后一篇是附录索引,随后进入 S14。


本篇属于系列《S13 · 搜索与文档存储》。旧文来源:A-437 + S12 移交的 MongoDB 5 卡;扩展点 E-S13-013/014。

S13-A04 · 聚合搜索设计与文档库(MongoDB)
https://www.clxhxhhr.top/posts/5369/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。