【问题标题】:What's the best way to implement web service for ajax autocomplete为 ajax 自动完成实现 Web 服务的最佳方法是什么
【发布时间】:2010-11-04 17:33:20
【问题描述】:

我正在使用 jQuery 的自动完成功能实现类似自动完成功能的“Google Suggest”标签搜索。

我需要为 jQuery 提供一个 Web 服务,根据用户输入的内容给它一个建议列表。我看到了两种实现 Web 服务的方法:

1) 只需将所有标签存储在数据库中,然后使用用户输入作为前缀搜索数据库。这很简单,但我担心延迟。

2) 使用进程内尝试存储所有标签并搜索匹配结果。由于一切都在进行中,我希望这会有更低的延迟。但是有几个困难: - 在进程启动时初始化 trie 的好方法是什么?假设我将标签数据存储在数据库中并在我第一次启动该过程时检索它们并将它们变成一个 trie。但我不确定如何。我正在使用 Python/Django。 -当用户创建新标签时,我需要将新标签插入到 trie 中。但是假设我有 5 个 Django 进程,因此有 5 次尝试,我如何告诉其他 4 次尝试他们也需要插入一个新标签? -如何确保 trie 是线程安全的,因为我的 Django 进程将被线程化(我正在使用 mod_wsgi)。或者我不必因为 Python 的 GIL 而担心线程安全? - 有什么方法可以将标签的使用频率存储在 trie 中?我如何判断标签的字符串何时结束以及频率何时开始 - 例如。如果我将 apple213 存储到 trie 中,它是频率为 213 的“apple”还是频率为 13 的“apple2”??

对于上述问题的任何帮助或对不同方法的任何建议将不胜感激。

【问题讨论】:

  • 您认为您将拥有多少个标签?
  • 您是在谈论一个使用 SOAP 之类的 Web 服务吗?如果是这样,我会避免为此使用 Web 服务,因为它会增加额外的复杂性并导致更多延迟。对于自动完成,我会向服务器发送 AJAX 请求,并在可能的情况下查询数据库以获取建议或从缓存的数据库结果中查询。
  • 所有标签都是用户创建的,所以很难说会有多少。这真的取决于我的网站会变得多受欢迎

标签: python ajax autocomplete trie


【解决方案1】:

在您测量事物之前不要担心延迟——组成一堆伪标签,将它们粘贴到数据库中,然后测量典型查询的延迟。根据您的数据库设置,您的延迟可能会很好,您不必担心浪费时间。

确实总是担心线程问题 - GIL 不会消除竞争条件(控制可能会在任何伪代码指令边界处的线程之间切换,以及在底层扩展中的 C 代码时切换或内置正在执行)。您需要首先检查您正在使用的 DB API 模块的threadsafety 属性(请参阅PEP 249),然后适当地使用锁定生成一个小的专用线程池来执行 DB 交互(在 Queue.Queue 上接收请求并在另一个上返回结果,这是 Python 中健全且简单的线程的正常架构)。

【讨论】:

    【解决方案2】:

    我会使用第一个选项。 'KISS' - (保持简单愚蠢)。

    对于少量数据,不应有太多延迟。我们对名称搜索运行相同类型的操作,结果很快就会出现在几千行中。

    希望对你有帮助,

    乔什

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2012-03-05
      • 2017-06-26
      相关资源
      最近更新 更多