ES 中的倒排索引是什么?

6 阅读3分钟

倒排索引的概念

在传统的关系型数据库中,我们通常是根据记录的主键或其他字段来查找对应的记录,这种方式可以理解为 “正向索引”。而在 Elasticsearch(ES)里,倒排索引是核心的数据结构,它是一种从词(Term)到文档(Document)的映射关系。简单来说,倒排索引会记录每个词在哪些文档中出现过,以及该词在文档中的位置等信息,从而实现高效的全文搜索。

倒排索引的构成

倒排索引主要由两部分组成:词项词典(Term Dictionary)和倒排列表(Posting List)。

词项词典(Term Dictionary)

词项词典是一个包含所有文档中出现过的不重复词的列表,并且这个列表是按字母顺序排序的。它的作用类似于字典的索引,能够快速定位到某个词。例如,在一个包含多篇文章的文档集合中,词项词典可能包含 “apple”、“banana”、“cherry” 等词。通过词项词典,我们可以快速判断某个词是否存在于文档集合中。

倒排列表(Posting List)

倒排列表是与词项词典中的每个词相关联的一个列表,它记录了包含该词的所有文档的信息。具体来说,倒排列表通常包含以下信息:

  • 文档 ID(Document ID) :标识包含该词的文档。
  • 词频(Term Frequency) :该词在文档中出现的次数。
  • 位置(Position) :该词在文档中的具体位置,这对于短语搜索和近似搜索非常有用。
  • 偏移量(Offset) :该词在文档中的起始和结束字符位置,用于高亮显示搜索结果。

倒排索引的构建过程

假设我们有以下两篇文档:

  • 文档 1:“The quick brown fox jumps over the lazy dog.”
  • 文档 2:“Never jump over the lazy dog quickly.”

步骤 1:分词(Tokenization)

将文档中的文本拆分成一个个独立的词(Token)。例如,文档 1 经过分词后得到的词序列为:“The”、“quick”、“brown”、“fox”、“jumps”、“over”、“the”、“lazy”、“dog”。

步骤 2:去重和排序

对所有文档中的词进行去重处理,并按字母顺序排序,形成词项词典。在这个例子中,词项词典可能为:“The”、“brown”、“dog”、“fox”、“jumps”、“jump”、“lazy”、“never”、“over”、“quick”、“quickly”、“the”。

步骤 3:构建倒排列表

为词项词典中的每个词构建倒排列表,记录包含该词的文档信息。以下是部分词的倒排列表示例:

  • “fox”:

    • 文档 ID:1
    • 词频:1
    • 位置:4
    • 偏移量:[16, 19]
  • “jump”:

    • 文档 ID:2
    • 词频:1
    • 位置:2
    • 偏移量:[6, 9]
  • “jumps”:

    • 文档 ID:1
    • 词频:1
    • 位置:5
    • 偏移量:[21, 26]

倒排索引的优势

  • 高效的全文搜索:通过倒排索引,我们可以快速定位到包含某个词的所有文档,而不需要遍历整个文档集合。
  • 支持复杂的查询:倒排索引记录了词的位置信息,使得我们可以进行短语搜索、近似搜索等复杂的查询操作。

倒排索引的图示说明

下面是一个简单的倒排索引示意图:

plaintext

词项词典        | 倒排列表
----------------|------------------------------
apple           | [Doc1: TF=2, Pos=[1, 5], Offset=[0, 5], [7, 12]]
banana          | [Doc2: TF=1, Pos=[3], Offset=[10, 16]]
cherry          | [Doc1: TF=1, Pos=[3], Offset=[8, 14], Doc2: TF=1, Pos=[2], Offset=[5, 11]]

在这个示意图中,词项词典包含了三个词:“apple”、“banana” 和 “cherry”。每个词对应一个倒排列表,记录了包含该词的文档信息,如文档 ID、词频、位置和偏移量。

通过这种方式,当我们需要搜索包含 “apple” 的文档时,只需要在词项词典中找到 “apple”,然后查看其对应的倒排列表,就可以快速定位到包含 “apple” 的文档(这里是 Doc1)。