我遇到了一个与Google Suggest非常相似的网站。当您在搜索框中键入2个字符时(例如,如果您正在搜索“canon”产品,则为“ca”),它会产生4个Ajax请求。每个请求似乎都在不到125毫秒内完成。我随便观察到Google Suggest需要500毫秒或更长时间。
在任何一种情况下,两个站点都很快。 为了获得超快的请求/响应,应遵循哪些一般概念/策略? 谢谢。
编辑1:顺便说一下,我计划为电子商务网站搜索实现自动完成功能,其中1.)根据输入的内容提供搜索建议,以及2.)根据已经存在的内容匹配潜在产品的列表打字到目前为止。我正在尝试类似于SLI Systems搜索的东西(参见 http://www.bedbathstore.com/ 例如)。
这是一个“多长时间是一个字符串”的问题,因此我将其作为社区维基的答案 - 每个人都可以自由地加入它。
我要说的是确保:
- 您正在查询的服务器/服务器场/云的大小根据您投入的负载正确调整和/或可以根据该负载调整自身大小
- 服务器/服务器场/云连接到良好的快速网络主干
- 您正在查询服务器端(数据库表或您有什么)的数据结构被调整为尽快响应这些精确请求
- 你没有做出不必要的请求(HTTP请求的设置成本很高;你想避免在一个人做的时候解雇其中的四个);您可能还想进行一些滞后管理(在人们输入时延迟请求,仅在停止后发送几秒钟,如果再次启动则重置超时)
- 您可以通过线路发送尽可能少的信息,因为可以合理地用于完成工作
- 您的服务器配置为重用连接(HTTP 1.1)而不是重新建立它们(在大多数情况下这将是默认设置)
- 你正在使用正确的服务器;如果一个服务器有大量的保持活动请求,它需要被设计为优雅地处理它(NodeJS是为此而设计的;作为一个例子; Apache不是,特别是,虽然它当然是 非常 服务器)
- 您可以缓存常见查询的结果,以避免不必要地转到底层数据存储
这是一个“多长时间是一个字符串”的问题,因此我将其作为社区维基的答案 - 每个人都可以自由地加入它。
我要说的是确保:
- 您正在查询的服务器/服务器场/云的大小根据您投入的负载正确调整和/或可以根据该负载调整自身大小
- 服务器/服务器场/云连接到良好的快速网络主干
- 您正在查询服务器端(数据库表或您有什么)的数据结构被调整为尽快响应这些精确请求
- 你没有做出不必要的请求(HTTP请求的设置成本很高;你想避免在一个人做的时候解雇其中的四个);您可能还想进行一些滞后管理(在人们输入时延迟请求,仅在停止后发送几秒钟,如果再次启动则重置超时)
- 您可以通过线路发送尽可能少的信息,因为可以合理地用于完成工作
- 您的服务器配置为重用连接(HTTP 1.1)而不是重新建立它们(在大多数情况下这将是默认设置)
- 你正在使用正确的服务器;如果一个服务器有大量的保持活动请求,它需要被设计为优雅地处理它(NodeJS是为此而设计的;作为一个例子; Apache不是,特别是,虽然它当然是 非常 服务器)
- 您可以缓存常见查询的结果,以避免不必要地转到底层数据存储
您将需要一个能够快速响应的Web服务器,但这通常不是问题。您还需要一个快速的数据库服务器,并且可以非常快速地查询哪些热门搜索结果以“ca”开头。 Google根本没有使用传统数据库,而是使用大型服务器集群,a 卡桑德拉类似数据库,大部分数据都保存在内存中,以便更快地访问。
我不确定你是否需要这个,因为只使用运行PHP和MySQL的单个服务器就可以获得相当不错的结果,但你必须对存储和检索信息的方式做出一些很好的选择。如果您运行这样的查询,您将无法获得这些快速结果:
select
q.search
from
previousqueries q
where
q.search LIKE 'ca%'
group by
q.search
order by
count(*) DESC
limit 1
只要少于20人使用您的搜索,这可能会有效,但在您达到100.000之前可能会失败。
您可以从为您的产品做快速搜索引擎开始。查看Lucene的全文搜索。它可用于PHP,Java和.NET等。
这个链接解释了他们是如何做的 即时预览快速。整个网站highscalability.com是一个信息丰富的网站。
此外,您应该将所有内容存储在内存中,并且应该避免从光盘中检索数据(慢!)。例如Redis闪电般快!