ES:底层实现-倒排索引

倒排索引(Inverted Index)是 Elasticsearch 及其他全文搜索引擎的核心数据结构,用于高效地进行全文检索。它将文档中的内容映射到文档的位置,类似于书中词表索引,可以快速找到某个词在哪些章节中出现过。 倒排索引&正排索引 倒排:即词项=>包含当前词项的docid的列表的映射。倒

ES

倒排索引(Inverted Index)是 Elasticsearch 及其他全文搜索引擎的核心数据结构,用于高效地进行全文检索。它将文档中的内容映射到文档的位置,类似于书中词表索引,可以快速找到某个词在哪些章节中出现过。

倒排索引&正排索引

  • 倒排:即词项=>包含当前词项的doc_id的列表的映射。倒排索引的优势是可以快速查找包含某个词项的文档有哪些。如果用倒排来确定哪些文档中是否包含某个词项就很鸡肋。
  • 正排:即doc_id=>当前文档包含的所有词项的映射。正排索引的优势在于可以快速的查找某个文档里包含哪些词项。同理,正排不适用于查找包含某个词项的文档有哪些。 inverted-index.jpg

倒排索引的组成

倒排索引由以下两部分组成:

  1. 词典(Term Dictionary):存储所有在索引中出现的词。
  2. 倒排列表(Posting List):对于每个词,记录该词在哪些文档中出现,以及它在文档中的位置。

举个例子,假设我们有以下三个文档:

  • 文档1:"Elasticsearch 是一个搜索引擎"
  • 文档2:"搜索引擎 基于 Lucene"
  • 文档3:"Elasticsearch 使用倒排索引"

倒排索引生成的结果可能如下:

词语文档ID出现位置
Elasticsearch文档1, 文档31, 1
文档12
一个文档13
搜索文档1, 文档24, 1
引擎文档1, 文档25, 2
基于文档23
Lucene文档24
使用文档32
倒排索引文档33

在此例中,当你搜索“搜索引擎”时,Elasticsearch 可以直接在倒排索引中查找这两个词的倒排列表,然后找出它们同时出现在哪些文档中,并返回文档1和文档2。

倒排索引的优点

  • 高效的搜索:倒排索引使得全文检索非常高效,因为它直接按词存储,并能快速查找某个词在哪些文档中出现。
  • 支持布尔查询:通过倒排索引,可以轻松实现布尔查询,例如“词A AND 词B”,或者“词A OR 词B”等。
  • 支持词频和位置:倒排索引不仅记录词在哪些文档中出现,还记录词在文档中的具体位置(位置向量),这对于短语匹配和相似度计算非常重要。

Elasticsearch 如何使用倒排索引

  1. 文档分词:当文档被索引时,Elasticsearch 会使用分词器(Analyzer)将文档的文本内容切分成单词(词条,Token)。
  2. 词条映射到文档:Elasticsearch 将每个词条加入倒排索引,并记录该词条在哪些文档中出现。
  3. 查询过程:当用户发起搜索请求时,Elasticsearch 使用倒排索引快速找到相关文档,并根据词频、位置等信息进行评分,返回最相关的结果。

实际应用

在大规模文本搜索场景中,倒排索引是关键的技术基础,例如:

  • 全文搜索:搜索引擎通过倒排索引快速定位关键词所在的文档。
  • 日志分析:如 ELK(Elasticsearch、Logstash、Kibana)体系中,Elasticsearch 可以通过倒排索引在大量日志中迅速定位关键字或模式。

优化与挑战

虽然倒排索引对于搜索很高效,但它在处理非常高频率的词(如“the”)时可能会导致索引膨胀,因此 Elasticsearch 采用了不同的技术(如压缩算法)来优化索引的大小和访问速度。

倒排索引是理解 Elasticsearch 搜索效率的核心概念,在处理大规模数据的搜索需求时,倒排索引结构能显著提升性能。

ABOUT THE AUTHOR

织织

前大厂程序员、AI 工具开发者,正在记录从技术到产品的实践。

关于作者
DISCUSSION

评论与讨论

留下你的想法