2

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

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

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

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

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

4

2 回答 2

4

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

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

于 2009-06-22T03:16:08.153 回答
1

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

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

希望有帮助,

乔什

于 2009-06-21T23:36:37.987 回答