如何创建自动提示以获得与谷歌搜索或实时搜索一样快的关键字

时间:2009-04-21 20:39:16

标签: asp.net javascript autocomplete

我在我的网站搜索框中创建自动建议功能,每次用户按下新密钥时,javascript调用服务器端的webservice从db获取10个最相关的关键字并再次给javascript和javascript填充搜索自动提示列表。

我的功能不是太慢,但与live.com或google.com做得非常慢,我测试了它们,我觉得他们从我的PC获取关键字而不是他们的服务器。
/> 他们如何非常快速地获得关键字,并确保他们的关键字数百万倍? 有这样一种着名的风格吗?
还使用我的萤火虫,我发现他们没有打电话给webservice“可能是通过我不知道的方式调用”,但我在网络标签中发现了一个新的获取。

8 个答案:

答案 0 :(得分:4)

不确定你在哪里,但在live.com上我得到了每封信的请求:

Firbug Net Console - AutoComplete

正如你所看到的那样,很少有人回来 - 500B - 这就是你的目标 - 一个精益的网络服务,它将你需要的最小数量返回给用户。

然后,正如其他人所说的那样,缓存先前的回复等等。

并非结果通常不是按字母顺序排列的,因此如果您不显示订购标准,您可以遵循“现在某事情比以后更完全准确更好”的原则。

答案 1 :(得分:4)

如果在过渡期间有按键时,如果您每隔一定时间提出一次请求,而不是每次按键都会发出请求?如果你做了100毫秒间隔的事情,它仍然看起来“即时”,但可能会减少你服务器上的负载。此外,您是否让客户端缓存关键字?如果用户在搜索字段中退格,则不必重新联系服务器以获取关键字。此外,您可以立即过滤每个按键上的当前关键字列表,而无需联系服务器(您最终只会少于10个,因为您已经拥有的部分/全部不会包含刚刚输入的字母)。这可以填补实际数据请求之间的“空白”,使其看起来更加即时。

答案 2 :(得分:3)

没有理由要求每个按键都有搜索条件。 Google做到了这一点(1)因为他们可以,(2)因为他们在互联网语料库中展示了术语。

在大多数网络应用程序中,“常见”搜索术语的数量要少得多 - 通常不超过一百个,并且只有十几个适合上下文。

您可以检索整个相关术语集,并在页面加载时在客户端构建前缀映射。通过将当前搜索字词与此前缀地图进行匹配,您可以比Google更快地提供建议。

限制是,在某些时候,您将用尽建议的条款。但同样,这真的不是一个问题:即使是谷歌也没有提出“过渡性”的建议(一个简单的词,但完全搜索有191个结果)。

答案 3 :(得分:3)

您可以做两件事:

  1. 在服务器端使用尽可能多的缓存。毕竟,搜索查询遵循幂律。很少有查询包含许多请求,而很多查询只有很少的请求。一个完美的缓存环境
  2. 您需要最小化传输的数据量,一种方法是使用radix tree。如果您需要传输一个包含所有共享前缀的20个字符串的列表,那么您不需要传输20个单独的字符串。您可以传输一次前缀,然后传输20个不同的部分。

答案 4 :(得分:2)

我建议的第一件事是确保您的Web服务将关键字缓存在内存中而不是每次都访问数据库 - 当然假设您的数据集足够小,可以执行此操作。

除此之外,您必须在多个服务器上以某种方式并行化查询,这可能比您想要的更复杂。

答案 5 :(得分:2)

发现此博客文章,详细讨论了这一点:

Autocomplete Data Structures

答案 6 :(得分:1)

首先,你应该重新说出你的问题。任何回答“我怎么能像谷歌一样快”必然会“习惯于失望。”

鉴于此,您仍然可以更好地解决问题。看起来每个按键,你都可以往返服务和数据库。我怀疑谷歌会这样做。也许你应该专注于减少往返次数(cahcing,当你不得不去DB时再带回来等等)。

答案 7 :(得分:1)

正如上面有人建议使用带有REST API的ETag可能意味着对重复查询进行一些额外的缓存。查看有关Jeo Gregorio博客的this文章,了解有关REST环境中的更多信息etags。