倒排索引(Inverted Index)是 Elasticsearch 及其他全文搜索引擎的核心数据结构,用于高效地进行全文检索。它将文档中的内容映射到文档的位置,类似于书中词表索引,可以快速找到某个词在哪些章节中出现过。
倒排索引&正排索引
- 倒排:即
词项
=>包含当前词项的doc_id的列表
的映射。倒排索引的优势是可以快速查找包含某个词项的文档有哪些。如果用倒排来确定哪些文档中是否包含某个词项就很鸡肋。 - 正排:即
doc_id
=>当前文档包含的所有词项
的映射。正排索引的优势在于可以快速的查找某个文档里包含哪些词项。同理,正排不适用于查找包含某个词项的文档有哪些。倒排索引的组成
倒排索引由以下两部分组成:
- 词典(Term Dictionary):存储所有在索引中出现的词。
- 倒排列表(Posting List):对于每个词,记录该词在哪些文档中出现,以及它在文档中的位置。
举个例子,假设我们有以下三个文档:
- 文档1:
"Elasticsearch 是一个搜索引擎"
- 文档2:
"搜索引擎 基于 Lucene"
- 文档3:
"Elasticsearch 使用倒排索引"
倒排索引生成的结果可能如下:
词语 | 文档ID | 出现位置 |
---|---|---|
Elasticsearch | 文档1, 文档3 | 1, 1 |
是 | 文档1 | 2 |
一个 | 文档1 | 3 |
搜索 | 文档1, 文档2 | 4, 1 |
引擎 | 文档1, 文档2 | 5, 2 |
基于 | 文档2 | 3 |
Lucene | 文档2 | 4 |
使用 | 文档3 | 2 |
倒排索引 | 文档3 | 3 |
在此例中,当你搜索“搜索引擎”时,Elasticsearch 可以直接在倒排索引中查找这两个词的倒排列表,然后找出它们同时出现在哪些文档中,并返回文档1和文档2。
倒排索引的优点
- 高效的搜索:倒排索引使得全文检索非常高效,因为它直接按词存储,并能快速查找某个词在哪些文档中出现。
- 支持布尔查询:通过倒排索引,可以轻松实现布尔查询,例如“词A AND 词B”,或者“词A OR 词B”等。
- 支持词频和位置:倒排索引不仅记录词在哪些文档中出现,还记录词在文档中的具体位置(位置向量),这对于短语匹配和相似度计算非常重要。
Elasticsearch 如何使用倒排索引
- 文档分词:当文档被索引时,Elasticsearch 会使用分词器(Analyzer)将文档的文本内容切分成单词(词条,Token)。
- 词条映射到文档:Elasticsearch 将每个词条加入倒排索引,并记录该词条在哪些文档中出现。
- 查询过程:当用户发起搜索请求时,Elasticsearch 使用倒排索引快速找到相关文档,并根据词频、位置等信息进行评分,返回最相关的结果。
实际应用
在大规模文本搜索场景中,倒排索引是关键的技术基础,例如:
- 全文搜索:搜索引擎通过倒排索引快速定位关键词所在的文档。
- 日志分析:如 ELK(Elasticsearch、Logstash、Kibana)体系中,Elasticsearch 可以通过倒排索引在大量日志中迅速定位关键字或模式。
优化与挑战
虽然倒排索引对于搜索很高效,但它在处理非常高频率的词(如“the”)时可能会导致索引膨胀,因此 Elasticsearch 采用了不同的技术(如压缩算法)来优化索引的大小和访问速度。
倒排索引是理解 Elasticsearch 搜索效率的核心概念,在处理大规模数据的搜索需求时,倒排索引结构能显著提升性能。