为ajax自动完成实现Web服务的最佳方法是什么?

时间:2009-06-21 23:31:11

标签: python ajax autocomplete trie

我正在实施一个“Google Suggest”,例如使用jQuery自动完成功能进行标记搜索的自动完成功能。

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

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

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

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

2 个答案:

答案 0 :(得分:4)

衡量之前不要担心延迟 - 组成一堆伪标签,将它们粘贴在数据库中,并测量典型查询的延迟。根据您的数据库设置,您的延迟可能会很好,您可以免去浪费的担忧。

总是担心线程,但GIL不会使竞争条件消失(控制可能在任何伪代码指令边界的线程之间切换,以及在底层扩展中的C代码时或内置正在执行)。您首先需要检查您正在使用的数据库API模块的threadsafety属性(请参阅PEP 249),然后使用适当的锁定生成一小段专用线程执行数据库交互(在Queue.Queue上接收请求并在另一个上返回结果,这是Python中声音和简单线程的常规体系结构)。

答案 1 :(得分:1)

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

对于少量数据,不应有太多延迟。我们为名称搜索运行相同类型的事情,结果在几千行上显得非常快。

希望有所帮助,

约什