Elasticsearch 核心:NRT 近实时搜索原理 + 应用场景全解析
-
- 一、前言
- 二、什么是 NRT 近实时搜索?
-
- 2.1 官方定义
- 2.2 通俗理解
- 2.3 核心延迟
- 三、为什么 Elasticsearch 是 NRT,而不是完全实时?
-
- 3.1 Elasticsearch 写入到可搜索流程图
- 3.2 关键结论
- 四、NRT 近实时搜索的核心原理(简单讲清楚)
-
- 4.1 核心机制:Refresh
- 4.2 近实时延迟 = Refresh 间隔
- 五、NRT 近实时搜索的特点
- 六、Elasticsearch NRT 近实时搜索的应用场景
-
- 6.1 电商商品搜索(最经典)
- 6.2 订单/物流实时查询
- 6.3 实时日志监控系统(ELK)
- 6.4 实时数据分析 & 大屏展示
- 6.5 内容平台(新闻/文章/短视频)搜索
- 6.6 实时推荐 / 用户行为搜索
- 七、不适合 NRT 的场景(必须知道)
- 八、如何控制 NRT 近实时延迟?
-
- 8.1 提高实时性(降低延迟)
- 8.2 提高写入性能(批量导入)
- 九、总结(3 句核心口诀)
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在 Elasticsearch 的官方介绍中,第一句话就是:“Elasticsearch is a distributed, RESTful, search and analytics engine capable of near real-time (NRT) searching.”
NRT(Near Real-Time,近实时搜索) 是 Elasticsearch 最核心、最重要的特性之一,也是它能秒杀传统数据库做搜索的关键原因。
很多同学不明白:数据写入 ES 后,为什么不是立刻查到?NRT 到底是什么?延迟是多少?适用于哪些业务?
本文将用通俗语言 + 流程图 + 企业级场景,彻底讲清 NRT 近实时搜索,标准 CSDN 博客格式,可直接发布。
二、什么是 NRT 近实时搜索?
2.1 官方定义
Near Real-Time (NRT) 近实时搜索: 数据写入 Elasticsearch 后,经过极短的延迟(默认 1 秒),就可以被搜索到。
2.2 通俗理解
- 实时搜索(Real-Time):写入成功,立刻查到(0 延迟)
- 近实时搜索(NRT):写入成功后,等待极短时间(1s) 就能查到
- Elasticsearch 默认就是 NRT 近实时搜索
2.3 核心延迟
ES 默认延迟:1 秒(refresh_interval) 这 1 秒就是 NRT 的核心。
三、为什么 Elasticsearch 是 NRT,而不是完全实时?
要理解这一点,必须看 数据写入 → 可被搜索 的流程。
3.1 Elasticsearch 写入到可搜索流程图
#mermaid-svg-5YMlR7gTMkdaSSpv{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5YMlR7gTMkdaSSpv .error-icon{fill:#552222;}#mermaid-svg-5YMlR7gTMkdaSSpv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5YMlR7gTMkdaSSpv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5YMlR7gTMkdaSSpv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5YMlR7gTMkdaSSpv .marker.cross{stroke:#333333;}#mermaid-svg-5YMlR7gTMkdaSSpv svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5YMlR7gTMkdaSSpv p{margin:0;}#mermaid-svg-5YMlR7gTMkdaSSpv .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv .cluster-label text{fill:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv .cluster-label span{color:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv .cluster-label span p{background-color:transparent;}#mermaid-svg-5YMlR7gTMkdaSSpv .label text,#mermaid-svg-5YMlR7gTMkdaSSpv span{fill:#333;color:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv .node rect,#mermaid-svg-5YMlR7gTMkdaSSpv .node circle,#mermaid-svg-5YMlR7gTMkdaSSpv .node ellipse,#mermaid-svg-5YMlR7gTMkdaSSpv .node polygon,#mermaid-svg-5YMlR7gTMkdaSSpv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5YMlR7gTMkdaSSpv .rough-node .label text,#mermaid-svg-5YMlR7gTMkdaSSpv .node .label text,#mermaid-svg-5YMlR7gTMkdaSSpv .image-shape .label,#mermaid-svg-5YMlR7gTMkdaSSpv .icon-shape .label{text-anchor:middle;}#mermaid-svg-5YMlR7gTMkdaSSpv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5YMlR7gTMkdaSSpv .rough-node .label,#mermaid-svg-5YMlR7gTMkdaSSpv .node .label,#mermaid-svg-5YMlR7gTMkdaSSpv .image-shape .label,#mermaid-svg-5YMlR7gTMkdaSSpv .icon-shape .label{text-align:center;}#mermaid-svg-5YMlR7gTMkdaSSpv .node.clickable{cursor:pointer;}#mermaid-svg-5YMlR7gTMkdaSSpv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5YMlR7gTMkdaSSpv .arrowheadPath{fill:#333333;}#mermaid-svg-5YMlR7gTMkdaSSpv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5YMlR7gTMkdaSSpv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5YMlR7gTMkdaSSpv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5YMlR7gTMkdaSSpv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5YMlR7gTMkdaSSpv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5YMlR7gTMkdaSSpv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5YMlR7gTMkdaSSpv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5YMlR7gTMkdaSSpv .cluster text{fill:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv .cluster span{color:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5YMlR7gTMkdaSSpv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5YMlR7gTMkdaSSpv rect.text{fill:none;stroke-width:0;}#mermaid-svg-5YMlR7gTMkdaSSpv .icon-shape,#mermaid-svg-5YMlR7gTMkdaSSpv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5YMlR7gTMkdaSSpv .icon-shape p,#mermaid-svg-5YMlR7gTMkdaSSpv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5YMlR7gTMkdaSSpv .icon-shape .label rect,#mermaid-svg-5YMlR7gTMkdaSSpv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5YMlR7gTMkdaSSpv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5YMlR7gTMkdaSSpv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5YMlR7gTMkdaSSpv :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
写入文档
写入内存缓冲区
缓冲区数据还不能搜索
默认每隔 1s 执行 Refresh
生成 Segment 段
进入文件系统缓存
可以被搜索!NRT 完成
3.2 关键结论
四、NRT 近实时搜索的核心原理(简单讲清楚)
4.1 核心机制:Refresh
- ES 不会每条数据都立即构建索引
- 而是批量攒一批数据 → 一次性生成索引段(Segment)
- 这个“批量生成”的动作叫 Refresh
- 默认:每 1 秒 Refresh 一次
4.2 近实时延迟 = Refresh 间隔
- refresh_interval: 1s → 近实时延迟 1 秒
- 你可以调整,但越频繁写入性能越差
- 这是 搜索性能与写入性能 的平衡
五、NRT 近实时搜索的特点
六、Elasticsearch NRT 近实时搜索的应用场景
NRT 是 ES 的默认工作模式,几乎所有搜索业务都依赖它。 下面是最典型、最核心、企业最常用的场景:
6.1 电商商品搜索(最经典)
- 商品上架、修改价格、更新库存
- 要求 1~3 秒内生效
- 不需要毫秒级实时
- NRT 完全满足
6.2 订单/物流实时查询
- 订单创建、物流状态更新
- 要求 几秒内可查
- NRT 完美支持
6.3 实时日志监控系统(ELK)
- 日志产生 → 写入 ES
- 1 秒后可检索
- 满足实时监控、告警、排查
6.4 实时数据分析 & 大屏展示
- 实时统计销售额、访问量、用户行为
- 数据延迟 1~5 秒 完全可接受
- NRT 是标准方案
6.5 内容平台(新闻/文章/短视频)搜索
- 文章发布、视频上传
- 几秒内可搜索 即可
- NRT 高性能支撑
6.6 实时推荐 / 用户行为搜索
- 用户行为日志实时写入
- 秒级延迟即可支撑推荐系统
七、不适合 NRT 的场景(必须知道)
NRT 不适合强实时、强一致性场景:
- 金融交易(必须 0 延迟)
- 支付状态(必须立刻可见)
- 库存锁(必须强一致)
这类场景必须用 数据库(MySQL/Redis),ES 只负责异步同步后搜索。
八、如何控制 NRT 近实时延迟?
8.1 提高实时性(降低延迟)
"refresh_interval": "500ms"
优点:数据更快被搜到 缺点:写入性能下降
8.2 提高写入性能(批量导入)
"refresh_interval": "-1" # 关闭自动刷新
导入完成后再打开:
"refresh_interval": "1s"
九、总结(3 句核心口诀)
一句话总结: Elasticsearch 的近实时搜索(NRT),是高性能写入 + 低延迟查询的最佳平衡。

|
🌺The End🌺点点关注,收藏不迷路🌺 |






