2

AJAX 自动完成实现起来相当简单。但是,我想知道如何在 SO 上处理这样的智能标签建议。

澄清自动完成建议之间的区别:

  • 自动完成: foo [foobar, foobaz]
  • 建议: foo [barfoo, foobar, foobaz],甚至更好,带有'did you mean' 功能:[barfoo, foobar, foobaz, fobar, fobaz]

我想我需要在标签中进行一些全文搜索(所有字母都被索引,而不仅仅是单词)。对于有限数量的标签(甚至是客户端),使用正则表达式或其他模式进行操作是没有问题的。

但是如何为大量标签实现此功能?
是否有任何特殊原因(除了 URL)SO 上的标签是用破折号分隔的?标签中的 Unicode 字符呢?

我将标签存储在具有以下列的表中:id、标签名。我的 SQL 查询返回具有以下字段的对象:id、标记名、计数

(我使用 Doctrine ORM 和 pgsql 作为默认的数据库驱动程序。)

4

1 回答 1

3

我会在每次按键时通过 REGEXP 从数据库中选择它们。我在我的网站上这样做了,并且没有预先出现问题(我没有考虑过重载服务器)。如果您不喜欢这个想法,我会兑现所有 1-5 个字母组合,用户将每天在单独的表格中输入和刷新它们。如果此表被索引,那么您的实现速度非常快。

要详细说明第二个方法:

简而言之: 1. 制作一个表格 SEARCHTABLE,表示关键字(限制为 3-4 个字母)和标签的主 ID 之间的 1-n 关系。2. 两个字段的索引。3. 每次用户进行搜索时,请查看 SEARCHTABLE,如果存在组合,请使用它 - 非常快,因为所有内容都已编入索引。如果没有,则进行正则表达式搜索并将所有结果放入 SEARCHTABLE。

笔记:

  1. 如果添加标签,您应该使表格无效,但这应该比搜索少得多。当使表无效时,您不必截断它,您可以轻松地重建它,同时考虑所有关键字。
  2. 如果你想加快速度,你可以“预生成”所有两个甚至三个字母的搜索。
  3. 如果您足够关心,您应该使用来自 n-1 个字母关键字的信息来生成 n 个字母关键字。它极大地加快了速度。想象一下,用户输入了“mo”,而您已经从 SEARCHTABLE 中向他们展示了适当的结果。当她键入“n”给它“mon”时,您只需要搜索已选择的项目即可生成新的响应。

希望现在更全面。

于 2010-04-17T22:05:33.290 回答