1. 您的位置:首页 > seo技术 >内容

「node」[Careercup]10.7简化搜索引擎简单搜索引擎

10.7想象一个简化搜索引擎的Web服务器。该系统有一台机器来响应搜索查询,如果使用Processsearch(字符串查询)调用其他机器集群以实际获得结果。响应给定查询的哈希表机器是随机选择的,因此不能保证同一台机器总是会响应相同的请求。方法Processsearch非常昂贵。为最新查询设计缓存机制。请务必解释数据更改时如何更新缓存。

这个问题说假有一个简单的搜索引擎Web服务器,系统有100台机器对检索做出响应,您可以使用Processsearch(字符串查询)在其他机器上获取结果,每台机器响应检索是随机的,不能保证每个人都会回应相同的请求。Processsearch方法非常昂贵,并设计了一种缓存机制来处理最近的搜索。如本书所述,让's首先做一些假设:

1. 最好将所有检索处理设置在第一台调用的机器上,而不是根据需要调用Processsearch。

2. 我们需要缓存检索非常大。

3. 机器之间的呼叫很快。

4. 搜索的结果是一个有序的URL列表,每个URL列表包含50个字符的标题和200个字符的摘要。

5. 最常访问的搜索将始终显示在缓存中。

系统要求:

主要要求是实现以下两个功能:

1. 有效查找关键字的时间

2. 新数据将替换旧数据位置

搜索结果更改时,我们还需要更新和清除缓存。由于一些非常常见的检索疾病永久存在于缓冲区中,我们不能等待缓存自然失败。

第一步:设计单个系统's内存寄存器

我们可以使用链接列表和哈希表的混合,当访问节点时,我们创建一个列表,自动将其移动到开头,以便列表的末尾是最旧的数据。我们使用哈希表来建立搜索和列表中节点的映射,这样我们不仅可以有效地返回缓存结果,还可以将节点移动到列表的前面,请参见下面的代码:

classNode{Public:Node*Pre;Node*Next;Vectorresults;string Query;Node(string Q,VectorRes){results=Res;Query=Q;}};classCache{Public:Const Static intMax_size=10;Node*head,*tail;Unordered_mapm;intSize=0;Cache(){}voidMovetofront(Node*Node){if(Node==head)返回;Removefromlinkedlist(节点);node->next=Head;if(Head!=nullptr){Head->pre=node;}Head=node;++size;if(Tail==nullptr){Tail=node;}}voidMovetofront(stringquery){if(m.find(query)==m.end())返回;Movetofront(m[query]);}voidRemovefromlinkedlist(node*node){if(node==nullptr)返回;if(node->next!=nullptr | | Node->pre!=nullptr){--size;}Node*pre=Node->pre;if(pre!=nullptr){Pre->next=node->next;}node*next=node->next;if(next!=nullptr){Next->pre=pre;}if(node==head){head=Next;}if(node==tail){tail=pre;}node->Next=nullptr;node->pre=nullptr;}VectorGetResults(string query){if(m.find(query)==m.end())returnvector();node*node=m[查询];Movetofront(node);returnNode->results;}voidInsertresults(stringQuery,vectorresults){if(M.find(query)!=M.end()){Node*Node=M[query];Node->results=results;Movetofront(Node);return;}Node*Node=NewNode(query,results);Movetofront(Node);M[query]=Node;if(Size>max_Size){for(unordered_map::iterator it=M.begin();it!=M.end();++it){if(it->first==tail->query)M.erase(it);}removefromlinkedlist(tail);}};

第二步:扩展到多台机器

对于多台机器,我们有许多选项:

选项1:每台机器都有自己的缓存,这种方法的优点很快,因为没有机器间调用,但缺点效率不高

选项2:每台机器都有缓存副本,当新项目添加到缓存时,发送到所有机器,旨在让所有设备上都存在共同搜索,缺点是缓冲区空间有限,无法保存大量数据

选项3:每台机器都保存一部分缓存,当机器需要获得搜索结果时,需要找出哪一台具有结果并在该结果上获得结果。但问题是我知道机器如何具有结果的机器,我们可以使用哈希表来建立映射,哈希(查询)%N,可以快速知道哪台机器具有所需的结果。

步骤三:当内容更改

时更新结果

一些检索非常常见,因此缓冲区中总是存在,我们需要一些机制来更新结果,当其内容更改时,应相应地转换结果页面的缓存,主要在以下三种情况下:

1. URL的内容已更改

2. 当页面's排名发生变化时,结果顺序发生变化。

3. 特定搜索的新页面

对于1和2,我们设置了一个单独的哈希表,告诉我们哪个搜索和映射哪个URLnode,可以在不同的机器上单独完成,但可能需要大量数据。此外,如果不需要立即刷新数据,我们可以定期更新缓存。对于3,我们可以实现一个自动超时机制,我们设置一个时间段,如果在这个时间段内没有检索,不管它之间检索的频率如何,我们都会清除它,以便所有数据都会定期更新。

第四步:进一步增强

优化是当搜索特别频繁时,例如检索比例的1%,我们让机器我向机器J发送请求,而不是在机器I上,因为存在它自己的缓存。

,然后我们将根据散列值检索不同的机器,而不是随机分配它们。

另一个优化是前面提到的自动超时自动超时机制,即在X分钟后自动擦除数据,但有时我们想为不同的数据设置不同的X值,以便每个URL都有一个超时值根据此页面更新的频率。

[Careercup]10.7简化搜索引擎简单SEO

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。如若转载,请注明出处:http://www.botadmin.cn/sylc/5047.html