Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何创建autosuggest,以与google搜索或live搜索一样快的速度获取关键字_Asp.net_Javascript_Autocomplete - Fatal编程技术网

Asp.net 如何创建autosuggest,以与google搜索或live搜索一样快的速度获取关键字

Asp.net 如何创建autosuggest,以与google搜索或live搜索一样快的速度获取关键字,asp.net,javascript,autocomplete,Asp.net,Javascript,Autocomplete,我正在我的网站搜索框中创建自动建议功能,每当用户按下一个新键,javascript就会调用服务器端的webservice,从数据库中获取10个最相关的关键字,并再次提供给javascript,javascript就会填充搜索自动建议列表。 我的功能不是太慢,但与live.com或google.com的速度相比,我测试了它们,我真的觉得它们是从我的电脑而不是服务器上获取关键字。 他们是如何以如此快的速度获取关键字的,而且他们的关键字是我的百万倍? 这样做有一种著名的风格吗? 同样使用我的fireb

我正在我的网站搜索框中创建自动建议功能,每当用户按下一个新键,javascript就会调用服务器端的webservice,从数据库中获取10个最相关的关键字,并再次提供给javascript,javascript就会填充搜索自动建议列表。

我的功能不是太慢,但与live.com或google.com的速度相比,我测试了它们,我真的觉得它们是从我的电脑而不是服务器上获取关键字。

他们是如何以如此快的速度获取关键字的,而且他们的关键字是我的百万倍?
这样做有一种著名的风格吗?

同样使用我的firebug,我发现他们没有调用webservice“可能是以我不知道的方式调用”,但是我在Net选项卡中发现一个新的get正在发生。

我建议的第一件事是确保您的web服务将它们的关键字缓存在内存中,而不是每次都命中DB—当然,假设您的数据集足够小,可以这样做


除此之外,您还必须以某种方式跨多台服务器并行查询,这可能比您想要的要复杂得多。

首先,您可能需要重新表述您的问题。“我怎么能像谷歌一样快”的任何答案都注定是“习惯失望”


有鉴于此,您仍然可以改进您的解决方案。似乎每按一次键,您都要往返于一个服务和一个数据库。我怀疑谷歌会这么做。也许你应该专注于减少往返行程(聊天,当你必须去DB时带更多回来,等等)。

不确定你在找什么,但肯定在live.com上,我收到了每封信的请求:

正如您所看到的,很少有人会回来——500B——这正是您的目标——一个精简的web服务,它能将您需要的最低显示量返回给用户

除此之外,正如其他人所说,缓存以前的响应,等等


并不是说结果通常不是按字母顺序排列的,所以如果你不显示你的排序标准,你可以按照“现在做某事比以后完全准确要好”的原则工作。而不是每次按键都发出请求,如果您只是每隔一定的时间发出一个请求,如果在此期间有一个按键,会怎么样?如果您每隔100毫秒执行一次操作,它看起来仍然是“即时的”,但可能会大大减少服务器上的负载。另外,您是否让客户端缓存关键字?如果用户在搜索字段中退格,则不必重新联系服务器以获取关键字。此外,您可以在每个按键上立即过滤当前的关键字列表,而无需联系服务器(您只会得到少于10个关键字,因为您已经拥有的部分/所有关键字列表将不包含刚刚键入的字母)。这可以填补实际数据请求之间的“空白”,使数据看起来更即时。

没有理由每次按键都请求搜索词。谷歌这样做(1)是因为他们能做到,(2)是因为他们在互联网上展示术语

在大多数web应用程序中,“常用”搜索词的数量要少得多——通常不超过一百个左右,而与上下文相关的搜索词则只有十几个

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


限制是,在某一点上,您将用完建议的术语。但是,这也不是问题:即使是谷歌也没有关于“超规范”(一个虚构的词,但完整搜索有191个结果)的建议。

正如上面有人建议的那样,使用ETags和RESTAPI可能意味着为重复查询提供一些额外的缓存。查看Jeo Gregorio博客上的文章,了解有关REST上下文的更多信息。

您可以做两件主要的事情:

  • 在服务器端使用尽可能多的缓存。毕竟,搜索查询遵循幂律。有几个查询有很多请求,而很多查询每个查询只有很少的请求。完美的缓存环境
  • 您需要尽量减少通过网络传输的数据量,其中一种方法是使用。如果您需要传输一个包含20个共享公共前缀的字符串的列表,则不需要传输20个单独的字符串。您可以发送前缀一次,然后发送20个不同的部分

  • 找到此博客文章,其中详细介绍了这一点:


    1)他们有更多的带宽。2) 他们有更多的服务器(3)。在搜索和获取整页结果时,你会在不到一秒的时间内得到这些结果,因此js列表中的10个结果很可能会更快。你能更详细地解释一下“每隔一定时间提出请求”的想法吗?这是一个聪明的想法,但我觉得我不能完全理解它。这个想法是将请求限制在最多每100毫秒一次。在伪代码中,不是“on_keypress:makerequest”,而是这样做:“on_keypress:if timer正在运行,return.else将timer设置为从现在起100ms发出请求”。计时器发出的请求应该使用用户当时键入的内容,而不是用户在计时器启动时键入的内容(不确定如何在JS中执行此操作,因为这可能是一个线程操作)。