在服务器中实现AutoComplete的最佳方法是什么?

时间:2010-11-06 21:54:04

标签: database performance optimization autocomplete full-text-search

这个问题很容易。在Web应用程序的客户端使自动完成很漂亮很简单。有很多插件。

但是,在服务器端的背面,最好的方法是什么?我不喜欢在用户按下每个按键时按下DB的想法。

我一直在考虑使用sphinx,或者从您的网站并行运行的一些全文搜索引擎。

例如,如果我有一个PHP(高流量)网站,我可以创建一个并行的python脚本,从我的“自动完成文本框”获取http请求。然后,当用户按下客户端的密钥时,AJAX请求将被定向到可以使用特殊策略的python脚本。

你的方法是什么?

一些惯例:

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

2 个答案:

答案 0 :(得分:8)

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

在前端,我建议使用setTimeout()在触发ajax调用之前等待大约200ms。如果在200ms内触发另一次击键,则取消最后一次超时并启动另一次超时。这是一个非常干净的解决方案,每次按键都不会达到db。我过去曾经使用它,效果很好。

这解释了使用jquery的solr以及如何创建自动完成功能。 http://www.mattweber.org/2009/05/02/solr-autosuggest-with-termscomponent-and-jquery/

答案 1 :(得分:0)

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

每页每个字段命中一个服务器(并且只有当用户在字段中键入时),并且您可以将其缓存在服务器上,因此很少需要访问数据库。

编辑:在服务器上缓存是一个很大的胜利,因为每个请求和所有用户的列表都相同,但更好的是,这意味着您可以通过以下方式将列表缓存在客户端的浏览器中在响应中使用具有合适期间的ExpiresEtag标头。因此,用户可以在整个浏览器缓存期间只获得一次(良好缓存的)服务器命中的无限自动完成。