对于搜索引擎来说,索引存放在成千上万台机器上,如何进行分布式搜索呢?
假设搜索结果是以分页的方式显示,以PageNumber代表当前页,从1开始,以PageSize代表页面大小,默认为10,以N代表搜索服务器数量。最简单的分布式搜索算法为:有一台合并服务器负责接受用户的搜索请求,然后分别向N台机器获取前PageNumber*PageSize条结果,得到的结果数为N*PageNumber*PageSize,然后把这些数据重新进行排序,根据所要显示的页面PageNumber,获取从(PageNumber - 1) * PageSize + 1开始的PageSize条结果返回给用户。
这个算法很简单,但有一些问题:
问题一:每次翻页都要向每台搜索服务器搜索一遍
通常情况下,用户在搜索内容时都是顺序翻页的,即从第一页往下顺序翻,这个算法没有设计缓存来减轻搜索服务器的压力。
问题二:越往后翻页,搜索服务器的搜索压力越大
如果我们是查第100页,即第991-1000 条记录,那么这个算法需要从N台搜索服务器分别获取1000条记录才能完成,对于每台搜索服务器的搜索压力很大。
问题三:越往后翻页,合并服务器的排序压力越大
大型搜索引擎往往是由成千上万台机器组成的分布式搜索集群,如果按这个算法来进行翻页,假设N为1000,查询第100页时,合并服务器得到的结果数为N*PageNumber*PageSize = 1000 * 100 * 10 = 1000000,要对这100万条结果进行排序,对合并服务器来说压力很大。对系统的可伸缩性是一种极大的破坏。