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

这个问题很容易。在Web应用程序的客户端使自动完成很漂亮很简单。有很多插件。 但是,在服务器端的背面,最好的方法是什么?我不喜欢用用户按下每个按键来击中数据库的想法。 我一直在考虑sphinx,或者从你的网站并行运行的一些全文搜索引擎。 例如,如果我有一个PHP(高流量)网站,我可以创建一个并行python脚本,从我的“自动完成文本框”获取http请求。然后,当用户按下客户端的密钥时,AJAX请求将被定向到可以使用特殊策略的python脚本。 什么是你的方法? 一些惯例: 尽量不要打DB。我的意思是,得到 请求并做一些SELECT * FROM foo WHERE bar LIKE“req%”不是 一个很好的答案。这可能是件好事 策略,但我知道该怎么做。* 复制数据可能是一个不错的选择。     
已邀请:
我同意你需要一些更好的解决方案。 Apache solr有一个“建议”功能,你可以使用得很好。如果您的数据集很小,那么将所有数据放入内存中,然后进行简单的循环。 在前端,我建议使用setTimeout()在触发ajax调用之前等待大约200ms。如果在200ms内触发另一次击键,则取消最后一次超时并启动另一次超时。这是一个非常干净的解决方案,每次按键都不会达到db。我过去曾经使用它,效果很好。 这解释了使用jquery的solr以及如何非常好地创建自动完成。 http://www.mattweber.org/2009/05/02/solr-autosuggest-with-termscomponent-and-jquery/     
你在评论中说关键词的“这是一个小数据集”。因此,一旦用户开始键入字段,客户端就请求整个列表,然后让JavaScript响应客户端用户输入的更改,这可能是合适的。 这是每页每个字段命中一次服务器(并且仅当用户在字段中键入时),并且您可以将其缓存在服务器上,因此很少需要访问数据库。 编辑:服务器上的缓存是一个很大的胜利,因为列表对于每个请求和所有用户都是相同的,但更好的是,这意味着您可以使用具有合适期间的
Expires
Etag
标头将列表缓存在客户端的浏览器中在回应中。因此,用户可以在整个浏览器缓存期间获得一次(良好缓存的)服务器命中的无限自动完成。     

要回复问题请先登录注册