我在我的网站搜索框中创建自动建议功能,每次用户按下新密钥时,javascript调用服务器端的webservice从db获取10个最相关的关键字并再次给javascript和javascript填充搜索自动提示列表。
我的功能不是太慢,但与live.com或google.com做得非常慢,我测试了它们,我觉得他们从我的PC获取关键字而不是他们的服务器。
/>
他们如何非常快速地获得关键字,并确保他们的关键字数百万倍?
有这样一种着名的风格吗?
还使用我的萤火虫,我发现他们没有打电话给webservice“可能是通过我不知道的方式调用”,但我在网络标签中发现了一个新的获取。
答案 0 :(得分:4)
不确定你在哪里,但在live.com上我得到了每封信的请求:
正如你所看到的那样,很少有人回来 - 500B - 这就是你的目标 - 一个精益的网络服务,它将你需要的最小数量返回给用户。
然后,正如其他人所说的那样,缓存先前的回复等等。
并非结果通常不是按字母顺序排列的,因此如果您不显示订购标准,您可以遵循“现在某事情比以后更完全准确更好”的原则。
答案 1 :(得分:4)
如果在过渡期间有按键时,如果您每隔一定时间提出一次请求,而不是每次按键都会发出请求?如果你做了100毫秒间隔的事情,它仍然看起来“即时”,但可能会减少你服务器上的负载。此外,您是否让客户端缓存关键字?如果用户在搜索字段中退格,则不必重新联系服务器以获取关键字。此外,您可以立即过滤每个按键上的当前关键字列表,而无需联系服务器(您最终只会少于10个,因为您已经拥有的部分/全部不会包含刚刚输入的字母)。这可以填补实际数据请求之间的“空白”,使其看起来更加即时。
答案 2 :(得分:3)
没有理由要求每个按键都有搜索条件。 Google做到了这一点(1)因为他们可以,(2)因为他们在互联网语料库中展示了术语。
在大多数网络应用程序中,“常见”搜索术语的数量要少得多 - 通常不超过一百个,并且只有十几个适合上下文。
您可以检索整个相关术语集,并在页面加载时在客户端构建前缀映射。通过将当前搜索字词与此前缀地图进行匹配,您可以比Google更快地提供建议。
限制是,在某些时候,您将用尽建议的条款。但同样,这真的不是一个问题:即使是谷歌也没有提出“过渡性”的建议(一个简单的词,但完全搜索有191个结果)。
答案 3 :(得分:3)
您可以做两件事:
答案 4 :(得分:2)
我建议的第一件事是确保您的Web服务将关键字缓存在内存中而不是每次都访问数据库 - 当然假设您的数据集足够小,可以执行此操作。
除此之外,您必须在多个服务器上以某种方式并行化查询,这可能比您想要的更复杂。
答案 5 :(得分:2)
发现此博客文章,详细讨论了这一点:
答案 6 :(得分:1)
首先,你应该重新说出你的问题。任何回答“我怎么能像谷歌一样快”必然会“习惯于失望。”
鉴于此,您仍然可以更好地解决问题。看起来每个按键,你都可以往返服务和数据库。我怀疑谷歌会这样做。也许你应该专注于减少往返次数(cahcing,当你不得不去DB时再带回来等等)。
答案 7 :(得分:1)
正如上面有人建议使用带有REST API的ETag可能意味着对重复查询进行一些额外的缓存。查看有关Jeo Gregorio博客的this文章,了解有关REST环境中的更多信息etags。