4

这个问题很简单。使Web应用程序的客户端的自动完成功能非常简单。有很多插件。在服务器中实现AutoComplete的最佳方式是什么?

但是,在背后,在服务器端,最好的方法是什么?我不喜欢这个想法,每个用户都有一个按键。

我一直在想狮身人面像,或一些全文搜索引擎从你的网站并行运行。

例如,如果我有一个PHP(高流量)的网站,我可以创建一个并行python脚本,从我的“自动填充文本框”获取http请求。然后,当用户在客户端按下某个键时,AJAX请求会被引导到可以使用特殊策略的那个python脚本。

你的问题是什么?

一些约定:

  • 尽量不要打DB。我的意思是,获得 的请求并做一些事情SELECT * FROM foo WHERE bar LIKE“req%”不是 的一个很好的答案。这可能是一个很好的策略,但我知道该怎么做。*
  • 复制数据可能是一个不错的选择。
+0

您似乎对服务器端可用的语言和技术有一些没有说明的假设。如果你想陈述他们,那么给出一个切实的答复会更容易。 – bmargulies 2010-11-06 21:59:31

+0

这组候选字符串有多大?用什么标准对它们进行排名(即对每个人,每个用户甚至是每个请求标准都是一样的)? – 2010-11-06 22:01:51

+0

@bmargulies我正在努力关注建筑。但是,作为指导。“搜索框架”(例如Lucene,Sphinx,Memcache等)可以是任何可以安装在Linux服务器上的东西。然后,关于语言,如果它是一个广泛采用的框架,它会有库,但可以考虑使用良好的语言:Java,Phython,PHP。 – santiagobasulto 2010-11-06 22:43:55

回答

8

我同意你需要有一些更好的解决方案。 Apache solr有一个“建议”功能,你可以很好地使用。如果你的数据集很小,那么把所有的数据放在内存中,只做一个简单的循环。

在前端,我建议在触发ajax调用之前使用setTimeout()等待大约200ms。如果在200ms内触发另一次击键,则取消上次超时并开始另一次。这是一个非常干净的解决方案,它不会在每次击键时击中数据库。我过去使用过它,它运行得非常好。

这解释了与jquery solr和如何创建一个自动完成很好。 http://www.mattweber.org/2009/05/02/solr-autosuggest-with-termscomponent-and-jquery/

+0

这是我以前用过的一篇文章http://www.sematext.com/products/autocomplete/index.html – 2010-11-06 22:12:29

+0

真的真的(循环1000次)很棒。非常感谢你。我会看看。 – santiagobasulto 2010-11-06 22:28:25

0

您在评论中说“这是关键词的小数据集”。因此,一旦用户开始在字段中输入内容,让客户端请求整个列表可能是合适的,然后让JavaScript响应客户端上用户输入的更改。

这是每个页面每个字段命中一个服务器(并且只有当用户在字段中输入时),并且可以将其缓存在服务器上,因此很少必须击中数据库。

编辑:缓存在服务器上是一个很大的胜利,因为该列表是为每个请求,并为所有用户是相同的,但更重要的,这意味着你可以通过使用Expires或缓存在客户端的浏览器列表Etag标题在响应中具有合适的时间段。因此,用户可以在浏览器缓存的整个时间段内只访问一个(高速缓存的)服务器,从而获得无限制的自动完成功能。

+0

是的,我想过。但这不可扩展。我的意思是,如果将来发生变化,我无法继续在客户端加载所有数据。无论如何,感谢 – santiagobasulto 2010-11-07 12:27:20

+1

@santiago,同时考虑可扩展性可能很重要,对已知的现在进行优化比为未知的未来优化更有意义:)另外我会争辩说它在一定程度上是可扩展的;如果列表变得足够大,开始请求所有匹配第一个字母的关键字,也许后面是前两个字母等等。考虑到每个请求的开销很大,您可能还需要一个可用的大量列表,而不是点击服务器每当用户暂停键入一秒钟。 – 2010-11-07 13:49:35

相关问题