第3课_倒排索引的原理
热度🔥:29 免费课程
授课语音
倒排索引的原理
倒排索引(Inverted Index)是 Elasticsearch 和其他全文搜索引擎中使用的核心数据结构,旨在加速文本搜索。它与数据库中常见的正排索引(从文档到词条的映射)相反,倒排索引建立的是 从词条到文档的映射,即反向存储。
1. 正排索引与倒排索引的区别
正排索引:
- 传统数据库使用正排索引,它基于文档的存储顺序或字段值来构建索引。
- 正排索引会为每个文档记录所有字段的数据,查询时通过逐个检查文档来获取结果。
- 对于搜索引擎来说,正排索引不适合快速检索特定词条的所有文档。
倒排索引:
- 倒排索引是将词条映射到包含该词条的文档列表。
- 它适合于 全文搜索,查询时可以迅速找出哪些文档包含特定的词条。
2. 倒排索引的构建过程
倒排索引的构建可以分为以下几个步骤:
步骤一:文本分析(Tokenization)
文本分析是将原始文档分解为一个个词条(token)的过程,通常包含以下子过程:
- 分词(Tokenization): 将文本字符串切分成一个个词条,去除空格、标点符号等无意义字符。
- 小写化(Lowercasing): 将所有字符转为小写,避免大小写不一致的问题。
- 去除停用词(Stop words): 删除在搜索中无意义的常见词(如 "the"、"a"、"and" 等)。
例如,对于文档:
"The quick brown fox jumps over the lazy dog"
,经过分词和小写化处理后,可以得到词条:
["quick", "brown", "fox", "jumps", "lazy", "dog"]
。
步骤二:建立词条到文档的映射
一旦文本被分词,接下来的任务是为每个词条建立一个倒排列表。
倒排列表是一个包含词条和该词条出现在的文档 ID(或文档位置)的数据结构。
举例: 假设有以下三篇文档:
- 文档 1:
"Quick brown fox"
- 文档 2:
"The quick dog"
- 文档 3:
"The lazy dog"
经过分析后,分词结果为:
- 文档 1:
["quick", "brown", "fox"]
- 文档 2:
["the", "quick", "dog"]
- 文档 3:
["the", "lazy", "dog"]
那么倒排索引会是:
"quick"
→ [1, 2] (quick
出现在文档 1 和 2 中)"brown"
→ [1] (brown
出现在文档 1 中)"fox"
→ [1] (fox
出现在文档 1 中)"dog"
→ [2, 3] (dog
出现在文档 2 和 3 中)"lazy"
→ [3] (lazy
出现在文档 3 中)
这样,当搜索某个词条时,可以直接查询该词条对应的文档 ID 列表,而无需扫描整个文档。
- 文档 1:
步骤三:存储倒排索引
倒排索引 本质上是一个 词条到文档 ID 列表 的映射。它的数据结构通常采用 哈希表 或 B+ 树 等,保证查找速度。
每个词条都会有一个倒排列表,列表中包含了该词条出现过的文档 ID,可能还包括词频、位置等额外信息。
举个例子,对于倒排索引:
"quick" → [1, 2] "fox" → [1] "lazy" → [3]
这就表示 "quick" 出现在文档 1 和 2 中,"fox" 只出现在文档 1 中,而 "lazy" 只出现在文档 3 中。
3. 倒排索引的查询过程
- 当用户提交查询请求时,搜索引擎会根据查询条件查找相应的倒排索引:
- 查找相关词条的倒排列表: 例如,用户搜索
"quick fox"
,引擎首先查找"quick"
和"fox"
这两个词条的倒排列表。 - 合并倒排列表: 然后将两个词条的倒排列表合并,找出同时包含这两个词条的文档。使用交集操作,得到文档 1。
- 排序和排名: 最后,搜索引擎可能根据相关性(如 TF-IDF 或 BM25)对结果进行排序,返回最相关的文档。
- 查找相关词条的倒排列表: 例如,用户搜索
4. 倒排索引的优点
- 快速查询: 倒排索引可以快速地定位包含某个词条的文档,而不需要逐个文档扫描。
- 高效支持复杂查询: 比如多条件的 AND、OR 查询、短语匹配、通配符查询等。
- 节省空间: 通过倒排索引,搜索引擎只需要存储词条和它们所在文档的映射,而不是存储完整的文档。
5. 倒排索引的优化
- 压缩: 倒排索引的列表可能会很长,因此可以对其进行压缩。例如,通过 delta 编码(记录相邻文档之间的差异)来减少存储空间。
- 分词器和分析器的优化: 选择合适的分词器和分析器可以提高倒排索引的查询效率和准确性。
- 文档字段的分配: 为了提高效率,可以将文档按字段分配给不同的索引,使得查询时能够专注于某些字段。
6. 总结
倒排索引是全文搜索引擎的核心,通过将文档中的词条映射到包含该词条的文档 ID,倒排索引能够高效地进行词条搜索和查询优化。它极大地提高了搜索引擎的查询速度,尤其适用于大规模文本数据的检索。在 Elasticsearch 中,倒排索引的设计和应用是提升搜索性能的关键技术之一。