为什么 Elasticsearch 搜索这么快?深入理解倒排索引与分词器原理

Elasticsearch 之所以能在大数据量下实现毫秒级的全文搜索,其核心秘密就在于它的底层数据结构——倒排索引(Inverted Index)

如果你想精通 Elasticsearch,或者只是想在面试中对答如流,理解倒排索引和分词器(Analyzer)的原理是绝对的必修课。本文将用通俗易懂的语言、全新的案例和图解,带你彻底搞懂这两个核心概念。

一、 什么是倒排索引?

在传统的关系型数据库(如 MySQL)中,如果我们想在一个文本字段中搜索某个关键词,通常会使用LIKE %keyword%。这种方式需要扫描每一行记录(全表扫描),效率极低。

倒排索引的设计思路则完全不同。它不直接存储“哪个文档包含了什么内容”,而是存储“这个关键词出现在了哪些文档中”。

1.1 正排索引 vs 倒排索引

  • 正排索引(Forward Index):以文档为核心。例如:文档 ID -> 文档内容。这是我们要存储原始数据的方式。
  • 倒排索引(Inverted Index):以词(Term)为核心。例如:关键词 -> 包含该词的文档 ID 列表。这是我们用来搜索的方式。

我们可以用书籍来类比:

  • 正排索引就像书的目录(章节 -> 页码),你知道第一章讲什么,但不知道“并发”这个词在哪几页出现。
  • 倒排索引就像书尾的索引页(关键词 -> 页码列表),你可以直接找到“并发”这个词出现在第 15、28、99 页,直接翻过去即可。

1.2 核心结构图解

Index

包含于

包含于

包含于

包含于

包含于

包含于

java

1, 2

核心

1, 3

技术

1

虚拟机

2

系统

3

设计

3

Docs

文档 1: Java 核心技术

文档 2: 深入理解 Java 虚拟机

文档 3: 核心系统设计

1.3 案例演示

假设我们有以下三条商品数据:

  • Doc 1:红富士苹果
  • Doc 2:新鲜的香蕉
  • Doc 3:苹果和香蕉

构建倒排索引后的逻辑结构如下表所示:

Term (词项)Posting List (文档 ID 列表)
苹果[1, 3]
红富士[1]
香蕉[2, 3]
新鲜[2]

当你搜索“苹果”时,ES 直接定位到倒排索引中的“苹果”一行,立即得到文档 ID[1, 3],无需遍历所有数据。


二、 倒排索引是如何构建的?

倒排索引的构建不是一蹴而就的,它需要经过**分词(Tokenization)归一化(Normalization)**等处理。

2.1 构建流程图

原始文本: Coding is FUN!

1. 分词处理

Term 列表: Coding, is, FUN

2. 词项过滤/归一化

最终索引词: code, fun

倒排索引库

2.2 关键步骤

  1. 分词(Tokenization):将一段文本拆分成一个个独立的词(Term)。
    • 例如:Coding is FUN!->[Coding, is, FUN]
  2. 归一化(Normalization):将词标准化,提高搜索的容错率。
    • 转小写FUN->fun(搜Fun也能搜到)。
    • 词干提取(Stemming)Coding->code(搜code也能搜到coding)。
    • 停用词过滤:去掉isthea等无实际意义的词。

三、 搜索过程是怎样的?

当用户输入查询语句时,ES 内部发生了什么?

评分排序模块倒排索引查询解析器用户评分排序模块倒排索引查询解析器用户搜索 "香蕉 苹果"对搜索词进行分词[香蕉, 苹果]查找 "香蕉"返回文档 ID [2, 3]查找 "苹果"返回文档 ID [1, 3]合并结果集 (OR 逻辑) ->> [1, 2, 3]计算相关性得分 (TF-IDF/BM25)返回排序后的结果

合并策略

  • 如果是OR查询(默认):取并集[1, 2, 3]
  • 如果是AND查询:取交集[3](只有文档 3 同时包含香蕉和苹果)。

四、 Elasticsearch 的灵魂:Analyzer(分词器)

分词器(Analyzer)是 Elasticsearch 处理文本的核心组件,它决定了你的数据如何被索引,以及用户如何能搜到它。

4.1 分词器的组成结构

一个 Analyzer 由三个核心组件按顺序组成:

输入文本

1. 字符过滤器
2. 分词器
3. 词项过滤器

最终词项

  1. Character Filters(字符过滤)
    • 在分词前对原始字符串进行“清洗”。
    • 场景:去掉 HTML 标签(<b>hello</b>->hello),将表情符号替换为文字等。
  2. Tokenizer(分词器)
    • 按照规则切分字符串。
    • 场景:按空格切分(Whitespace)、按标点切分(Standard)。
  3. Token Filters(词项过滤)
    • 对切分后的词进行加工。
    • 场景:转小写(Lowercase)、停用词移除(Stop)、同义词转换(Synonym)。

五、 常见的内置分词器实战

Elasticsearch 内置了多种分词器,适用于不同的场景。我们通过_analyzeAPI 来看看它们的效果。

5.1 Standard Analyzer(默认)

特点:按词切分,支持多语言,小写处理,过滤标点。最通用。

  • 输入:“Hello, World! 2026”
  • 处理:按标点和空格切分,转小写。
POST /_analyze{"analyzer":"standard","text":"Hello, World! 2026"}

结果[hello, world, 2026]

5.2 Simple Analyzer

特点:通过非字母字符切分,非字母字符会被去除(包括数字!),并转小写。

  • 输入:“My email is user123@test.com”
  • 处理:数字123和符号@.都会被当做分隔符并丢弃。
POST /_analyze{"analyzer":"simple","text":"My email is user123@test.com"}

结果[my, email, is, user, test, com](注意:数字丢失了)

5.3 Whitespace Analyzer

特点:仅仅按照“空格”切分。不做小写转换,保留标点。

  • 输入:“Java & Python”
  • 处理:只认空格。
POST /_analyze{"analyzer":"whitespace","text":"Java & Python"}

结果[Java, &, Python](注意:& 符号保留了,大小写也保留了)

5.4 Keyword Analyzer

特点不分词!将整个输入当作一个完整的 Term。

  • 输入:“ORDER-2026-X”
  • 适用场景:ID、枚举值、邮编、邮箱等精确匹配字段。
POST /_analyze{"analyzer":"keyword","text":"ORDER-2026-X"}

结果[ORDER-2026-X]

5.5 Stop Analyzer

特点:在 Simple Analyzer 的基础上,增加了停用词过滤(移除 the, a, is 等)。

  • 输入:“The quick brown fox”
  • 处理:“The” 是停用词,被移除。
POST /_analyze{"analyzer":"stop","text":"The quick brown fox"}

结果[quick, brown, fox]


六、 总结

  1. 倒排索引是 ES 高性能搜索的基石,它通过建立“词 -> 文档”的映射,避免了全表扫描。
  2. **分词器(Analyzer)**负责将文本转化为倒排索引所需的 Term。
  3. 选择合适的分词器至关重要:
    • 搜全文内容(文章、评论):用Standard或中文分词器(如ik_max_word)。
    • 搜确切 ID、状态码:用Keyword
    • 特殊格式文本:可能需要自定义分词器(组合 Char Filter + Tokenizer + Token Filter)。

希望这篇文章能帮你彻底理解 Elasticsearch 的底层检索机制!

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

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

相关文章

全网最全10个AI论文平台,助你搞定本科生毕业论文!

全网最全10个AI论文平台&#xff0c;助你搞定本科生毕业论文&#xff01; AI 工具如何成为论文写作的得力助手 在当今学术环境中&#xff0c;AI 工具已经逐渐成为本科生撰写毕业论文的重要帮手。尤其是在面对大量文献阅读、数据整理以及内容创作时&#xff0c;这些工具不仅能够…

Nodejs+vue大学生在线论坛系统-失物招领

文章目录系统概述技术架构功能设计创新点应用价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Node.js与Vue.js结合开发的大学生在线论坛系统&#xff0c;聚焦失物招领模块&#xff0c;旨在为校园提供…

算法 | 整理数据结构 | 算法题中,JS 容器的选择

总结&#xff1a;算法题 JS 容器选择速查表需求用什么是否出现过Set不同元素个数Set.size频率统计Map顺序访问Array / String随机访问Array / String去重Set哈希查找Set / MapJS 容器范式手册&#xff1a;Set、Map、字符串、数组注意&#xff0c;区分 “值容器”和“结构容器”…

导师严选 2026 8款AI论文软件测评:本科生毕业论文全攻略

导师严选 2026 8款AI论文软件测评&#xff1a;本科生毕业论文全攻略 2026年AI论文工具测评&#xff1a;为什么你需要这份精准指南 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI论文软件提升写作效率与质量。然而&#xff0c;面对市场上琳琅满目的工具&am…

Nodejs+vue大学生二手电子数码产品交易平台设计与实现 _39qu9

文章目录系统设计背景技术架构核心功能模块安全与风控措施创新点与价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统设计背景 随着高校学生电子设备更新速度加快&#xff0c;二手电子数码产品交易需求显著增…

14.设计模式-备忘录模式

备忘录模式&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 需求 游戏的某个场景&#xff0c;一游戏角色有生命力、攻击力、防御力等等数据&#xff0c;在打Boss前…

15.设计模式-组合模式

组合模式&#xff1a;将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式的两种实现&#xff1a; 透明方式&#xff1a;在Component中声明所有用来管理子对象的方法&#xff0c;其中包括Add、Remove等。这样…

Nodejs+vue大学生二手闲置物品置换交易管理系统

文章目录摘要--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Node.js与Vue.js构建&#xff0c;旨在为大学生提供一个高效、安全的二手闲置物品交易平台。通过前后端分离架构&#xff0c;系统实现了…

2026年10款最佳降AI率工具推荐:论文AIGC检测轻松过关

2026年10款最佳降AI率工具推荐&#xff1a;论文AIGC检测轻松过关面对知网、维普、万方等平台日益严格的AIGC检测&#xff0c;选对降AI工具是关键。本文实测对比10款主流工具&#xff0c;帮你找到最适合的解决方案。为什么需要降AI率工具&#xff1f; 2026年&#xff0c;各高校普…

Nodejs+vue大学生兼职应聘评分管理系统h4bmt

文章目录系统概述核心功能模块技术实现亮点应用价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Node.jsVue大学生兼职应聘评分管理系统&#xff08;H4BMT&#xff09;是一款基于前后端分离架构的Web应…

Nodejs+vue大学生兼职招聘评价系统_b8t93

文章目录系统概述核心功能模块技术实现亮点应用价值--nodejs技术栈--结论源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Node.js与Vue.js结合的大学生兼职招聘评价系统旨在为高校学生和用人单位提供高效的兼职信息对接与信用…

2025年山东大学计算机考研复试机试真题(解题思路 + AC 代码)

2025年山东大学计算机考研复试机试真题 2025年山东大学计算机考研复试上机真题 历年山东大学计算机考研复试上机真题 历年山东大学计算机考研复试机试真题 更多学校完整题目开源地址&#xff1a;https://gitcode.com/u014339447/pgcode 百度一下pgcode 即可查看&#xff0…

导师不会告诉你的6个免费AI论文工具:1小时搞定全文告别熬夜

想知道为什么你隔壁实验室的同学总能提前交稿&#xff0c;而你还在一字一句地苦熬&#xff1f;因为他们在用一些“不该知道”的秘密武器。今天&#xff0c;我就来为你揭秘这些藏在水面之下的“学术黑科技”&#xff0c;特别是那个能让论文效率提升10倍的终极神器。 前言&#x…

输入聚食的人数,预算和口味偏好,自动推荐附近的餐厅,还能生成聚餐菜单。

智能聚餐规划系统1. 项目概述实际应用场景在朋友、同事或家庭聚会时&#xff0c;组织一次成功的聚餐需要考虑多个因素&#xff1a;人数、预算、不同人的口味偏好、餐厅选择、菜品搭配等。传统方式需要人工查询、比较、协调&#xff0c;过程繁琐且容易遗漏重要信息。痛点分析- 信…

2025年同济大学计算机考研复试机试真题(解题思路 + AC 代码)

2025年同济大学计算机考研复试机试真题 2025年同济大学计算机考研复试上机真题 历年同济大学计算机考研复试上机真题 历年同济大学计算机考研复试机试真题 更多学校完整题目开源地址&#xff1a;https://gitcode.com/u014339447/pgcode 百度一下pgcode 即可查看&#xff0…

matlab实时脚本算拉普拉斯反变换和画图

//////////////////////clcclose allclearsyms s tnum 80;den s^412*s^341*s^282*s80;Fs num/denres solve(den) %求解分母多项式等于 0 的根&#xff08;即特征根&#xff09;Ft simplify(ilaplace(Fs, s, t)) % %对 F(s)做拉普拉斯逆变换&#xff0c;将变量从拉普拉斯域…

(8-1)自动驾驶中的无地图环境路径探索:D* Lite算法简介

在自动驾驶领域&#xff0c;无地图环境下的路径探索是极具挑战性的课题。本章聚焦于 D* Lite 算法&#xff0c;这是一种在未知或部分已知环境中进行高效路径规划的先进算法。我们将从 D* Lite 算法的应用领域、核心思想、实现步骤入手&#xff0c;通过实战案例深入剖析其在迷宫…

Unity AI Navigation 从 0 到 1:一篇吃透新 NavMesh 系统的实战

一、为什么你必须升级到老 NavMesh&#xff1f; 如果你还在用 2021 LTS 之前的 Navigation 窗口做 Bake&#xff0c;那你一定踩过这些坑&#xff1a; 场景里一移动箱子&#xff0c;就要重烤 NavMesh&#xff0c;CPU 直接爆炸&#xff1b; 不同体型的 NPC 必须共用同一张 Mesh…

电-气-热综合能源系统耦合优化调度Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

(8-2-01)自动驾驶中的无地图环境路径探索:基于Pygame的交互式路径规划器(1)

8.2 实战案例&#xff1a;基于Pygame的交互式路径规划器本项目是一个基于 Pygame 的交互式路径规划器&#xff0c;通过 A* 和 D* Lite 算法实现路径规划。用户可以在 GUI 界面中设置起点、终点和障碍物&#xff0c;并观察路径规划的过程和结果&#xff0c;以及实时更新的路径信…