Elasticsearch近实时搜索揭秘:1秒内可查如何实现?

当你在 Kibana 中查询刚生成的日志,或在电商网站搜索刚上架的商品时,可能会好奇:数据写入后不到 1 秒就能搜到,这是如何实现的?

这背后就是 Elasticsearch (ES) 的“近实时”(Near Real-Time, NRT)能力。本文将通俗地解析从写入到可查的完整链路。


🎯 什么是“近实时” (NRT)?

  • 实时 (Real-time):数据写入后,立刻对所有操作可见。
  • 近实时 (Near Real-time):数据写入后,通常在1 秒内即可被搜索到。

ES 官方也强调其提供的是近实时搜索,默认情况下文档在写入后 1 秒内可被检索。这里的“秒级延迟”正是实现高性能写入和高并发查询的关键设计权衡。


🚀 为什么能这么快?

ES 的速度源于其精巧的架构设计:

  1. 分布式分片:一个索引被拆分为多个主分片(Primary Shard),分布在不同节点上并行处理请求,极大提升了吞吐量。
  2. 倒排索引:这是搜索引擎的核心。它将文档内容分词,形成“词 → 文档列表”的映射,查询时直接定位词,无需全表扫描,效率极高。
  3. Lucene 与 Segment:每个分片本质上是一个 Lucene 实例,由多个不可变的Segment (段)构成。查询时,ES 会并行搜索所有相关分片的所有 Segment,并合并结果。

🗺️ 数据写入与可查的完整链路

一条文档从写入到可被搜索,会经历以下关键阶段:

  1. 请求路由:客户端请求到达任一节点(协调节点),该节点根据文档 ID 计算出目标主分片,并将请求转发过去。
  2. 写入内存与日志:主分片节点将文档写入Index Buffer (内存缓冲区),同时追加写入Translog (事务日志)。此时数据在内存中,不可搜索
  3. Translog 刷盘:为保证数据安全,Translog 会定期(默认每 5 秒)或每次请求后(默认策略)通过fsync强制写入磁盘。这确保了即使节点宕机,数据也能从 Translog 中恢复。
  4. Refresh (刷新) - 变为可查:这是实现“近实时”的核心。默认每秒,ES 会将 Index Buffer 中的文档生成一个新 Segment,并写入文件系统缓存 (OS Cache)。这个新 Segment 会立即被打开,其中的文档从此刻起可被搜索。此过程不保证数据已落盘。
  5. Flush (刷盘) - 持久化:当 Translog 达到一定大小(默认 512MB)或时间(默认 30 分钟)时,会触发 Flush。Flush 会执行一次 Refresh,然后调用fsync将所有 Segment 强制写入磁盘,并更新提交点 (Commit Point),最后清空旧的 Translog。至此,数据才完成了真正的持久化。
  6. 副本同步:主分片写入成功后,会将操作并行发送给所有副本分片。副本分片重复上述写入、Refresh 和 Flush 流程。只有当所有副本都确认成功后,主分片才会向客户端返回成功响应。

💡 更新与删除是如何实现的?

由于 Segment 是不可变的,ES 采用“标记-删除”和“新增”的策略:

  • 删除:在.del文件中标记该文档为已删除。查询时,结果会过滤掉这些被标记的文档。
  • 更新:本质是“先删除,后新增”。旧文档被标记删除,新版本的文档作为一个新文档被索引到新的 Segment 中。

🧩 Segment 合并 (Merge)

频繁的 Refresh 会产生大量小 Segment,影响查询效率。为此,ES 后台会启动Merge (合并)任务:

  • 将多个小 Segment 合并成少数几个大 Segment。
  • 在合并过程中,物理删除那些已被标记删除的文档。
  • 更新提交点,并删除旧的小 Segment 文件。

由于 Segment 不可变,合并过程不会阻塞写入和查询,但会消耗 I/O 和 CPU 资源。


🔍 补充:按 ID 查询为何更快?

你可能会发现,有时刚写入的文档,通过GET /index/_doc/id能立刻查到,但搜索却搜不到。这是因为:

  • 按 ID 查询:会先检查 Translog 中是否有该文档的最新版本,因此能读到最新数据。
  • 全文搜索:依赖倒排索引,必须等待 Refresh 生成新的 Segment 后才能被搜索到。

⚙️ 相关参数与调优建议

理解以下参数有助于你根据业务场景进行调优:

  • index.refresh_interval:控制 Refresh 频率。调大(如30s)可提升写入吞吐;调小(如100ms)可加快搜索可见性,但会增加开销。批量导入时可临时设为-1关闭,完成后再恢复。
  • index.translog.durabilitysync_interval:控制 Translog 的刷盘策略。request模式(默认)每次请求后刷盘,最安全但性能稍低;async模式(如每 5s 刷盘)性能更高,但有数据丢失风险。
  • index.translog.flush_threshold_size:控制 Translog 触发 Flush 的大小阈值(默认 512MB)。

🔥 关注公众号【云技纵横】,目前正在更新分布式缓存进阶技巧和干货


🎯 总结

Elasticsearch 的“近实时”并非魔法,而是通过以下设计实现的:

  • 近实时可见:依靠Refresh机制,将内存数据快速生成 Segment 并提供搜索。
  • 数据不丢失:依靠Translog预写日志,确保数据安全。
  • 最终持久化:依靠FlushMerge机制,将数据稳定写入磁盘并优化查询性能。

正是这种精巧的平衡,使得 ES 能够在亿级数据量下,依然实现毫秒级的查询响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Llama 3在哪些领域有实际应用?

1.Llama 3在哪些领域有实际应用?Llama 3 凭借其开源、高性能、可微调、支持长上下文和多语言等优势,已在多个领域展现出广泛的实际应用价值。尽管原生版本对中文支持有限,但通过微调(SFT/LoRA)或结合RAG(检…

导师严选9个AI论文工具,自考本科论文格式规范+写作神器推荐!

导师严选9个AI论文工具,自考本科论文格式规范写作神器推荐! AI 工具如何让论文写作更高效 在自考本科的道路上,论文写作无疑是一个重要且令人头疼的环节。随着人工智能技术的不断进步,越来越多的 AI 工具被应用于学术写作中&#…

OpenOCD JTAG协议开发完全指南

OpenOCD JTAG协议开发完全指南 版本: 1.0 日期: 2026年1月 适用范围: RISC-V调试、FPGA开发、嵌入式系统调试 目录 JTAG基础概念 OpenOCD架构 JTAG协议层次 JTAG状态机 IR/DR扫描操作 OpenOCD API详解 RISC-V调试规范 实际应用案例 常见问题排查 JTAG基础概念 什么是JTAG? …

使用 pip3 一键卸载当前环境中所有已安装的 Python 包(Linux / macOS / Windows)

在 Python 开发过程中,随着不断安装和测试各种库,环境很容易变得臃肿、混乱。 当出现依赖冲突、版本错乱或准备重建环境时,一次性卸载所有第三方包是一个高效的解决方案。 本文介绍一种通用、安全、可控的方法,适用于:…

【总结】说课基本框架

高中信息技术课程说课的基本框架通常围绕教学设计的系统性、科学性和育人价值展开,强调以学生为中心、项目驱动、素养导向。根据所提供的知识库内容,可总结出一个清晰、通用且符合当前教改趋势的说课结构如下:一、教…

Linux运维必备:一个LVM管理添加和扩容脚本的诞生记(完整版)

从简单需求到踩坑无数,最终炼成自动化神器。本文记录了一个LVM管理脚本的完整开发历程,包含所有踩过的坑和最终解决方案。附赠可直接使用的纯净版脚本。一、起因:一个看似简单的小需求那天,一位运维兄弟在群里求助:&qu…

openocd操作ku060板子记录

OpenOCD 操作 KU060 FPGA 核心原理 概述 本文档深入解析 OpenOCD 如何通过 JTAG 接口操作 KU060 FPGA 开发板,包括 Flash 刷写、内存检查、GDB 调试和板子状态检查等核心功能的底层原理。1. OpenOCD 架构与连接原理 1.1 JTAG 接口连接 主机(PC) --USB--> FT2232 …

《排序算法全解析:从基础到优化,一文吃透八大排序!》

本文详解冒泡、选择、插入等基础排序,以及快排、归并、堆排、希尔等高级排序的原理、c语言代码实现,对比各算法时间复杂读/空间复杂度,附代码详细注释,帮你彻底搞懂排序!一、为什么我们需要读懂排序--不止于"…

Linux命令大全-grep命令

一、简介grep(英文全拼: Global Regular Expression Print)命令用于查找文件里符合条件的字符串或正则表达式,并将符合条件的内容进行输出。二、语法语法:grep [选项]... PATTERN [FILE]...PATTERN:是一个基本正则表达式(缩写为BRE)&#xff…

ue c++编译报错解决

目录 e1696 无法打开 源 文件 "IMQTTClient.h" 解决方法: e1696 无法打开 源 文件 "IMQTTClient.h" 解决方法: 删除 目录: .vs Binaries Intermediate Saved 选中文件: MetahumancharacterHeiXi.uproje…

解析nanogpt - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机毕业设计springboot线上票务系统app 基于Spring Boot的移动票务管理平台开发 Spring Boot框架下的线上票务系统设计与实现

计算机毕业设计springboot线上票务系统app_ck27e (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展,线上票务系统已经成为人们日常生活中不可…

集合幂级数全家桶

集合幂级数 exp 求 \(e^{F(x)} = \sum\limits_{i \ge 0} \dfrac{F(x)^i}{i!}\),其中若 \(S \cap T = \varnothing\),则 \(x^S \times x^T = x^{S \cup T}\)。 定义二元函数 \(F(x, y) = \sum x^S y^{|S|} a_S\),这样…

计算机毕业设计springboot大气网格化治理智慧平台-报警处理子系统 基于SpringBoot的城市大气环境网格化智能预警与处置平台 SpringBoot驱动的空气质量网格监管报警协同系统

计算机毕业设计springboot大气网格化治理智慧平台-报警处理子系统9w1d1 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。PM2.5爆表那天,整个城市像被按下了灰色滤镜。…

AtCoder Beginner Contest竞赛题解 | AtCoder Beginner Contest 440

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

近十届两院增选院士籍贯 / 出生地排行:苏浙皖湘鲁霸榜

整理了近十届两院增选院士的籍贯、出生地数据: ✅ 维度一:院士「籍贯」(最能体现地域文教底蕴) 籍贯人数 TOP20 核心榜单(头部集中度极高) 1、浙江宁波 28 人(全国第一,70年的稳定输…

LeetCode 379 电话目录管理系统

文章目录摘要描述题解答案题解代码分析1. 数据结构的选择2. 初始化方法3. get() 方法:分配号码4. check() 方法:检查号码是否可用5. release() 方法:释放号码6. 为什么使用 Set Array 的组合?7. 边界情况处理示例测试及结果示例 …

量子计算模拟器性能基准测试方法论

随着量子算法在金融建模、药物研发等领域的应用突破,量子计算模拟器已成为经典计算机环境验证量子程序的核心工具。软件测试从业者亟需建立一套针对量子特性的标准化基准测试体系。本文旨在系统阐述测试框架的设计原则、关键性能指标及工具链实践方案,为…

基于微信小程序的电子元器件商城系统源码文档部署文档代码讲解等

课题介绍本课题旨在开发一款基于微信小程序的电子元器件商城系统,适配电子元器件品类多、规格杂、采购场景多元的特性,解决传统采购渠道分散、比价繁琐、库存查询不便等痛点。系统以微信小程序为前端载体,依托Node.js搭建后端服务&#xff0c…

【Linux 网络】拒绝传输卡顿!滑动窗口如何让数据 “跑赢” 等待?

一、滑动窗口滑动窗口大小:指的是无需等待确认应答而可以继续发送数据的最大值;注意:这里的无需等待确认应答,不是不要确认应答,而是暂时不要;站在发送方(主机A 视角):图…