首页/数据/NoSQL 速查/Elasticsearch 作为检索层而非主存储
选型与架构50 条

Elasticsearch 作为检索层而非主存储

ES 面向检索与分析:默认近实时(写入到可搜索有刷新间隔)、更新会重建整篇文档、无跨文档事务,深分页受限;把业务数据全量托付给它需要慎重,常见做法是主存 + 检索副本。

NoSQL 速查数据更新于 2026-10-13

为什么强调检索层定位

Elasticsearch 面向检索与分析:写入到可搜索之间有刷新间隔,更新是整篇文档重建,没有跨文档事务,深分页也受结果窗口限制。这些特性决定了它更适合当检索与分析层,而不是唯一的数据真相。

常见架构长什么样

权威数据放在关系库或文档库,通过变更捕获或同步任务写进 ES 承担检索与聚合,需要重建索引时可以从主存回灌。这样即使索引被误删或映射改错,也能在可控时间内恢复。按 ID 读取是实时的,所以"写入后立刻回查详情"这类需求用 ID 查询就能满足。

基本信息

近实时默认 refresh_interval 为 1 秒,搜索可见性有延迟
更新成本文档级整体重建,频繁更新字段代价高、段合并压力大
事务没有跨文档事务,只有文档级版本并发控制
分页from 加 size 受结果窗口限制,深分页要用 search_after 或 PIT
按 ID 读取实时,不受刷新间隔影响

示例

示例
# 写入后立刻搜索可能查不到(还没刷新)
POST /orders/_doc/1
{ "status": "created" }
GET /orders/_search?q=status:created

# 按 ID 读取不受 refresh 影响,写入后立即可见
GET /orders/_doc/1

# 确实需要立刻可搜索时显式刷新(代价高,不适合高频调用)
POST /orders/_refresh

典型使用场景

  • 站内搜索:商品、文章与日志的全文检索与聚合统计
  • 读写分离:主存负责事务与一致性,检索层负责查询与排序
  • 重建索引:映射调整后从主存回灌,不影响在线写入
  • 日志分析:高写入吞吐、近实时检索的场景
  • 多条件筛选:把复杂的组合查询与排序交给检索层

关键差异与建议

关注点ES 的表现架构建议
写入可见性近实时,存在刷新延迟实时性敏感的场景改用按 ID 读取
更新整篇重建,更新放大高频变化字段留在主存,减少更新
事务无跨文档事务关键约束放在主存,检索层只做副本
分页深分页受限用 search_after 或 PIT 代替 from 加 size
常见架构是主存加检索副本:权威数据在主存,经同步链路写入 ES 承担检索与聚合,重建索引可以从主存随时回灌。
把 ES 当唯一数据源时,一次误删索引就是数据事故;快照仓库、回灌链路与索引模板要当作基础设施提前建好,而不是出事后再补。

易错点

  • 主键以 ES 文档 ID 为准会丢掉唯一约束与事务保护,业务键应来自权威存储
  • 把 ES 当唯一数据源时一次误删索引就是数据事故,快照与回灌链路要预先建设
  • 依赖写入后立即搜索会偶发查不到数据,实时性要求高的路径应改用按 ID 读取
  • 频繁更新同一文档会触发整篇重建与段合并,成本与延迟都远高于普通写入

数据来源与参考

  • Elasticsearch Guide: Reading and writing documents
  • Elasticsearch Guide: Near real-time search
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌