当前位置: 首页 > news >正文

倒排索引:Elasticsearch 搜索背后的底层原理

面试题:Elasticsearch 的分片底层是如何工作的?
:每个 Elasticsearch 分片底层对应一个 Lucene 索引实例,而 Lucene 使用 倒排索引(Inverted Index) 技术来实现高效全文检索。


一、什么是倒排索引?

在搜索引擎中,倒排索引 是实现快速全文搜索的核心数据结构。与传统数据库的“正排索引”不同,它从“词”到“文档”进行映射,极大提升了关键词查询效率。


1.1 正排索引(Forward Index)——低效的全表扫描

以 MySQL 为例,假设我们有一个存储技术文章的表:

CREATE TABLE tech_blog (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT
);INSERT INTO tech_blog (title, content) VALUES 
(1, '深入理解 Linux 内核进程调度机制'),
(2, 'Kubernetes 集群部署与运维实战'),
(3, 'Elasticsearch 倒排索引原理解析'),
(4, 'Linux 系统性能调优技巧总结');

现在我们想查找内容中包含 “Linux” 的文章:

SELECT * FROM tech_blog WHERE content LIKE '%Linux%';
  • 问题:数据库必须对每行的 content 字段进行字符串匹配,即 全表扫描
  • 性能瓶颈:当数据量达到亿级时,响应时间极长,无法满足实时搜索需求。

1.2 倒排索引(Inverted Index)——搜索引擎的高效之道

Elasticsearch 使用 倒排索引 结构,将“文档 → 词语”的关系反转为“词语 → 文档”,实现秒级检索。

核心概念
术语说明
词条(Term)最小的搜索单元。英文中通常是单词(如 linux),中文需分词(如 内核调度)。
词典(Term Dictionary)所有词条的集合,通常基于 FST(Finite State Transducer)哈希表 实现,支持快速查找。
倒排表(Posting List)记录每个词条出现在哪些文档中,以及出现的位置、频率等信息。每条记录称为一个 倒排项(Posting)

二、倒排索引的构建与搜索过程

倒排索引的搜索过程:

  1. 首先,根据用户查询的内容进行分词处理,将查询字符串分割成单独的词条(术语)。此步骤确保查询能够与文档中存储的词条形式相匹配;
  2. 接着,将这些分词后的词条与倒排索引中的词典进行匹配,以验证这些词条是否存在于词典中。如果某个词条在词典中不存在,则针对该词条的搜索结束;
  3. 对于存在于词典中的每个词条,系统会查找对应的倒排表(也称为posting list),这个列表记录了包含该词条的所有文档的信息,包括但不限于文档ID、词条出现的位置以及频率等信息;
  4. 根据从倒排表中获取的信息,识别出哪些文档包含了查询的词条,并基于这些文档的唯一标识符(如"_id")来定位具体的文档;
  5. 最后,系统根据上述信息检索出符合条件的文档,并对结果进行排序和评分(如果有相关机制),然后将这些文档作为搜索结果返回给用户。

示例数据(4 篇技术文章)

文档 ID标题内容摘要
1《Linux 进程调度机制》深入理解 Linux 内核中的进程调度算法,包括 CFS 和实时调度策略。
2《K8s 部署指南》Kubernetes 集群部署需配置 etcd、kube-apiserver 和网络插件。
3《ES 倒排索引解析》Elasticsearch 使用倒排索引实现快速全文搜索,基于 Lucene 构建。
4《Linux 性能调优》通过 top、vmstat 和 iostat 工具分析 Linux 系统性能瓶颈。

步骤 1:文本分析(分词 & 归一化)

对每篇文档内容进行分析,生成词条:

  • 文档 1:linux, 内核, 进程, 调度, 算法, cfs, 实时
  • 文档 2:kubernetes, 集群, 部署, etcd, kube-apiserver, 网络, 插件
  • 文档 3:elasticsearch, 倒排, 索引, 全文, 搜索, lucene
  • 文档 4:linux, 性能, 调优, top, vmstat, iostat, 系统

📌 注:中文需依赖 IK、jieba 等分词器,英文会按空格和标点切分。


步骤 2:构建倒排索引

将词条作为键,文档 ID 列表作为值,构建倒排表:

词条倒排表(文档 ID 列表)
linux[1, 4]
内核[1]
调度[1]
cfs[1]
kubernetes[2]
集群[2]
部署[2]
elasticsearch[3]
倒排[3]
索引[3]
lucene[3]
性能[4]
调优[4]
系统[4]

步骤 3:用户搜索 —— “Linux 调度”

  1. 分词:用户输入 "Linux 调度" → 分词结果:linux, 调度
  2. 查词典
    • linux ✅ 存在 → 倒排表:[1, 4]
    • 调度 ✅ 存在 → 倒排表:[1]
  3. 合并结果
    • 取交集(AND 逻辑)→ 文档 ID:[1]
    • 若为 OR 逻辑 → 并集:[1, 4]
  4. 返回结果
    • 根据文档 ID 获取原文:返回标题为《Linux 进程调度机制》的文章。

三、为什么倒排索引如此高效?

对比维度MySQL(无索引)Elasticsearch(倒排索引)
数据量10亿篇文章10亿篇文章
查询方式全表扫描每篇文章内容只需查 linux调度 的倒排表
扫描范围10亿条记录仅扫描匹配的文档 ID 列表(如 [1,4] 和 [1])
响应时间秒级甚至分钟级毫秒级
扩展性支持分布式分片,水平扩展

核心优势:倒排索引将“大海捞针”变为“精准定位”,避免全量扫描,极大提升搜索效率。


四、Elasticsearch 中的实现细节

  • 分片(Shard):每个分片是一个独立的 Lucene 索引,拥有自己的倒排索引。
  • 段(Segment):Lucene 将数据写入不可变的“段”中,每个段有自己的倒排索引,定期合并(Merge)。
  • 近实时搜索(NRT):新文档写入后,经过 refresh(默认 1s)生成新段,即可被搜索到。
  • 相关性评分(_score):基于 TF-IDF 或 BM25 算法,根据词频、文档频率等计算匹配度。

五、总结:倒排索引的核心价值

要点说明
🔁 结构反转从“文档 → 词”变为“词 → 文档”,实现反向查找
高效检索避免全表扫描,支持亿级数据毫秒响应
🧩 支持复杂查询布尔组合(AND/OR/NOT)、短语匹配、高亮、聚合等
🌐 分布式基础每个分片独立维护倒排索引,支持水平扩展

💡 一句话总结
倒排索引是 Elasticsearch 实现快速全文搜索的基石。它通过预先构建“词 → 文档”的映射关系,将搜索问题转化为高效的查表操作,彻底解决了传统数据库在海量文本检索中的性能瓶颈。


🔗 延伸阅读

  • Lucene 官方文档
  • Elasticsearch: The Definitive Guide - Inverted Index

http://www.lryc.cn/news/610300.html

相关文章:

  • 无公网环境下在centos7.9上使用kk工具部署k8s平台(amd64架构)
  • 数字信号处理_编程实例1
  • 【前端】JavaScript基础知识及基本应用
  • C++ STL list容器详解:从基础使用到高级特性
  • AI绘图-Stable Diffusion-WebUI的基本用法
  • SwiftUI ios开发中的 MVVM 架构深度解析与最佳实践
  • 深度学习零基础入门(4)-卷积神经网络架构
  • (JAVA)自建应用调用企业微信API接口,设置企业可信IP
  • 流量见顶时代,知识付费 IP 的破局逻辑
  • 汇川PLC通过ModbusTCP转Profinet网关连接西门子PLC配置案例
  • 飞算 JavaAI 实战:从代码生成到架构优化的全场景应用指南
  • 机试备考笔记 4/31
  • springboot博客实战笔记01
  • 登Nature子刊,基于基因测序和机器学习的废水流行病学评估,病毒检出时间最高提前4周
  • 机器学习(11):岭回归Ridge
  • 服务器的Mysql 集群技术
  • 经典设计模式
  • YOLO11涨点优化:原创自研DSAM注意力!基于BiLevelRoutingAttention的颠覆性升级
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • ISCC认证:可持续生产的新标杆。ISCC如何更快认证
  • 线程互斥锁:守护临界区的关键
  • 服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份
  • 2.5 DICOM 传输语法(Transfer Syntaxes)
  • 【Canvas与文字】生存与生活
  • 文件与目录操作命令
  • SRIO入门之官方例程仿真验证
  • History 模式 vs Hash 模式:Vue Router 技术决策因素详解
  • 数据结构——并查集及C++实现
  • 0.08B参数以小博大:用小模型生成媲美GPT-4o的古典诗词