搜索网站或者常用的结构性网站分为几块内容,主要是:
1. 数据的获取:主要是spider,数据存储,业务系统的组织等;
2. 建倒排链的策略:主要是如何排序,选取特征训练model,还有个性化;
3. 前端系统:一个请求从网民发出,到ui/检索系统,根据具体的业务访问倒排链获取返回结果;
我说的这部分主要是数据获取的内容,spider主要讲的是两块:
1. 一块是选取链接保证时效性
2. 设置优先级,保证不同的任务都有调度的可能;
保证时效性:
保证链接的时效性,可以通过增加一个服务器签名server来保证,每次抓取完更新签名服务器,更新服务器,然后server用lru来使用,获取了数据之后,判断数据是否过期,如果没有过期,就用老的数据,如果过期就用新数据;
顺带想了想lru实现,一个hashmap一个双向链表:
1.插入:双向链表的头部插入,检查hashmap有key值没,有则设置该key值value,并将该key值对应的双向链表节点删除;如果不存在,且双向链表满了,则删除最后一个节点,同时将hashmap对应的key/value release掉;
2.查找:直接查hashmap;
设置优先级:
用的时间片轮转的方法,不同时间片之间不可抢占;
1. 优先级分1,2,3,优先级为1的占3个时间片,即一个轮询,先检查优先级1的队列,看是否有任务,有任务加入选取列表,最多选取整个时间周期长度的url,比如如果15分钟调度一次,则每秒抓取50个,就一共选取50*900个url;
2. 然后每个子任务的url是分别按域名进行抓取的,比如45000个url,按3个时间片来算,优先级1应该选取22500个url,25*900个url,任务1的url按照域名进行排序,每个域名内按更新时间进行排序,越早更新的排越前面,每个域名选取的url数量按百分比来计算同时不会选取超过时间周期的url个数,比如任务1一共有100000个合适的url,其中50个域名每个域名1000个url,500个域名每个100个url,那么一共会选取50*900+500*100=95000个url出来,然后当前域名最多选取:min(900, 900-该域名下已经选取的url数,域名下url个数*(当前出事的url个数,一开始是22500)/(当前剩余的url个数,一开始是95000))+1,url不会重复,同一个队列的任务一次选取完毕后,就放到队列的末尾,一个任务只能是1个时间片,默认优先级1可以有3个时间片,选取策略还是比较复杂的;基本这个策略就是1不同优先级的任务通过时间片保证选取的数量有区别,优先级高的任务选取url多;第二个保证同一个域名下最多只能选取900个url出来,单域名每秒只发一个,第三个保证相同域名的url不会重复;
在抓取的过程中:
1. 扩链按拓扑排序,避免环装抓取;
2. 图片/css等不用抓取
3. 链接需要改写,不规则url需要改写规则url
整体来说,简单的抓取分为:
selector->crawler->ec->dc->saver
selector是抓取的起点和终点,从linkbase中选取url进行抓取,上面说的扩链和优先级基本上都是selector做的事情,crawler是各种抓取器,ec做解析和计算权重等,dc做扩链,saver是为了减轻selector的工作量,主要用来做linkbase和扩链的合并,这些系统最开始是单机的,然后发布成为分布式,如果是分布式了需要一个控制系统做信息的管理,最简单的控制系统就是伽利略,用来做配置统一,再其实就是一个controller能够和各个子服务进行交互,收到请求后分发到各个子系统;