
Elasticsearch 之所以能在大数据量下实现毫秒级的全文搜索,其核心秘密就在于它的底层数据结构——倒排索引(Inverted Index)。
如果你想精通 Elasticsearch,或者只是想在面试中对答如流,理解倒排索引和分词器(Analyzer)的原理是绝对的必修课。本文将用通俗易懂的语言、全新的案例和图解,带你彻底搞懂这两个核心概念。
在传统的关系型数据库(如 MySQL)中,如果我们想在一个文本字段中搜索某个关键词,通常会使用 LIKE %keyword%。这种方式需要扫描每一行记录(全表扫描),效率极低。
倒排索引的设计思路则完全不同。它不直接存储“哪个文档包含了什么内容”,而是存储“这个关键词出现在了哪些文档中”。
我们可以用书籍来类比:

假设我们有以下三条商品数据:
红富士苹果新鲜的香蕉苹果和香蕉构建倒排索引后的逻辑结构如下表所示:
Term (词项) | Posting List (文档 ID 列表) |
|---|---|
苹果 | 1, 3 |
红富士 | 1 |
香蕉 | 2, 3 |
新鲜 | 2 |
当你搜索“苹果”时,ES 直接定位到倒排索引中的“苹果”一行,立即得到文档 ID [1, 3],无需遍历所有数据。
倒排索引的构建不是一蹴而就的,它需要经过分词(Tokenization)和归一化(Normalization)等处理。

Coding is FUN! -> [Coding, is, FUN]FUN -> fun(搜 Fun 也能搜到)。Coding -> code(搜 code 也能搜到 coding)。is、the、a 等无实际意义的词。当用户输入查询语句时,ES 内部发生了什么?

合并策略:
OR 查询(默认):取并集 [1, 2, 3]。AND 查询:取交集 [3](只有文档 3 同时包含香蕉和苹果)。分词器(Analyzer)是 Elasticsearch 处理文本的核心组件,它决定了你的数据如何被索引,以及用户如何能搜到它。
一个 Analyzer 由三个核心组件按顺序组成:

<b>hello</b> -> hello),将表情符号替换为文字等。Elasticsearch 内置了多种分词器,适用于不同的场景。我们通过 _analyze API 来看看它们的效果。
特点:按词切分,支持多语言,小写处理,过滤标点。最通用。
POST /_analyze
{
"analyzer": "standard",
"text": "Hello, World! 2026"
}结果:[hello, world, 2026]
特点:通过非字母字符切分,非字母字符会被去除(包括数字!),并转小写。
123 和符号 @ . 都会被当做分隔符并丢弃。POST /_analyze
{
"analyzer": "simple",
"text": "My email is user123@test.com"
}结果:[my, email, is, user, test, com] (注意:数字丢失了)
特点:仅仅按照“空格”切分。不做小写转换,保留标点。
POST /_analyze
{
"analyzer": "whitespace",
"text": "Java & Python"
}结果:[Java, &, Python] (注意:& 符号保留了,大小写也保留了)
特点:不分词!将整个输入当作一个完整的 Term。
POST /_analyze
{
"analyzer": "keyword",
"text": "ORDER-2026-X"
}结果:[ORDER-2026-X]
特点:在 Simple Analyzer 的基础上,增加了停用词过滤(移除 the, a, is 等)。
POST /_analyze
{
"analyzer": "stop",
"text": "The quick brown fox"
}结果:[quick, brown, fox]
Standard 或中文分词器(如 ik_max_word)。Keyword。希望这篇文章能帮你彻底理解 Elasticsearch 的底层检索机制!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。