这是分布式搜索引擎系统,在1秒内处理50~100个请求。
每个搜索请求都需要在多个服务器之间合并排序搜索的文档。
有1个主服务器和N个从服务器。
每个从属服务器都有包含分数数据的文档ID列表(Entry [])。
参赛作品如下。
| docuemnt id(int)|得分数据(byte [])|
主服务器必须合并排序每个从属服务器条目列表并制作页面数据(例如:5000~5100)
限制1)不要使用大量内存。无法一次对内存中的整个文档进行合并排序。 限制2)不要使用临时文件。临时文件可能会使搜索系统变慢。
如果用户想要N个文件从R开始(意味着等级R),那么..
解-1) 1.在每个从属服务器上制作顶级R + N排序列表,并将其发送到主服务器。 (使用堆结构) 2.主服务器合并 - 排序并生成Top R + N. 3.从R
开始返回N个文件问题-1) 1.每个从属服务器必须在内存中维护Top R + N文档 2.如果master在内存中获取每个从属服务器R + N文档,则可能发生Outofmemory错误。
解-2) 1.每个从服务器将未分类的文档列表与分数数据一起发送到主服务器。(用于内存限制的数据块) 2.主服务器执行n路合并排序
问题-2) 1.用户只需要N个文件,但是从服务器必须发送整个文件列表。(网络传输数据过大)
对于这种情况还有其他任何好的解决方案吗?
我认为从R生成排序的N文档需要计算每个docuemnt列表驻留在从属服务器之间,是不是?
哪个好? "本地排序和远程合并"或者"远程整个列表" ?
我被困了一周。
提前致谢。
答案 0 :(得分:1)
您应该将此问题视为不同的观点。 显示以后的结果页面是高成本的工作,并且它很少使用。 搜索引擎必须提供排名靠前的用户所需文档。 用户必须能够在不到10页的页面中找到有意义的文档。 例如,亚马逊仅为总搜索结果提供前20页,为cateogry指定的搜索结果提供400页。 这意味着如果搜索引擎提供高质量的结果,则无需数千个结果页面。 查看此文档:http://www.slideshare.net/songaal/ss-30031348