【大数据管理】数据组织与存储(三)

如何使用倒排索引和基本布尔检索模型来处理一个查询呢?
 
先以一个简单“ 与” 查询( simple conjunctive query )为例: Brutus AND Calpurnia.
 
可以使用图 1-3 所示的倒排索引进行如下操作:

    (1) 在词典中定位 Brutus

    (2) 返回其倒排记录表;

    (3) 在词典中定位Calpurnia

    (4) 返回其倒排记录表;

    (5) 对两个倒排记录表求交集,如图1-5 所示。

b62ecbbedc5d483ba5b7e3839b454964.png

 在这里,交集(intersection)操作非常关键,必须快速将倒排记录表求交集以尽快找到哪些文档同时包括两个词项.

8155caa00f574c25b03876f288ed9b81.png

 该算法对于倒排记录表集(即待合并的两个倒排记录表)的大小而言是线性的.

 
每一步比较两个位置指针所指向的文档 ID ,如果两者一样,则将该 ID 输出到结果表中,然后同时将两个指针后移一位。
 
如果两个文档 ID 不同,则将较小的 ID 所对应的指针后移。
 
假设两个倒排记录表的大小分别是 x y ,那么上述求交集的过程需要 O( x+y ) 次操作。

 

查询的时间复杂度为Θ(N),其中N 是文档集合中文档的数目

和线性扫描相比,这种索引方法并没有带来Θ意义上时间复杂度的提高,而最多只是一个常数级别的变化.

但是,实际当中这个常数很大。如果要使用上述合并算法,那么倒排记录表必须按照全局的统一指标进行排序。通过文档 ID 的数值进行排序是一个简单的实现方法。
 
可以对上述合并算法进行扩展,使之能够用于处理更复杂的查询: (Brutus OR Caesar) AND NOT Calpurnia
 
查询优化( query optimization )指的是如何通过组织查询的处理过程来使处理工作量最小 .

 

对布尔查询进行优化要考虑的一个主要因素是倒排记录表的访问顺序。
 
考虑一个对多个词项进行“ 与” 操作的查询 例如: Brutus AND Caesar AND Calpurnia .
 
对每个词项,必须取出其对应的倒排记录表,然后将它们合并。
 
一个 启发式 想法 是,按照词项的文档频率(也就是倒排记录表的长度)从小到大依次进行处理 , 如果先合并两个最短的倒排记录表,那么所有中间结果的大小都不会超过最短的倒排记录表 .
 
因此,对于图 1-3 对应的倒排记录表将按照如下顺序来处理查询( 1-3 ):
b87a004af4054b0499904b23220919be.png

                 (Calpurnia AND Brutus) AND Caesar

这也给出了在词典中保存文档频率的一个充分理由,即它可以在访问之前用于决定倒排记录表的访问次序 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

WiIsonEdwards

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

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

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

打赏作者

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

抵扣说明:

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

余额充值