什么是实现AJAX自动完成的Web服务的最佳方式

问题描述:

我正在实施一个“谷歌建议”像自动完成功能的标签搜索使用jQuery的自动完成。什么是实现AJAX自动完成的Web服务的最佳方式

我需要为jQuery提供一个Web服务,并根据用户键入的内容给出一个建议列表。我看到2种实现Web服务的方式:

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

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

任何关于上述问题的帮助或任何关于不同方法的建议都会非常感谢。

+0

你认为你会有多少个标签? – Josh 2009-06-21 23:34:28

不要担心延迟之前,你措施的事情 - 做了一堆伪标签,在DB他们坚持,并测量延迟对于典型的查询。根据您的数据库设置,您的延迟时间可能会很好,并且您可以避免浪费后顾之忧。

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

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

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

希望帮助,

乔希