我在某个地方读到,当你有一个倒排索引时(例如,你有一个brutus页面的排序列表,caesar的排序列表页面和calpurnia页面的排序列表),你做凯撒和布鲁特斯和卡尔彭尼亚,如果卡尔伯尼亚和布鲁托斯的页数少于凯撒的页数,那么你应该做凯撒和(粗野和卡尔尼亚),这意味着你应该评估后者和第一。一般来说,无论何时你有一系列的AND,你总是首先评估具有最低页数的对。这背后的推理是什么?为什么这是有效的?反转索引评估顺序
反转索引评估顺序
回答
对于每个倒转索引的情况都不是这样。如果你需要顺序扫描整个倒排索引,那么你首先要做哪个发布列表交集并不重要。
但是,假设反转列表存储在索引关系中的场景。然后,评估文档出现次数较少的一对将等于加入具有较高选择性的关系,从而提高评估效率。
直观地说,当我们交叉较小的列表时,我们创建了一个更强的过滤器,它被用作索引的源来查找匹配。
假设我们有兴趣评估关键字查询a b c
,其中a
,b
和c
是文档中的单词。此外,假设文件匹配的数量如下:
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
。因此,第一个将要求10
访问c
索引,而第二个需要50
访问索引a
。但是,使用基于散列的或基于树的索引,对索引的访问在成本上差别不大,通常在单个I/O中完成。
要认识到的一个重要的事情是,由于您已经提到的排序,对于任何给定的文档ID,倒排列表可以是搜索非常有效(通常以对数时间),例如使用二进制搜索。
要看到的是,效果,假设查询caesar AND brutus
,并且假设有OCC 凯撒页caesar
和OCC 布鲁页brutus
(即OCC X表示的页面的长度列表中的术语X)。为了示例的目的,现在假定occ caesar> occ brutus,即caesar
在内容中比brutus
更频繁地出现。
你做什么,然后通过对brutus
第一和搜索在页面列表caesar
他们每个人的所有页面是迭代。如果确实列表可以在对数时间内搜索,这意味着你需要
OCC 布鲁特斯 *日志(OCC 凯撒)
计算步骤来标识包含两方面的所有页面。
如果您有反向完成了(即通过caesar
列表进行迭代,寻找它的每一个在brutus
列表页),较小的数量将在对数落得和更大数量将成为一个因素,所以评估所需的总时间会更长。 (a)列表不仅仅是排序而且是压缩的,这使得搜索变得更加困难,(b)列表的一部分可能存储在磁盘而不是内存中,这意味着磁盘访问的总数比计算步骤的总数要重要得多。因此,上述算法可能不适用于其最纯粹的形式,但其原理如上所述。
- 1. C++评估顺序
- 2. 减法 - 评估顺序
- 3. find中的评估顺序
- 4. eval函数 - 评估顺序
- 5. 红宝石评估顺序
- 6. Clojure递归评估顺序
- 7. cataM的评估顺序
- 8. 表达式评估顺序
- 9. JavaScript中的评估顺序
- 10. 评估顺序调用
- 11. C++中的评估顺序
- 12. 优先次序和评估顺序
- 13. 反转顺序
- 14. Oracle SQL子句评估顺序
- 15. initializer_list中的评估顺序C++ 11
- 16. 按照什么顺序评估MySQL JOIN?
- 17. 选择“where子句”评估顺序
- 18. 执行/评估的标头顺序
- 19. 评估顺序对行的SQLite中
- 20. F#评估的顺序是什么?
- 21. 折叠表达式的评估顺序
- 22. 比较运算符的评估顺序?
- 23. Java的队列评估顺序
- 24. Vue js计算属性评估顺序
- 25. Group JSR 303中的评估顺序和顺序
- 26. 蟒蛇评估和字符串索引
- 27. MySQL索引顺序
- 28. 反向布尔值评估
- 29. 懒惰评估的索引序列类型
- 30. 反转数据顺序