nutch的cache策略及cache策略研究(转帖)
一个成熟的商业搜索引擎的cache应该是比较成功的,因为在长期的实践中证明 cache的好坏很大地影响着搜索引擎的效率。虽然I/O、算法等等很大地影响着搜索效率,但是在相差不大或着说在同一数量级上时,cache却可以让引 擎的效率成倍或大大地提高。在nutch中当然也是有cache的,只不过比较初级而已。
在nutch中负责cache的是LuceneQueryOptimizer
nutch中的cache策略是LRU(最近最少使用),nutch里有两个这个类会把各个子clause进行处理,把clause.getBoost ()==0.0的query对象cache到filter里,由于范围查询lucene支持得不好,所以会rangeQuery也cache进来。
因为nutch只做了这一级cache,对于一个全网范围的搜索引擎,这样的cache是远远不够的。
结合一下我们的经验向大家介绍一下搜索引擎领域内的cache。
一.关于搜索引擎用户查询得出的结论:
(1) 用户查询有很大比例的重复性。有30%到40%的用户查询是重复查询。
(2) 大多数重复的用户查询会在较短的间隔时间被再次重复访问。
(3) 大多数用户的查询是短查询,大约包含2-5个单词。
(4) 用户一般只查看返回结果的前三个页面(前30个返回结果)。58%用户只查看第一个页面(TOP 10),15%用户查看第二个页面,不超过12%的用户会查看第三个页面以后的检索结果。
(5) 关于用户查询差异程度。有比较大的查询程度,一百万个用户查询中大约63.7%的用户查询只出现过一次。另外一方面,集中的重复查询也非常集中:25个高频查询大约占总查询的1.23%-1.5%.
二.CACHE的基本策略
(1) LRU:最近最少使用策略
基本假设:最近很少被重复访问的缓存记录在最近的将来也不会被访问。这是最简单的一种CACHE策略。将用户查询按照最近使用时间进行排序,淘汰策略将最老的查询淘汰出CACHE。
(2) FBR:不仅考虑时间也考虑引用计数的问题。
FBR在LRU策略的基础上将CACHE分为三个不同的部分:NEW,OLD,MIDDLE
NEW:存储最近被访问过的记录;
OLD:存储最近最少使用的一批记录;
MIDDLE:存储介于NEW和OLD之间的一批记录;
引用计数的时候不考虑NEW区域的记录,只考虑OLD和MIDDLE两个区域的记录引用计数增加,在替换记录的时候从OLD区域选择引用计数最少的那个记录进行替换。
(3) LRU/2:对于LRU的改进,计算第二次到最后一次被访问总的LRU,将老的记录淘汰。
(4) SLRU:
CACHE被分为两个部分:非保护区域和保护区域。每个区域的记录都按照最近使用频度由高到低排序,高端叫做MRU,低端叫做LRU。如果某个查询没有在CACHE找到,那么将这个查询放入非保护区域的LRU端;如果某个查询在CACHE命中,则把这个查询记录放到保护区的MRU端;如果保护区已满,则把记录从保护区放入非保护区的MRU,这样保护区的记录最少要被访问两次。淘汰的机制是将非保护区的LRU淘汰。
(5) LandLord策略
将一个记录增加到CACHE的时候,给予这个记录一个值(DEADLINE),如果需要淘汰记录的时候,选择CACHE里面DEADLINE最小的那个淘汰,同时将CACHE里面其它所有记录减去这个被淘汰的记录的DEADLINE值,如果一个记录被命中,则将这个记录的DEADLINE放大到一定值。
(6) TSLRU:Topic based SLRU:与SLRU策略相同,不过不是按照查询调整替换策略,而是按照查询所属主题进行调整。
(7) TLRU: Topic based LRU
基本策略和LRU相同,区别在于保留查询的主题(TOPIC)信息,对于某个查询来说,不仅该主题的检索结果进入CACHE,而且原先在CACHE里面的相同主题的查询及其结果也调整时间,更新为最新进入CACHE。可以看作是主题LRU,而LRU是查询LRU。
(8) PDC (probability driven cache):针对用户的浏览行为建立概率模型,然后调整CACHE里面的记录优先级别,针对某个查询,将用户浏览数目比较多的文档在CACHE里面的级别提高。
(9) 预取策略
所谓预取,就是系统预测用户在很短时间内的行为,然后将该行为涉及到的数据预先存储在CACHE里面。存在不同的预取策略,比如预取策略:因为一般用户在查看完第一页检索结果后会翻看第二页结果,所以将该用户查询的第二页结果首先预取到CACHE里面,这样可以减少存取时间。
(10) 二级CACHE
有两级CACHE,一级是查询结果CACHE,保留了原始查询以及相关文件;第二级CACHE是倒排文档列表CACHE,也就是查询中某个单词在索引中的倒排列表信息,这个CACHE主要减少了磁盘I/O时间。替换策略采取LRU,结果证明该方法提高30%的性能。
(11) 三级CACHE
是对二级CACHE的一种改进策略,除了二级CACHE里面保留的两个CACHE,另外增加一个CACHE,这个CACHE记录了两个单词查询的倒排文档交集记录,这样一个是省去了磁盘I/O时间,另外一个减少了计算交集的操作,有效的减少了计算量。
三.CACHE方法性能分析与比较
(1) LRU适合存储比较小的记录效果才好。
(2) 中等大小的CACHE能够满足很大一部分重复用户查询。(大约20%的查询能够在中等大小CACHE找到)
(3) 将时间因素和命中次数结合起来的缓存策略好于只考虑时间因素的策略。实验表明FBR/LRU2/SLUR性能总是好于LRU策略。
(4) 对于小CACHE来说,静态CACHE策略要好于动态CACHE策略,命中率要高些。
(5) 对于LRU来说,大CACHE的重复命中率大约占30%。
(6) 对于大CACHE来说,TLRU略微好于LRU,但是差别不太大。对于小CACHE,结论正好相反。
(7) 随着CACHE逐步增大,命中率逐渐增加,对于SLRU来说,其性能跟两个分区划分大小无关。
(8) PDC的命中率高于LRU变形算法,大约有53%命中率,不过计算复杂度高。