August 12, 2005
搜索引擎的缓存机制::[Search Engine]

以前曾经提到过搜索引擎的缓存策略, 根据搜索引擎搜索的关键词的统计分布, 可以优化设计搜索引擎的缓存策略. 就普通的缓存策略上讲, 缓存是因为在一定的时间段内的搜索的关键词集中在一定的范围内, 并且这些搜索相对稳定. 例如每天搜索"美女"的人总有10万,20万, 而结果在这段时间相对稳定, 因此没有必要每次去检索索引文件, 而将上一个人搜索的结果直接返回便可以了.
搜索引擎缓存策略也同搜索引擎的算法密切相连, 除了搜索缓存, 索引缓存也是一个好方法. 独立或者分布一些权重较高的文档也是一种提高效率的方法. 例如我们有1000万的网页的权重(可以简单的理解为pagerank)比较高, 那么这些网页的排序相比另外一些权重较低的网页相对较为稳定, 就不妨独立出来进行相对独立的索引缓存.
关于缓存的分布, 一般的小型搜索引擎不会用到, 但是如果每天处理上亿次的搜索, 缓存的分布就应当有一定的分布规划, 例如根据提交的关键词构成hash table, 然后对应于不同的搜索服务器, 实现缓存的分布.
让我们看看实际例子吧, 我们拿百度, google, yisou, 中搜, tag.bokee.com 进行简单的测试:
因为测试, 要搜索一些在过去7天没有人搜索过的关键词, 或者组合词. 为了保证没有人搜索过, 我选择在各个搜索引擎里搜索"a s d f v g h" , 这是我在键盘上随机打出的一些组合, 相信这世界上在7天没有人相同搜索, 这样保证我的第一次的搜索是 fresh search, 就是一定需要搜索引擎去检索索引文件, 而不是通过缓存策略.
以下是结果:
百度: 0.279秒
google: 0.24 秒
一搜: 0.24 秒
中搜: 0.001秒(无结果!!!!)
博客搜索: 0.041 秒
下面是第二次搜索的结果:
百度: 0.001秒
google: 0.05 秒
一搜: 0.09 秒
中搜: 0.002秒(无结果!!!!)
博客搜索: 0.019 秒
经过简单的测试, 可以看出缓存机制只有在Baidu和google搜索引擎里都有, 但是各自效率不一样, 如下是简单的比例:
百度: 100
google: 5
一搜: 没有明显的缓存
中搜: 没有明显的缓存
博客搜索: 没有明显的缓存
而在缓存效率上百度要远远大于google, 这点大概是因为google的gfs本身的分布效率已经相当不错, 因此进行缓存也不会有数量级的提升.
而百度, 根据测试可能是集中方式的数据存储, 但是根据搜索进行hash分布, 因此才会在缓存上有显著的提升. (这个属于猜测)
搜索记录在以下位置:
http://www.wespoke.com/archives/download/se-buffer/baidu1.png
http://www.wespoke.com/archives/download/se-buffer/baidu2.png
http://www.wespoke.com/archives/download/se-buffer/google1.png
http://www.wespoke.com/archives/download/se-buffer/google2.png
http://www.wespoke.com/archives/download/se-buffer/tag1.png
http://www.wespoke.com/archives/download/se-buffer/tag2.png
http://www.wespoke.com/archives/download/se-buffer/yisou1.png
http://www.wespoke.com/archives/download/se-buffer/yisou2.png
http://www.wespoke.com/archives/download/se-buffer/zhongsou1.png
http://www.wespoke.com/archives/download/se-buffer/zhongsou2.png
Trackback
You can ping this entry by using http://www.wespoke.com/cgi-bin/mt/mt-tb.cgi/782
Comments
看了你的文章,我还真无聊到去试了试。
不过.... 我认为你光用搜索时间来判断不是很准确.google的数据量有多大我不知道,但百度自己说自己只是中文搜索引擎,那数据量应该比google稍逊一筹.
你多搜索几次google就知道每次的搜索时间都不相同,而baidu是一样,baidu这样的缓存机制简单了一点,有一定弊端,虽然对大部分使用者不会有多少体会.
:)
我认为搜索引擎的关键是在于是否能准确且人性化的搜索或引导出真正需要的内容,不能让搜索的作用只达到一个关键字对应10至100这样范围.
就像如果请教一位地理学家XXX地的特色,地理学家如果知道就会很清楚的告诉你,相对电脑有海量的数据但有可能给你一个牛头不对马嘴的东西。
不说了,我还真是话多,犹如滔滔江水,一发而不可收拾
Posted by: test at September 5, 2005 01:56 PM from 211.98.111.43我同意楼上的说法,还是要多做点测试才可以说这样的话,毕竟影响网络返回结果速度的因素太多了。
其次,评论一个搜索引擎的好坏,返回结果的速度是一个重要的标准,但是,0.1 0.8,又有多大的区别,我不好说。
Posted by: LiLiang at October 4, 2005 12:12 PM from 58.49.235.61i don't think your benchmark can accurately reflect the internals of search engines. think abou it.
everybody knows that search engines use ca-ching.
it's not a secret at all.
你的anti-spam太讨厌了。
Posted by: gcl at October 11, 2005 12:55 AM from 169.229.50.3"缓存" 的算法很多, 现成的包也很多, 很难想象哪个SE不用——为了性能(和经济)原因他们也不敢不用.
不过就我工作时的体验, SE的"缓存"比起通用"缓存"来, 还有许多需要推敲的地方. 这是个麻烦的课题, 即使像Google那样从底层构造的系统, 恐怕也花了很多精力在"缓存"上.
目前正为这件事头大...
你有很多独特的见解吧? 我会很关注的^_^
plus: 同意楼上, anti-spam系统真的很讨厌
你这样研究SE的缓存机制有点问题。虽然full text的搜索引擎和数据库搜索的处理方式不一眼个。但是我认为思路是一直的,就是对数据建立索引,然后对不通的索引再进行优化以应对不通的Query。但是你的测试是完全一样的关键字,这样的缓存对于搜索引擎是没有意义的。
还有就是他们说的anti-spam是什么
Posted by: 天才狐狸 at November 5, 2005 03:36 AM from 219.239.178.146另外也可以从另一个侧面说明baidu的用户数量不如google,缓存会替换的,如果用户的兴趣各异,那么缓存替换的就越快,缓存效果就不是很明显.
Posted by: HU at November 23, 2005 09:02 PM from 219.142.122.14 提交一个booso的bug
本来想用booso查看一些信息,突然发先了booso的一个bug:在查询的结果的item中,有nbsp; 和形如 的 words,这个有两个原因:
一、是用户编辑文章的时候,写错了" ",不过这个可能性比较小
二、booso再转换、解析、过滤blog简介/rss的item的descripation,没有正确识别这些信息。
不过不管那些信息,都应该在生成索引的时候,把“nbsp; ”和“ ”过滤掉,这些words本身也没有什么意义。
刚才的信息update:
在生成索引的时候,应该把"nbsp;" 和-" "过滤掉
Posted by: 梦游魂地 at December 14, 2005 02:32 AM from 61.151.249.51