现代信息检索——索引构建

简介: 现代信息检索——索引构建

1. 索引


建立倒排索引的过程称为索引构建,负责构建索引的算法称为索引器。操作系统往往以数据块为单位对数据进行读写,因此从磁盘读取一个字节和读一个数据块所耗费的时间可能一样多。采用一种高效的解压缩算法对数据进行压缩,然后读取磁盘上的压缩数据,再进行解压,这个过程所花的时间往往会比直接读取原始数据的时间少。


下文涉及到是3个名词:倒排、索引均是指倒排表的不同形式;词典是指词项名到词项ID的映射表。


1. BSBI算法


BSBI(Blocked sort-based Indexing,基于块的排序索引方法)的基本思想是:收集每一个数据块(数据库大小由内存决定)的倒排表,对每个倒排表排序后写入硬盘,最后将不同分块的倒排表合并为一个大的全局倒排表(词典),该词典就是索引文件。


算法流程:


词项ID映射

将所有文档的词项映射为对应的ID,形成全局的termStr-termID词典;

构建词项块

将映射后的所有词项划分为大小相等的块构建倒排表,并存入磁盘;

对倒排表排序

将每个块读入内存,然后按照termID排序(快速排序大约需要 O ( N ln ⁡ N ) O(N\ln N) O(NlnN)步)。不断重复直到所有倒排表都完成排序。

对倒排表合并

从磁盘中取出两个数据块的倒排表,进行合并形成一个全局倒排表,再将全局倒排表存入磁盘。不断重复直到所有倒排表都完成合并。

0a2653c851af460fa595bd959398a8f1.png

需要注意的是,待合并的倒排记录表的term是用id来表示的,上图的字符串只是为了方便理解;词典的term是字符串形式。


为了加快处理速度,可以进行多项合并,多项合并(multi-way merge)比两两合并效率更高。所谓多项合并,也就是从所有块同时读取。


多项合并的流程如下:


同时从所有块读取,并且为每块维持一个读缓冲区(read buffer),为输出文件(即合并后的倒排表)维持一个写缓冲区(write buffer);

维护一个待处理termid的优先级队列(priority queue),每次迭代从队列中选取一个最小的未处理 termid;

合并不同块中所有的该termID的倒排表,并写入磁盘。

不断迭代,最终完成合并,在多项合并的过程中,每次迭代均处理较小规模的数据(一个词项的倒排表),需要一定的内存开销。


2. SPIMI算法


SPIMI(Single-pass in-memory indexing, 内存式单遍扫描索引构建算法)是在BSBI的基础上改进的,它不做id转换,而是直接关联了词项与索引。另外词项不排序,直接按照出现的先后顺序构建索引。


算法流程:


构建词项块

将所有文档的词项划分为大小相等的块;

构建块倒排表

对的每个块内的词项映射为对应的ID,形成单个块的局部termStr-termID词典,然后构造倒排表;

合并块倒排表

将所有块的倒排表进行合并

3. BSBI与SPIMI的区别

BSBI算法在分块索引阶段,维护一个全局termStr-termid的词典,局部索引为termid及其倒排记录表,按词典顺序排序。是在合并前就构造全局词典。


SPIMI算法分块索引阶段建立局部词典和索引,无需全局词典。 在合并阶段,将块倒排表两两合并,合并完成后自然产生全局termStr-termid词典。是在合并过程中构造全局词典。


3. 动态索引构建


在实际使用索引时,文档常常会增加、删除和修改,这也意味着词典和倒排记录表必须要动态更新。


一个最简单的方案是主辅索引:主索引(Main index)+辅助索引(Auxiliary index)。


对于增加文档

该方案在磁盘上维护一个大的主索引(Main index),新增的文档放入内存中较小的辅助索引中。定期同时搜索两个索引(主和辅),然后合并搜索结果。这样就实现了自动扩充索引。

对于删除文档

对于要删除的文档,索引不马上将其从索引中去除,而是采用无效位向量(Invalidation bit-vector)来表示删除的文档。得到定期搜索主辅索引时,利用无效位向量过滤返回的结果,去掉已删除文档。

主辅索引合并存在的问题主要是合并任务量大、合并过于频繁,合并时如果正好在搜索,那么搜索的性能将很低。为了缓解这个问题,在合并阶段可以采用对数合并:


对数合并算法能够缓解(随时间增长)索引合并的开销,使用户不会明显感觉到搜索操作在响应时间上的延迟。对数合并的思想是:


维护一系列索引,其中每个索引的容量是前一个索引的两倍,第一个索引的容量为 n;

将最小的索引 ( i 0 )载入内存,其他更大的索引 ( i 1 , i 2 , . . . ) 置于磁盘;

当 ( i 0 ) (i_0) (i 0 )变得过大时 ( i 0 > n ) 若 i 1 不存在,则将 i 0  写入磁盘作为 i 1 ;若 i 1  存在,则将 i 0 与 i 1 合并,然后将合并结果作为 i 2 写到磁盘中(若 i 2 不存在),或者继续和后面的索引合并。

设 T T T为所有倒排记录的个数,则对数合并的复杂度( O ( T log ⁡ T ) O(T\log T) O(TlogT))比辅助索引( ( O ( T 2 ) ) (O(T^2)) (O(T  )))要低一个数量级,是一个很好的合并算法。


相关文章
|
5月前
|
IDE Java 测试技术
2025 Java 开发者选型指南,谁更懂企业级工程?
在 Java 企业级开发领域,AI 编程工具的竞争已从“代码补全”升级为“工程效能”的比拼。2025年,随着通义大模型与文心大模型的迭代,通义灵码 与 文心快码 成为该领域的两大巨头。本文结合 IDC 报告与双 11 实战数据,从 Java 专项能力、云端协同 及 工程可控性 三个维度进行深度评测。
|
10月前
|
数据采集 搜索推荐 API
淘宝商品评论API接口全解析:从数据采集到情感分析
淘宝商品评论API是淘宝开放平台提供的数据服务,支持开发者获取商品的用户评论、评分、时间、多媒体信息等。接口具备筛选、分页和排序功能,适用于产品优化与市场分析。文章还附有Python调用示例,演示如何请求和解析评论数据。
|
10月前
|
JSON 数据挖掘 API
Lazada商品 API接口,开发者详解与使用指南
Lazada商品API为开发者提供商品信息获取功能,适用于电商应用开发与数据分析。支持获取标题、价格、库存等详细信息,具备实时更新、高并发支持等特点,适用于竞品分析、价格趋势研究、导购应用及客服系统集成。需获取凭证后调用接口,示例代码使用Python实现。
|
11月前
|
人工智能 自然语言处理 监控
系统提示词工程师学习路径报告
本报告聚焦系统提示词工程师职业,介绍其职责与学习路径。该职业负责为AI系统设计、优化指令,涉及需求拆解、模型优化、跨领域适配及伦理把控。 学习路径分四阶段:1 - 3个月构建基础,了解AI模型、语言学及工具使用;3 - 6个月深化核心技能,掌握提示设计、评估体系与领域知识;6 - 12个月开展工程实践,进行系统集成与可解释性研究;1 - 2年探索进阶方向,如多模态提示、自优化系统。 此外,报告推荐专业工具、测试集等学习资源,建议定期实操、研阅论文、参与社区,建立“提示模式库”,紧跟行业趋势,以培养专业系统提示词工程师。
1083 4
|
安全 Java 调度
深入理解Java线程的生命周期,什么是线程的生命周期?详解线程的主要状态以及它们之间的转换
深入理解Java线程的生命周期,什么是线程的生命周期?详解线程的主要状态以及它们之间的转换
622 0
|
算法 搜索推荐
解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配
在信息检索领域(即从海量数据中查找相关信息),双编码器和交叉编码器是两种至关重要的工具。它们各自拥有独特的工作机制、优势和局限性。本文将深入探讨这两种核心技术。
769 3
解读双编码器和交叉编码器:信息检索中的向量表示与语义匹配
|
人工智能 运维 监控
领先AI企业经验谈:探究AI分布式推理网络架构实践
当前,AI行业正处于快速发展的关键时期。继DeepSeek大放异彩之后,又一款备受瞩目的AI智能体产品Manus横空出世。Manus具备独立思考、规划和执行复杂任务的能力,其多智能体架构能够自主调用工具。在GAIA基准测试中,Manus的性能超越了OpenAI同层次的大模型,展现出卓越的技术实力。
|
搜索推荐 API 开发者
淘宝买家秀API接口(淘宝API系列)
淘宝买家秀API接口为电商运营和产品分析提供宝贵数据,反映消费者真实反馈。通过HTTP GET请求,开发者可获取商品的买家秀信息,包括图片、文字描述、点赞数等,帮助商家改进产品和优化营销策略。Python示例代码展示了如何调用该接口并处理返回数据。需在淘宝开放平台注册并申请权限。
|
存储 自然语言处理 搜索推荐
深入理解Elasticsearch倒排索引
深入理解Elasticsearch倒排索引
1695 0
|
存储 SQL 分布式计算
基于Hadoop豆瓣电影数据分析(综合实验)
基于Hadoop豆瓣电影数据分析(综合实验)
2027 1
基于Hadoop豆瓣电影数据分析(综合实验)