【问题标题】:What's the best way to implement AutoComplete in the server?在服务器中实现 AutoComplete 的最佳方法是什么?
【发布时间】:2011-05-06 03:32:54
【问题描述】:

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

但是,在后台,在服务器端,最好的方法是什么?我不喜欢在用户按下每个键时都点击数据库的想法。

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

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

你的方法是什么?

一些约定:

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

【问题讨论】:

  • 您似乎对服务器端可用的语言和技术有一些未说明的假设。如果你能说出它们,给出一个有说服力的答复会更容易。
  • 候选字符串集有多大?使用什么标准对它们进行排名(即每个人、每个用户甚至每个请求的标准都相同)?
  • @bmargulies 我正在尝试专注于架构。但是,作为指导。 “搜索框架”(例如 Lucene、Sphinx、Memcache 等)可以是任何可以安装在 Linux 服务器上的东西。然后,关于语言,如果它是一个广泛采用的框架,它会有库,但可以考虑好的语言:Java、Phython、PHP。
  • @Ian Mackinnon 好问题。它是一个小型数据集(例如网站的所有关键字)并且相对静态。不了解“排名标准”​​的东西。
  • @santiago,我所说的排名是指您如何将建议列表排序给用户。例如。 “按字母顺序”对所有用户都是相同的,“此用户最近搜索过”将是每个用户、每个请求排名的示例。

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


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 是的,我已经考虑过了。但这不是可扩展的。我的意思是,如果将来发生变化,我将无法继续在客户端中加载所有数据。还是谢谢
  • @santiago,虽然考虑到可扩展性可能很重要,但针对已知的现在进行优化比针对未知的未来进行优化更有意义 :) 我还认为它在一定程度上是可扩展的;如果列表变得足够大,则开始请求与第一个字母匹配的所有关键字,之后可能是前两个字母,等等。鉴于每个请求的开销相当大,您不妨请求一个相当大的可能性列表,而不是点击每次用户暂停输入一秒钟时服务器。
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多