倒排索引评估顺序

| 我在某处读到,当您进行凯撒,布鲁托斯和卡尔普尼亚时,当您拥有倒排索引时(例如,您有一个布鲁特页面的排序列表,一个凯撒页面的排序列表和一个钙尿蛋白的页面排序列表)。 ,如果Calpunia和Brutus的页面数少于Caesar的页面数,那么您应该进行Caesar AND(Brutus和Calpurnia)的操作,这意味着您应首先评估后者的AND。通常,每当您有一系列AND时,总是首先评估页面数最少的那对。这背后的原因是什么?为什么这样有效?     
已邀请:
并非对于所有倒排索引都适用。如果需要顺序扫描整个倒排索引,则首先在哪个发布列表交集上都无所谓。 但是,假设一种情况,当反向列表以索引关系存储时。然后,以较少的文档出现次数来评估该对将等于具有更高选择性的合并关系,从而提高了评估的效率。 直观地,当我们与较小的列表相交时,我们创建了一个更强大的过滤器,该过滤器用作索引的提要以查找匹配项。 假设我们有兴趣评估关键字查询“ 0”,其中“ 1”,“ 2”和“ 3”是文档中的单词。还假设匹配的文档数如下:
a --> 20
b --> 100
c --> 1000
a+b --> 10
a+c --> 15
b+c --> 50
a+b+c --> 5
请注意,
(a JOIN b)
的大小为
10
(b JOIN c)
的大小为
50
。因此,第一个将要求对
c
的索引有
10
访问,而第二个则需要对
a
的索引具有
50
访问。但是,使用基于哈希的索引或基于树的索引时,对索引的此类访问在成本上不会有很大差异,并且通常在单个I / O中完成。     
要意识到的重要一点是,由于您已经提到了排序,因此可以非常有效地(通常以对数时间)例如通过使用二进制搜索来搜索反向列表以查找任何给定的文档ID。 要查看其效果,假设查询为
caesar AND brutus
,并假设存在针对
caesar
的occcaesar页面和针对
brutus
的occbrutus页面(即occX表示术语X的页面列表的长度)。为了便于说明,现在假设occcaesar> occbrutus,即内容中的“ 14”比“ 15”更频繁。 然后,您要做的是首先遍历所有页面以
brutus
,然后在页面列表中搜索每个页面以获取
caesar
。如果确实可以对数时间搜索列表,则意味着您需要 occbrutus *日志(occcaesar) 确定包含这两个词的所有页面的计算步骤。 如果反向进行(即遍历
caesar
列表并在
brutus
列表中搜索每个页面),则较小的数字将以对数结尾,较大的数字将成为一个因数,因此,总时间需要更长的时间。 话虽如此,但重要的是要认识到实际上,事情要比这复杂得多,因为(a)不仅对列表进行排序而且对其进行压缩,这使搜索更加困难,并且(b)列表的某些部分可能存储在磁盘而不是内存,这意味着磁盘访问的总数比计算步骤的总数绝对重要。因此,上述算法可能无法以其最纯粹的形式应用,但是原理已描述。     

要回复问题请先登录注册