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

完整教程:ElasticSearch倒排索引原理

文章目录

  • 从正向索引说起
    • 正向索引的查询过程
  • 倒排索引
    • 倒排索引的查询过程
  • 倒排索引的构建过程
    • 1. 文档分析阶段
    • 2. 倒排索引构建
    • 3. _source存储
  • ElasticSearch搜索过程详解
    • 核心原理
    • 两大核心阶段:索引构建 & 文档搜索
    • 为什么倒排索引如此高效?
  • 总结

从正向索引说起

在理解倒排索引之前,我们先来看看什么是正向索引。正向索引是我们最直观、最熟悉的数据组织方式,它建立的是"文档ID文档内容"的映射关系。

正向索引的查询过程

当用户搜索"ElasticSearch"时,正向索引的查询过程是:

1. 从doc1开始逐个检查文档内容
doc1: "ElasticSearch是..."  包含"ElasticSearch"
2. 检查doc2: "Lucene是ElasticSearch..."  包含"ElasticSearch"
3. 检查doc3: "搜索引擎广泛..."  不包含"ElasticSearch"
4. 检查doc4: "分布式系统..."  不包含"ElasticSearch"
5. 检查doc5: "ElasticSearch基于..."  包含"ElasticSearch"
查询结果: [doc1, doc2, doc5]

倒排索引

倒排索引反其道而行之,建立的是"词条文档列表"的映射关系。

倒排索引的查询过程

当用户搜索"ElasticSearch"时:

1. 查询词条标准化: "ElasticSearch" → "elasticsearch"
2. 直接在倒排索引中查找: "elasticsearch" → [(doc1, [0], 1), (doc2, [2], 1), (doc5, [0], 1)]
3. 提取文档ID: [doc1, doc2, doc5]
4. 从_source中获取完整文档内容返回
查询时间复杂度: O(1) 或接近 O(1)

倒排索引的构建过程

1. 文档分析阶段

当新文档写入ES时,首先要经过文档分析阶段。这个阶段是构建倒排索引的起点。

分词处理
ES使用分析器(Analyzer)对文档进行处理,分析器包含三个核心组件:

例如,对于文档 {"title": "The Quick Brown Fox"}

原始文本: "The Quick Brown Fox"
经过分析器: ["the", "quick", "brown", "fox"]

2. 倒排索引构建

经过分析后的词条会被用来构建倒排索引:

词条    | 文档列表(包含文档ID、位置、频率)
--------|--------------------------------
the     | [(doc1, [0], 1)]
quick   | [(doc1, [1], 1)]
brown   | [(doc1, [2], 1)]
fox     | [(doc1, [3], 1)]

3. _source存储

重要的是,ES会将原始的JSON文档完整保存在一个名为 _source 的字段中。这个设计非常关键:

  • 倒排索引用于快速检索
  • _source用于返回完整的原始文档内容

ElasticSearch搜索过程详解

核心原理

用户写入文档时分词构建倒排索引,搜索时对查询语句同样分词,然后通过倒排列表快速找到匹配的文档ID,最后从原始存储中取出文档返回结果。

两大核心阶段:索引构建 & 文档搜索

阶段关键步骤核心作用
阶段1:索引构建(文档写入)
接收文档接收JSON文档,如 {"title": "The Quick Brown Fox", "content": "..."}原始数据输入
文本分析(Analysis)使用分析器进行分词、小写转换等处理 → ["the", "quick", "brown", "fox"]文本标准化处理
构建倒排索引记录每个词出现在哪些文档(Doc ID)、出现位置、词频统计建立快速检索的核心数据结构
存储_source原始JSON文档完整保存在_source字段中,用于结果返回保证数据完整性
索引阶段完成建立了"词条 → 文档ID"的映射关系为快速搜索打下基础
阶段2:搜索查询(文档检索)
用户输入查询用户输入搜索语句,如 "quick brown" 或复杂的DSL查询搜索需求输入
查询分析使用相同的分析器对查询进行分词 → ["quick", "brown"]查询标准化(保证一致性)
查询倒排列表分别查找 quickbrown 出现在哪些文档中利用倒排索引快速定位
计算文档交集找出同时包含多个查询词的文档,进行布尔运算精确匹配文档筛选
相关性排序使用BM25等算法计算文档与查询的相关性得分结果质量优化
获取原始文档根据文档ID从_source中读取完整的原始内容完整信息返回
返回搜索结果包含文档内容、相关性得分、高亮显示等信息用户体验优化
搜索阶段完成毫秒级返回精准的搜索结果高效搜索体验

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

传统数据库的模糊查询

SELECT * FROM documents WHERE content LIKE '%elasticsearch%';

这种方式需要全表扫描,时间复杂度为O(n)。

ES倒排索引查询

elasticsearch -> [doc1, doc5, doc12, doc89, ...]

直接通过词条定位文档,时间复杂度接近O(1)。

总结

ES通过倒排索引先找到文档ID,再获取文档内容

Elasticsearch通过"写时建索引、读时查索引"的核心机制,利用倒排索引这一精妙数据结构实现毫秒级全文检索。其中,文档分析确保了查询的一致性,倒排索引提供了检索的高效性,而_source存储保证了数据的完整性。三者协同工作,共同构建了现代搜索引擎的技术基石。

http://www.gsyq.cn/news/9489.html

相关文章:

  • 负载排查和分析三
  • 完整教程:线程、进程、协程
  • CF913G Power Substring
  • ES集群部署-EFK架构实战 - 实践
  • 《BOE解忧实验室》第四季圆满收官 以科技重塑文化生活新范式
  • 洛谷P2261 [CQOI2007] 余数求和
  • 完整教程:uniapp、devceo华为鸿蒙运行模拟器报错:未开启Hyper-V
  • 深入解析:08_多层感知机
  • (一)React面试(虚拟DOM/类组件) - 详解
  • 浏览器访问页面卡顿刷新页面方法
  • 完整教程:散斑深度相机原理
  • k8s Understanding Kubernetes Security Components
  • G1垃圾回收过程
  • Trellix自动化大规模修复开源漏洞,已修补超6万个项目
  • 人形机器人 —— 电机控制的三种模式 —— 力矩、速度、位置
  • 解决Windows更新后WPF代码报TypeLoadException异常的困难
  • PC与基恩士PLC通信的C#实现
  • Excel 表格技能
  • rk3588的ai功能和deepseek
  • EPSON L1300打印机清零教程
  • tomcat CPU数量和线程数的关系
  • python处理Excel单机小程序:匹数据,增强版VLookup
  • CF623B Array GCD
  • Python爬虫实现双色球历史数据抓取
  • 酵母细胞工厂全球调控策略研究进展:从遗传编辑到智能响应
  • Java实现双色球历史开奖对比器
  • 成都恒利泰HT-SCA-4-10+是一款1分4射频功分器
  • 研发项目管理能力建设路线图
  • 好用的提示词
  • 使用 AI app 模板扩展来创建基于订制数据进行聊天的 .NET AI 应用