这是分布式搜索引擎系统,在1秒内处理50 ~ 100次请求。
每个搜索请求都需要在多个服务器之间合并排序搜索的文档。
有一个主服务器和N个从服务器。
每个从服务器都有带有分数数据(Entry[])的文档id列表。
条目如下。
docuemnt id (int) \x{e76f}\x{e76f} (byte[]) \x{e76f}\x{e76f}
主服务器必须对每个从服务器条目列表进行合并排序并生成页面数据(例如: 5000~5100)。
Limitation1)不要使用巨大的内存。无法一次在内存中对整个文档进行合并排序。Limitation2)不使用临时文件。临时文件可能会使搜索系统变慢。
如果用户希望N个文档从R(平均秩R)开始,那么..。
解决方案-1) 1.在每个从服务器上编制R+N排序列表,并将其发送给主服务器。(使用堆结构) 2.主服务器合并排序并使Top R+N3。从R开始返回N个文档
问题-1) 1.每个从服务器必须维护内存中的顶级R+N文档。如果主服务器在内存中获取每个从服务器R+N文档,则可能会出现外部内存错误。
解决方案-2) 1.每个从服务器将未排序的文档列表和分数数据发送给主服务器。(根据内存限制的数据块) 2.主服务器进行n路合并排序。
问题-2) 1.用户只需要N个文档,但是从服务器必须发送整个文档列表。(网络传输数据变得太大)
这个案子还有其他好的解决办法吗?
我认为从R生成排序的N文档需要用每个docuemnt列表计算,对吗?
哪个是好的?“本地排序和远程合并”还是“远程整体列表”?
我最后一周被困住了。
提前谢谢。
发布于 2014-01-18 03:26:06
你应该把这个问题看作是一个不同的观点。显示后的结果页是高成本的作业,而且很少使用。搜索引擎必须提供用户想要的文件,名列前茅。用户必须能够在不到10页的时间内找到有意义的文档。例如,amazon只为总搜索结果提供前20页,为cateogry指定的搜索结果提供400页。这意味着,如果搜索引擎提供高质量的结果,那么没有人需要上千个结果页面。查看此文档:http://www.slideshare.net/songaal/ss-30031348
https://stackoverflow.com/questions/21114614
复制相似问题