欢迎光临
我们一直在努力

Elasticsearch 核心:NRT 近实时搜索原理 + 应用场景全解析

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 关键结论

  • 写入内存缓冲区 = 还不能搜索
  • Refresh 操作 = 让数据变成可搜索
  • Refresh 默认 1 秒执行一次
  • 所以:ES 是近实时(1s 延迟),不是完全实时

  • 四、NRT 近实时搜索的核心原理(简单讲清楚)

    4.1 核心机制:Refresh

    • ES 不会每条数据都立即构建索引
    • 而是批量攒一批数据 → 一次性生成索引段(Segment)
    • 这个“批量生成”的动作叫 Refresh
    • 默认:每 1 秒 Refresh 一次

    4.2 近实时延迟 = Refresh 间隔

    • refresh_interval: 1s → 近实时延迟 1 秒
    • 你可以调整,但越频繁写入性能越差
    • 这是 搜索性能与写入性能 的平衡

    五、NRT 近实时搜索的特点

  • 延迟极低:默认 1 秒,几乎无感
  • 写入性能高:批量构建索引
  • 高吞吐:支撑高并发写入
  • 高可用:分布式架构
  • 最终一致性:保证数据最终一定能查到

  • 六、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 句核心口诀)

  • NRT = Near Real-Time = 近实时搜索
  • ES 默认 1 秒延迟,数据写入后 1s 可查
  • 适用于绝大多数搜索、日志、分析业务
  • 一句话总结: Elasticsearch 的近实时搜索(NRT),是高性能写入 + 低延迟查询的最佳平衡。

    在这里插入图片描述

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

    赞(0)
    未经允许不得转载:171主机测评 » Elasticsearch 核心:NRT 近实时搜索原理 + 应用场景全解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址