【发布时间】:2014-01-14 13:21:19
【问题描述】:
这是分布式搜索引擎系统,在 1 秒内处理 50 ~ 100 个请求。
每个搜索请求都需要在多个服务器之间合并排序搜索的文档。
有1个主服务器和N个从服务器。
每个从服务器都有带有分数数据的文档 ID 列表 (Entry[])。
条目如下。
|文档 ID (int) |分数数据 (byte[]) |
主服务器必须对每个从服务器条目列表进行合并排序并制作页面数据(例如:5000~5100)
限制1) 不要使用大内存。无法一次对内存中的整个文档进行合并排序。 限制2)不要使用临时文件。临时文件可能会使搜索系统变慢。
如果用户想要 N 个文档从 R 开始(表示排名 R)然后 ..
解决方案-1) 1.在每个从服务器上制作top R + N排序列表并将其发送到主服务器。 (使用堆结构) 2. 主服务器归并排序,使Top R+N 3. 返回从R开始的N个文档
问题-1) 1.每个从服务器都要维护内存中的Top R+N个文档 2.如果master在内存中获取每个slave服务器R + N个文档,可能会出现Outofmemory错误。
解决方案-2) 1.每个从服务器向主服务器发送未排序的带有分数数据的文档列表。(以数据块为内存限制) 2. 主服务器做n-way归并排序
问题 2) 1.用户只需要N个文档,但从服务器必须发送整个文档列表。(网络传输数据太大)
对于这种情况还有其他好的解决方案吗?
我认为从 R 制作排序的 N 个文档需要计算每个文档列表驻留在从服务器之间,对吗?
哪个好? “本地排序和远程合并”还是“远程整个列表”?
我在过去 1 周遇到了困难。
提前致谢。
【问题讨论】:
标签: algorithm sorting search search-engine