目录
什么是倒排索引?
倒排索引是Elasticsearch和其他全文搜索引擎中非常重要的数据结构,用于快速查找文档中包含特定词(或术语)的信息。与正向索引(将文档映射到其中的词)不同,倒排索引将词映射到包含这些词的文档列表。
注意:倒排索引和文档的存储本身没有关系,只是为了快速的全文检索,针对document的一个或者多个字段,所创建的索引
倒排索引的基本结构
倒排索引通常包含以下两个主要部分:
- 词典(Dictionary):包含所有唯一的词(或术语)。
- 倒排列表(Inverted List):每个词对应一个倒排列表,记录包含该词的文档及其相关信息(如文档ID、词频、位置等)。
倒排文件(Inverted File):所有关键词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

倒排索引的实现
文档分词
-
分词(Tokenization):将文档中的文本拆分成一个个词(或术语),ElasticSearch使用分词器(Analyzer)来完成这一任务。
常见的分词器包括: 1、基于空格的分词器:将文本按空格拆分。 2、基于词典的分词器:适用于中文等没有明显分词标志的语言。 3、正则表达式分词器:使用正则表达式进行分词。 -
过滤停用词(Stop Words Filtering):停用词是指在文本中频繁出现但对搜索结果影响不大的词,如”的“、”是“、”在“等。过滤停用词可以减少索引的大小,提高搜索效率。
-
词干提取(Stemming):将词的不同形态还原为其基本形式(词干)的过程。常用的词干提取算法包括Porter算法和Snowball算法。
-
大小写转换(Case Normalization):将所有关键词转换为小(大)写或统一编码
-
去除标点符号(Punctuation Remove):去除文档中的标点符号,以减少噪声。
构建词典
所有文档分词后,为每个关键词分配唯一的ID,生成一个包含所有关键词的词典。词典中的每一个词都对应一个倒排列表。过程通常包括以下步骤:
- 去重:确保词典中的每个词都是唯一的(set)。
- 排序:通常会对词典中的词进行排序,以便于快速查找(sort)
构建倒排列表
-
基本结构创建:对于每个词项,创建包含以下信息的倒排列表
term -> [doc1, doc2, doc3, ...] -
添加频率和位置信息(可选但常见):扩展基本结构,加入词频和位置信息
term -> [ (doc1, freq1, [pos1, pos2, ...]), (doc2, freq2, [pos1, pos2, ...]), ... ] # freq: 词项在该文档中出现的次数 # pos: 词项在文档中出现的位置(偏移量) -
排序优化
1、将文档ID按升序排列,便于压缩和查询处理
2、如果存储位置信息,位置列表也通常按出现顺序排列 -
压缩存储(可选优化)
1、对文档ID使用差值编码(delta encoding)
2、对频率和位置信息使用合适的压缩算法
持久化存储(倒排文件)
将构建好的倒排列表写入磁盘,通常采用以下结构:
- 词典部分:存储关键词和指向倒排列表的指针
- 倒排列表部分:存储实际的文档ID、频率和位置信息
倒排索引与B+树索引的区别与优势对比
数据结构的差异
| 索引名称 | 倒排索引 | B+树索引 |
|---|---|---|
| 基本结构 | 词项→文档列表的映射 | 平衡树结构,保持数据有序 |
| 存储方式 | 分布式存储词项和文档关系 | 集中式存储记录指针 |
| 排序方式 | 词典有序,文档ID有序 | 键值完全有序 |
| 节点关系 | 无固定结构关系 | 严格的父子节点关系 |
核心优势对比
倒排索引
- 全文检索效率
- 支持分词检索,适合处理文本内容
- 可以高效处理"包含任意关键词"的查询
- 示例:
"搜索引擎 技术"可快速找到包含任意词的文档
- 多条件组合查询
- 布尔查询(AND/OR/NOT)效率极高
- 通过倒排列表的交并集操作实现
- 示例:
标题含"A"且正文含"B"但不含"C"
- 灵活的相关性排序
- 原生支持TF-IDF/BM25等相关性算法
- 可结合多种因素(词频、位置、文档权重)计算得分
- 高压缩性能
- 文档ID差值编码压缩率通常超过50%
- 适合海量文本数据存储
B+树索引
- 点查询和范围查询
- 精确匹配:
WHERE id = 123效率O(log n) - 范围查询:
WHERE age BETWEEN 20 AND 30效率极高
- 精确匹配:
- 排序和分页
- 天然保持数据有序,ORDER BY无需额外排序
- LIMIT分页操作效率极高
- 事务支持
- 完美支持ACID事务操作
- 行级锁实现并发控制
- 存储效率
- 数据与索引统一存储,减少IO
- 适合结构化数据存储
典型场景
倒排索引
- 搜索引擎全文检索
- 日志分析系统(如ELK)
- 文档内容检索
- 多字段组合条件查询
B+树索引
- 金融交易系统
- 用户账户管理
- 订单查询系统
- 需要事务的操作
性能指标
| 指标 | 倒排索引 | B+树索引 |
|---|---|---|
| 插入速度 | 较慢(需重建索引) | 快(O(log n)) |
| 点查询 | 中等(需查词典+倒排表) | 极快(O(log n)) |
| 范围查询 | 需特殊处理(如range类型字段) | 极快(叶子节点链表遍历) |
| 多条件组合查询 | 极快(位图操作) | 依赖多索引合并 |
| 内存占用 | 较高(需缓存词典) | 较低 |
| 数据压缩率 | 高(50-70%) | 低(一般不压缩) |

5890

被折叠的 条评论
为什么被折叠?



