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

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)对文档进行处理,分析器包含三个核心组件:

  • Character Filter:字符过滤,如去除HTML标签
  • Tokenizer:分词器,将文本切分成词条
  • Token Filter:词条过滤,如转小写、去除停用词

例如,对于文档 {"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.xdnf.cn/news/19750.html

相关文章:

  • 02、连接服务器的几种方式
  • 人工智能机器学习入门——线性回归
  • 高光谱成像在文物考古和字画检测中的应用
  • 普通人如何用 AI 提效?5 个低门槛工具 + 3 类场景案例,让 AI 成为日常助手
  • VMWare上搭建分布式Hadoop集群
  • 不只会修图!谷歌发布官方指南,教你用 Nano Banana 玩转文生图
  • pip的缓存
  • 【STL】C++ 开发者必学字符类详解析:std::string
  • [论文阅读] 人工智能 + 软件工程 | ReCode:解决LLM代码修复“贵又慢”!细粒度检索+真实基准让修复准确率飙升
  • 【序列晋升】27 Spring Cloud Sleuth给分布式系统装上透视镜
  • 彩笔运维勇闯机器学习--逻辑回归
  • JavaScript手录进阶01-跨域问题
  • Diamond基础3:在线逻辑分析仪Reveal的使用
  • 用AI做旅游攻略,真能比人肉整理靠谱?
  • iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
  • LabVIEW软件全面解析:图形化编程的工业级应用指南
  • RL 大模型逆袭!搞定真实软件工程任务,成功率从 20% 飙到 39%,无需教师模型蒸馏
  • 如何将华为手机数据转移到OPPO手机
  • 2004-2023年各省生活垃圾无害化处理率数据(无缺失)
  • 07、上传jar包到 Linux 并启动项目
  • 9月3日星期三今日早报简报微语报早读
  • 深入解析Java Spliterator(Stream延迟、并行计算核心)
  • TensorFlow的Yes/No 关键词识别模型训练
  • LVGL9.3 vscode 模拟环境搭建
  • 多层环境室内定位系统综述总结
  • 如何获取easy-ui的表格的分页大小
  • VRRP协议
  • Deformable 3D Gaussians:把动态场景装进“可变形的静态世界”
  • 技术重构人力管理 —— 打造人力资源流程自动化、智能化专业服务方案
  • 解决git无法连接github