我们如何优化Google的自动填充功能?

时间:2015-08-20 05:18:58

标签: javascript algorithm

昨天我接受了XYZ公司的采访,他们给了我以下实时问题。

众所周知谷歌自动完成工作原理。它为你输入的每个字符发送一个AJAX调用。所以,即使我还没有完成输入,它也会向我按下的每个字符发送所有请求到服务器。 (例如,我想搜索who is the biggest fool on the internet,然后搜索它进行AJAX调用的每个字符。

问题是" 我们如何优化这个?"

如果再次按下键,我给了他解决方案以中止先前的ajax请求。但是,采访者似乎并不相信这一点。那么请建议什么是最好的解决方案呢?

提前致谢,

3 个答案:

答案 0 :(得分:0)

可能跟踪最后一次按键进入搜索字段,所以当一段时间过去(500ms或其他)时,则发送搜索字段的值。

答案 1 :(得分:0)

您可以通过让服务器从最后一个响应中发送增量来进行优化。例如,假设用户键入了几个字符并收到了前10个完成列表,这些列表显示给用户。现在他键入另一个字符,因此服务器计算前10个完成的新列表。该列表可能与前一个列表有一些共同的完成,还有一些新的完成。因此,我们的想法是仅计算和发送新的完成以及它们的位置,以便客户端可以更新其最高完成列表。

答案 2 :(得分:0)

没有太多可以做的,只是因为你必须使用的限制(浏览器,ajax,...)。

我能想到的唯一技巧是:

  1. 你检查每个角色。空格和其他特殊字符不会触发ajax请求,只会触发任何" real"字符。这样"我是"只有3个请求,而不是4个。
  2. 你添加一个"延迟"在输入第一个字符(或前两个字符)之后(例如100ms),这样你就不会对每个字符都有一个请求,但只输入每2个字符。如果有人以平均速度打字,应该可以节省相当多的字符。一些请求没有感觉不同。
  3. 而不是使用ajax,您进行websocket连接。这样,您可以在输入新字符时取消上一个请求。如果你仔细设计你的协议,你得到第一个字符(你已经显示)的前几个响应,但忽略其余的,因为第二个响应已经进入。
  4. 你" preload"一些数据。这可以通过已经加载页面本身中所有字母(a-z)的第一响应来实现,因此当用户键入第一个字符时,实际上没有请求,但仍然需要显示。
  5. 如果您使用技术2,您可以作弊并使用客户端解析来过滤上次请求任何术语的结果"仍然"匹配(即最后一个请求" wh" - >以及用户在" o"中键入,然后您获取上一个结果列表,并保留所有条目&#34 ;谁"在其中)。这样你就可以显示一些内容,即使响应还没有出现,另一方面,如果有足够的结果来处理新术语,你可能决定不发送请求。