ElasticSearch vs MongoDB
从 定位 -> 数据模型 -> 查询能力 -> 一致性 -> 性能 -> 运维 -> 典型场景 七个维度的对比总结。
MongoDB 是通用型文档数据库,解决“存储 + 事务 + 查询”;
ElasticSearch 是搜索与分析引擎,解决“全文检索 + 实时分析”。
二者不是同一类产品,更多是互补而不是替代。
| 维度 | ElasticSearch | MongoDB |
|---|---|---|
| 本质 | 搜索 / 分析引擎 | 文档数据库 |
| 底层核心 | Lucene(倒排索引) | B-Tree / WiredTiger |
| 设计目标 | 快速搜索 + 聚合 | 可靠存储 + 查询 |
| 是否能做主库 | ❌ 不推荐 | ✅ 推荐 |
| 维度 | ES | MongoDB |
|---|---|---|
| 数据单元 | Document | Document |
| 数据格式 | JSON | BSON |
| Schema | 强(mapping) | 弱 / 可选 |
| 主键 | _id | _id |
| 表结构变更 | 重建索引 | 在线修改 |
关键点
- ES:Schema-on-write(写入时定结构)
- MongoDB:Schema-on-read(更灵活)
| 能力 | ES | MongoDB |
|---|---|---|
| 分词 | 强 | 弱 |
| 相关度评分 | BM25 | 简单 |
| 高亮 | 原生支持 | 受限 |
| 模糊搜索 | 强 | 一般 |
👉 只要涉及“搜索体验”,ES 完胜
| 能力 | ES | MongoDB |
|---|---|---|
| 精确匹配 | 可 | 强 |
| 范围查询 | 可 | 强 |
| 复杂条件 | 有限制 | 强 |
| JOIN | ❌ | $lookup |
👉 复杂业务查询 MongoDB 更合适
| 维度 | ES | MongoDB |
|---|---|---|
| 事务 | ❌ | ✅(多文档) |
| ACID | ❌ | ✅ |
| 一致性 | 最终一致 | 强一致 |
| 更新机制 | delete + insert | in-place |
结论
- 不能用 ES 承载核心业务写
- MongoDB 可以作为主业务库
| ES | MongoDB | |
|---|---|---|
| 写入路径 | buffer -> segment | WAL -> B-Tree |
| 更新 | 写放大 | 原地更新 |
| 批量写 | 非常强 | 强 |
| ES | MongoDB | |
|---|---|---|
| 并发搜索 | 极强 | 一般 |
| 聚合分析 | 极强 | 中 |
| 深度分页 | 弱 | 强 |
| 维度 | ES | MongoDB |
|---|---|---|
| 分片 | 必须 | 可选 |
| 副本 | 索引级 | 集合级 |
| 扩容 | 天然 | 成本较高 |
| 再平衡 | 自动 | 手动干预多 |
| 维度 | ES | MongoDB |
|---|---|---|
| JVM 调优 | 必须 | 不需要 |
| 内存管理 | 复杂 | 简单 |
| 数据膨胀 | 严重 | 可控 |
| 备份恢复 | Snapshot | mongodump / oplog |
👉 ES 运维复杂度明显更高
ElasticSearch 适合
- 全文搜索
- 日志 / 监控 / APM
- 复杂聚合分析
- 搜索推荐
- 实时分析
MongoDB 适合
- 主业务数据存储
- 高并发写入
- 灵活数据结构
- 事务型业务
- 用户画像
MySQL / MongoDB
↓
Debezium
↓
Kafka
↓
Elasticsearch(搜索 / 分析)
👉 MongoDB / MySQL 做主库,ES 做搜索引擎
| 需求 | 选择 |
|---|---|
| 强事务 | MongoDB |
| 搜索体验 | ElasticSearch |
| 日志分析 | ElasticSearch |
| 主业务数据 | MongoDB |
| 两者兼得 | MongoDB + ES |
ElasticSearch 和 MongoDB 的核心区别在于定位不同。
MongoDB 是通用型文档数据库,支持事务和强一致性,适合承载主业务数据;
ElasticSearch 是基于倒排索引的搜索与分析引擎,擅长全文检索和聚合分析,但不适合做主库。
在实际架构中,通常使用 MongoDB 或 MySQL 作为主存储,再同步数据到 ElasticSearch 提供搜索能力。