搜索缓存

1.       使用缓存必要性

(1)提高搜索速度 搜索引擎的搜索速度对用户的搜索体验非常关键,如果一个搜索引擎搜索速度非常慢,需要搜索某一关键词需要等一段时间才能显示,那么将严重伤害用户体验。为了提高搜索速度,百度、谷歌等主流搜索引擎都使用搜索引擎缓存技术

(2)提高热门关键词的搜索效率 用户搜索某一个关键词和我们购买某一个产品是一样的,都存在二八原理,就是20%的用户产生80%的效果,80%的用户只产生20%的效果。用户搜索关键词也是一样,20%的关键词占据80%的搜索量,这些关键词占据绝大部分搜索量,但是搜索的关键词都是一样的。搜索引擎为了提高热门关键词的搜索效率,把这些热门关键词的搜索排序结果直接缓存在百度缓存数据库,当用户搜索该关键词时,搜索引擎不需要重新关键词匹配、关键词排序、关键词相关性匹配等,直接从缓存数据库返回关键词搜索结果。

(3)用户查询请求具备时间局部性 即大多数重复的用户查询会在较短的间隔时间被再次重复访问。

(4)有效减少搜索引擎后台计算量,节约系统资源 搜索引擎的缓存数据对搜索引擎的性能提升是非常关键的,比如百度搜索引擎,每天搜索量数亿次,而且众多的分布式服务器,以及复杂的合并算法,都是非常耗时的,如何能抗得住大量用户并发同时搜索,没有结果缓存,那么将严重影响搜索引擎的搜索时间,对搜索引擎硬件提出非常大的要求,使用缓存技术将大大降低对搜索引擎硬件的要求,并且大大提高了搜索引擎响应时间。

2.       搜索结果的实时性

缓存也带来了新的问题,就是实时性不好,对于互联网来说,每个数据不可能一成不变,网页和索引库中的文件内容也会随着时间的变化而发生变化,搜索引擎为了使缓存中的结果和网页内容同步,这个时候就有必要对缓存中的文件进行一个更新,那么这个更新的频率是怎么样的呢?一般的情况下,用户在较短时间内重复搜索的结果一般是相同的,不会发生太大变化,但是在不同的时间,例如白天和晚上这两个点,搜索的结果可能就很容易看出来不同了,所以一般搜索引擎的缓存更新机制是在半夜搜索请求比较少的时候。不过并不是所有的更新都是在这个时间,搜索引擎还会分析关键词的属性作出一定的调整。

3.       如何缓存

(1)按查询串对搜索结果缓存

比如在baidu搜索,它如何缓存?比如搜索“java”,缓存第一页数据,但是可能别人搜索“java jdk”,这样又缓存一份第一页数据,即对每个关键字对应的结果只缓存第一页。

(2)搜索结果二次索引

 对搜索合并结果进行重做索引,也就是我们把分布式运算过来的数据在这里重新做索引,好处是减少下次的分布式搜索和对每台分布式返回结果进行排序合并的过程,下次搜索只到这个小缓存索引中搜索,相当于分布式搜索服务器中的一台,但是这台是很多服务器已经精选出来的内容。

这样的缓存需要控制量,比如“java”缓存了前100篇文章,“jdk”缓存了前100篇文章,如果搜索“java jdk”,他们的交集只有10篇,我们可以猜测搜索出的结果个数1000,那么就显示搜索结果个数约1000个(baidu,google结果都是约,而且最后两位都是零),到了101篇去分布式搜索,用户一般很少翻到那么深,而且baidu,google只显示300页。

对搜索引擎来说,只要对适当范围内的索引文件进行检索就可以了。一般百度最多会呈现760个,谷歌最多1000个。所以一般的搜索引擎都建立了能够满足大众搜索请求的小范围网页索引集合也就是“有效索引”。

4.       缓存的系统架构 

4.1.             搜索引擎正常搜索流程:

1、搜索引擎接收用户查询请求;

2、搜索引擎对用户查询词(语句)进行分词;

3、计算每一个查询词的权重,构成一个查询向量;

4、将存储在磁盘上的对应单词的倒排列表读入内存,之后进行解压缩;

5、求两个单词对应倒排列表的交集,找到所有包含两个单词的文档集合;

6、根据排序算法来对每个文档的相关性进行打分,按照相关度输出相关度最高的搜索结果;

7、根据规则及条件对搜索结果进行二次排序;

8、根据用户请求将结果返回给客户端。

4.2.             加入缓存的工作流程

1、搜索引擎接收到用户查询;

2、首先在缓存系统查找,看缓存内是否包含用户查询的的搜索结果;

3、如果发现缓存已经存储了相同的查询的搜索结果,则从缓存内读出结果展现给用户;

4、如果缓存内没有找到相同的用户查询,则将用户查询按照常规处理方式交由搜索引擎返回结果,并将这条用户查询的搜索结果及中间数据根据一定策略调入缓存中

4.3.             组成部分

缓存系统包含两个部分,即缓存存储区及缓存管理策略。缓存存储区是高速内存中的一种数据结构,可以存放某个查询对应的搜索结果,也可以存放搜索中间结果,比如一个查询单词的倒排列表。

缓存管理策略又包含两个系统,即缓存淘汰策略和缓存更新策略。

之所以需要缓存淘汰策略,是因为不论给缓存分配多大的空间,当系统运行到一定程度,很可能缓存已经满了,当有新的需要缓存的内容要进入缓存时,需要根据一定的策略,从缓存中剔除一部分优先级别较低的缓存内容,以腾出空间供后续内容放入缓存存储区,如何选择替换项目是缓存淘汰策略需要考虑的问题。

在一般应用场景中,搜索引擎要处理的文档集合是动态变化的,可能会面临新加入的文档,也可能会删除旧的文档内容发生了变化。当索引已经反映了这种变化,而缓存数据没有随着索引做出相应的变化,那么就会发生缓存内容和索引内容不一致的问题。缓存更新策略就是用来维持两者一致性的。

对缓存引擎系统来说,一个优秀的缓存系统,希望能够在以下几个方面表现出色。

1、最大缓存命中率

所谓缓存命中率,就是说一段时间内所有用户发出的查询中,有多大比例的查询对应的搜索结果是从缓存中获得的。这个比例越高,说明缓存管理策略越成功,就有效地节省了搜索引擎的计算成本。具体而言,不同的缓存淘汰策略就是采用不同算法来获得尽可能高的命中率。

2、缓存内容与索引内容保持一致性

好的缓存管理策略应该避免出现缓存内容和索引内容不一致的状况,因为这种不一致会影响用户搜索体验,所以缓存系统需要有优秀的缓存更新策略来达到这个目的。

4.4.             缓存结构

搜索引擎缓存的结构设计可以有多种选择,最常见的是单级缓存,也可以设计为二级甚至是三级缓存结构。

单级缓存是一种最常见也最简单直接的缓存结构,缓存系统中只包含一个单一缓存,配以缓存管理策略构成了整个缓存系统。

尽管单级缓存只包含一级缓存,但是对于不同缓存对象类型来说,其内部处理流程有一定差异。搜索结果型缓存首先在缓存中查找是否包含用户查询,如果存在则直接将搜索结果返回,否则对用户查询进行处理,由搜索系统返回搜索结果并加入缓存中,之后将搜索结果返回给用户。对于倒排列表型缓存,其处理步骤正好相反,查询处理阶段首先将用户查询分词,之后在缓存中查找这些单词对应的倒排列表,如果所有单词的倒排列表都在缓存中,则由查询处理模块根据单词倒排列表对搜索结果进行排序,并将搜索结果返回给用户。如果发现某些单词的倒排列表不在缓存中,会首先从磁盘读入单词对应的倒排列表,将其放入缓存,之后讲查询处理步骤。

二级缓存结构由两级缓存串联构成,第1级缓存是搜索结果型缓存,第2级缓存是倒排列表型缓存。当系统接收到用户查询时,首先在一级缓存查找,如果找到相同查询请求,则返回搜索结果;如果在一级缓存没有找到完全相同的查询,则转向二级缓存查找构成查询的各个单词的倒排列表,如果某些单词的倒排列表没有在二级缓存中找到,则从磁盘读取对应的倒排列表,进入二级缓存;之后,对所有单词的倒排列表进行求交集运算并根据排序算法排序输出最相关的搜索结果,将相应的用户查询和搜索结果放入一级缓存进行存储,并返回最终结果给用户。采用两级缓存结构的出发点在于能够融合搜索结果型缓存的用户快速响应速度和倒排列表型缓存的命中率高这两个优点。


4.5.             缓存淘汰策略(Evict Policy)

缓存淘汰策略是任何缓存必须配备的管理策略。因为缓存的大小总是有限的,当缓存已满的时候,如果有新的缓存项需要加入,那么必须从已有的缓存项中剔除相对最不重要的项目,而不同的缓存淘汰策略就是根据不同的算法来衡量项目的重要性,并剔除掉最不重要项目占用的内存空间。缓存淘汰策略方法众多,从宏观角度,可以将其分为动态策略和静态动态混合策略。

4.5.1           动态策略

动态策略的缓存数据完全来自于在线用户查询请求,这种缓存策略的基本思路是:对缓存项保留一个权重值,这个权重值根据查询命中情况动态调整,当缓存已满的情况出现时,优先淘汰权重值最低的那个缓存项,通过这种方式来腾出空间。比较常见的动态策略包括:LRU策略、LandLord策略及SLRU等改进策略。

LRU策略:最近最少使用策略(Least RecentlyUsed)

LRU淘汰策略是计算机领域使用非常广泛的缓存替换算法,在操作系统内存管理和Web页面缓存等领域也发挥着重要作用。LRU策略的基本思想是:当缓存已满时,将在设定的时间范围内使用次数最少的项目剔除出缓存,也就是将在设定时间段范围内最少访问的用户查询剔除掉。

在实际系统中,往往为每个缓存项设置一个计数器,将命中查询的计数器清零,与此同时,其他查询计数器加1。如果缓存己满,则将计数器数值最大的项目剔除出缓存。

LandLord策略

LandLord策略是一种加权缓存策略(Weighted Cache)。其基本计算流程如下:当一个缓存项插入缓存的时候,会根据缓存项能够获得收益和缓存项所占内存大小的比率设定一个过期值(Deadline),可以将这个比率理解为系统缓存这个项目的性价比。如果缓存已满,需要剔除项目的时候,选择过期值最小的项目进行淘汰,即淘汰性价比最低的项目。同时,其他未被淘汰的项目对应的过期值都减去被淘汰项目的过期值,如果一个查询请求在缓存中命中时,会相应地将其过期值根据一定策略调大。

SLRU策略:大小自适应LRU (Size-adjustedLRU)

SLRU策略是对LRU方法的改进。缓存被分为两个部分:非保护区域和保护区域。每个区域的缓存项都按照最近使用频度由高到低排序,频率高端叫做MRU,低端的叫做LRU。如果某个查询没有在缓存中找到,那么将这个查询放入非保护区域的MRU端;如果某个查询在缓存中命中,则把这个查询记录放到保护区的MRU端;如果保护区已满,则把记录从保护区放入非保护区的MRU,这样保护区的记录最少要被访问两次。淘汰机制是将非保护区的LRU端缓存项淘汰。

4.5.2           混合策略

动态策略的缓存数据完全来自于在线用户查询请求,混合策略与此不同,其缓存数据一方面来自于在线用户查询,一方面来自于搜索日志等历史数据。目前效果较好的混合策略包括SDC策略和AC策略。

SDC策略——静态动态混合缓存策略(Static and DynamicCaching)

SDC策略是一种混合缓存策略,SDC将缓存切割为两个部分,一个静态缓存与一个动态缓存。所谓静态缓存,即缓存内容是事先根据搜索日志统计出的最高频的那部分查询请求,在一定时间范围里是相对不变的;而动态缓存则可以配合使用LRU等其他缓存管理策略,根据用户查询请求不断更换内容。通过同时使用静态缓存和动态缓存,可以有效增加缓存请求命中率。SDC是目前效果最好的缓存策略之一。

AC策略——准入策略(Admission Control)

准入策略是类似于SDC策略的一种方法。该方法也将缓存分为两个部分,分别存储高频出现的历史用户查询和动态出现的用户查询及其对应的搜索结果。与SDC不同之处在于:SDC的静态缓存所存储的高频用户查询是完全从过去的搜索日志统计得来的静态内容,而AC策略则综合搜索日志的统计数据、查询长度等多个判断因素,以此来预测某个查询是否会在未来被多次访问,如果判断是,则放入高频用户查询缓存。

4.6.             缓存更新策略(Refresh Policy)

如果搜索引擎的索引内容不发生变化,缓存的内容就总是和索引系统保持一致。但是搜索引擎索引经常更新,如果索引内容发生变化,而缓存内容不随着索引变动,会导致缓存内容和索引内容的不一致,这种不一致对于用户的搜索体验会造成负面影响。缓存更新策略就是通过一定的技术手段尽可能保持缓存内容和索引内容的一致性。

目前很多搜索引擎使用简单的更新策略,即在搜索引擎比较繁忙的时候不考虑缓存更新问题,而等到搜索引擎请求很少的时候,比如午夜等时间段,将缓存内的内容批量进行更新,使缓存内容保持和索引内容的一致。这种简单策略适合索引更新不是非常频繁的应用场景,对于索引更新频繁的场景,需要相对复杂些的缓存更新策略。

根据缓存内容和索引内容联系的密切程度,目前的缓存更新策略可以分为两种:缓存—索引密切耦合策略和缓存—索引非耦合策略。

缓存—索引密切耦合策略在索引和缓存之间增加一种直接的变化通知机制,一旦索引内容发生变化则通知缓存系统,缓存系统根据一定的方法判断哪些缓存的内容发生了改变,然后将改变的缓存内容进行更新,或者设定缓存项为过期,这样就可以紧密跟踪并反映索引变化内容。这种密切耦合策略在实际实现时是非常复杂的,因为频繁的索引更新导致频繁的缓存更新,对系统效率及缓存命中率都会有直接影响。当有新的索引文档进入淘宝搜索引擎时,系统会对文档内容进行分析,抽取出文档中得分较高的索引词汇,并将这些词汇及其得分传递给失效通知模块,因为如果缓存中的查询包含这些索引词汇的话,很可能该文档将会使得缓存内容失效,失效通知模块会评估哪些缓存项需要进行内容更新,如果某项缓存项需要更新,则提取最新的缓存内容更新旧缓存项。

 

缓存—索引非耦合策略则使用相对简单的策略,当索引变化时并不随时通知缓存系统进行内容更新,而是给每个缓存项设定一个过期值(Time To Live),随着时间流逝,项会逐步过期。通过这种方式可以将缓存项和索引的不一致尽可能减小。大多数搜索引擎就是采用了用了缓存—索引非耦合策略来维护缓存内容的更新。

5.       总结

1、使用搜索引引擎缓存技术可以加快用户响应速度并节省计算资源。

2、缓存系统的目标是最大化缓存命中率和保持缓存内容与索引内容的一致性。

3、缓存存储对象主要包括网页搜索结果及查询词对应的倒排列表。

4、缓存系统可以有多层级结构。

5、缓存淘汰策略方法众多,从宏观角度,可以将其分为动态策略和静态动态混合策略。

6.       缓存注意事项

1、缓存过期时间不要太长,不然搜索结果实时性太差;

2、只有搜了之后有结果的词才需要缓存;

3、按搜索量排序寻找热门搜索词最好按时段,比如最近一个月最热门的词,把历史数据都算上统计总量的话,往往与实际偏差较大。PS:分时间段做计数统计

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值