了解倒排索引

什么是倒排索引?

 
  倒排索引是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%)低(一般不压缩)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值