4索引构建

提示:
信息检索-索引构建:就是建立倒排索引的过程

在这里插入图片描述


索引构建

索引构建:建立倒排索引的过程
索引器:构建索引的程序或计算机。
前面见过的索引:
索引
硬件基础:
硬件基础

索引构建基础

先看下两个基本概念区别,下图所示:更多请戳>>点这里
词项和词条
(1)先找一下我们需要构建索引的相关信息:
统计数据
(2)根据信息,初步处理:索引构建中的临时文件
N=800000,文档ID需要32bits
T=100000000,词条ID需要32bits
存储文档和词条ID需要:存储所需
在这里插入图片描述

此处补充个小知识:
进制转化

在这里插入图片描述
(3)词典、倒排记录的大小
在这里插入图片描述
M=400000,词项ID需要32bits
词典大小:M32bits=16000000bytes=1.6mbytes
N=800000,文档ID需要32bits
L
N=160000000
倒排表:L * N * 32bits=640000000bytes=0.64gbytes
(4)将每篇文档转换成词条列表并加上文档ID
 ->转换后按词项字母排序。
在这里插入图片描述
基于块的排序索引算法
在这里插入图片描述
在这里插入图片描述

基于块的排序索引方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
问题

内存式单遍扫描索引构建方法

SPIMI:内存式单遍扫描索引算法
 核心思想1:为每个块单独生成一个词典不需要维护全局的<词项,词项ID>映射表
 核心思想2:不进行排序,有新的<词项,文档ID> 对时直接在倒排记录表中增加一项
 根据这两点思想,可以为每个块生成一个完整的倒排索引,然后将这些单独的索引合并为一个大的索引
在这里插入图片描述
压缩技术会使该算法更加高效:压缩词项,压缩倒排记录表

分布式索引构建方法

》大规模的索引构建必须使用一个分布式的计算机集群,比如Web
》利用集群中的主控节点来指挥索引构建工作
》将索引构建过程分解成一组并行的任务
》主控计算机从集群中选取一台空闲的机器并将任务分配给它
在这里插入图片描述
文档集分割:基于词项,文档
在这里插入图片描述
分析器Parsers .
主节点将一个数据片分配给一台空闲的分析服务器
分析器依次读取文档并生成<词项,文档>对
分析器将这些<词项,文档>对分成j个段
每一段是按照词项首字母划分的一个区间,例如: a-f, g-p, q-z,这里j=3
然后可以进行索引的倒排

倒排器:
对于一个词项分区,倒排器收集所有的<词项,文档>对(也就是“倒排记录")排序,并写入最终的倒排记录表

在这里插入图片描述
在这里插入图片描述
MapReduce
 Google索引系统由各个不同的阶段组成,每个阶段都是MapReduce的一个应用,索引构建只是其中的一个阶段,另一个阶段是:将基于词项划分的索引表转换成基于文档划分的索引表
 ■基于词项划分的:一台机器处理所有词项的一个子区间
 ■基于文档划分的:一台机器处理所有文档的一个子区间
大部分搜索引擎都是采用基于文档划分的索引表-为什么?
更好的负载平衡

Map和Reduce函数的架构
■Map:输入->list(k,v) Reduce:(k,list(v))->输出
 索引构建中上述架构的实例化
■Map: Web文档集—> list(词项,文档1D)
■Reduce: (<词项1 ,list(文档ID)>,<词项2,list(文档1D)…)—> (倒排记录表1,倒排记录表2…)
在这里插入图片描述
MAP:
在这里插入图片描述
Reduce:
在这里插入图片描述

动态索引构建方法

 迄今为止,我们都假设文档集是静态的,但文档集通常不是静态的:文档会不断地加入进来;文档也会被删除或者修改
 这就意味着词典和倒排记录表需要修改:
 ■对于已在词典中的词项更新倒排记录
 新的词项加入到词典中
在这里插入图片描述
在这里插入图片描述
 频繁的合并- -带来很大的开销
 合并过程效率很低
 如果每个词项的倒排记录表都单独成一个文件,那么合并主索引和辅助索引将会很高效,合并将是一个简单的添加操作
 ■但我们需要非常多的倒排文件一 对文件系统来说是低效的
 现实中:我们往往在上述两种极端机制中取一个折中方案

对数合并
■维护一系列的索引,每个都是前一个的两倍大小将最小的Z0存储在内存中
■将最小的Z0存储在内存中
■将较大的那些(l0,l1…)存储在磁盘中
当Z0达到.上限n时,将它写入磁盘l0
当Z0下一次达到上限时,它会和l0合并,生成Z1
●此时,如果l1不存在,存储到l1
●如果l1已存在,则Z1与l1合并成Z2
●以此类推…
在这里插入图片描述
 辅助索引和主索引:因为每次合并都会处理倒排记录,所以索引构建时间为O(T^2)
 对数合并:每个倒排记录被合并了0(logT)次,所以复杂度为0(TlogT)
 所以对于索引构建来说,对数合并是非常高效的,但是查询过程现在需要用到合并的O(logT)个索引

在这里插入图片描述
在这里插入图片描述

其他索引类型

 包含位置信息的索引
■是同样的排序问题- -只是带来了更大的数据开销
 排名检索:倒排记录表通常是根据权重或影响排序的,最高权重的倒排记录表首先出现
■当权重已经变得很小时,查询处理通常可以提前终止

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心灵排骨汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值