AJAX 自动完成的实现相当简单。但是,我想知道如何处理这样的智能标签建议。
澄清自动完成和建议之间的区别:
- 自动完成:foo [foobar, foobaz]
- 建议:foo [barfoo, foobar, foobaz],或者更好,带有“你是说吗”功能:[barfoo, foobar, foobaz, fobar, fobaz]
我想我需要在标签中进行一些全文搜索(所有字母都被索引,而不仅仅是单词)。对于有限数量的标签(甚至是客户端),使用正则表达式或其他模式来做到这一点是没有问题的。
但是如何针对大量标签实现此功能?
SO 上的标签是用破折号分隔的,是否有任何特殊原因(除了 URL 之外)?标签中的 Unicode 字符怎么样?
我将标签存储在具有以下列的表中:id、标签名。 我的 SQL 查询返回具有以下字段的对象:id、tagname、count
(我使用 Doctrine ORM 和 pgsql 作为默认数据库驱动程序。)
最佳答案
我会在每次按键时通过 REGEXP 从数据库中选择它们。我在我的网站上执行了此操作,并且没有预执行问题(我没有认为服务器负载很重)。如果您不喜欢这个想法,我会兑现用户输入的所有 1-5 个字母组合,并每天在单独的表中刷新它们。如果该表已建立索引,那么您的实现速度会非常快。
详细说明第二种方法:
简单地说: 1. 制作一个表 SEARCHTABLE 表示关键字(限制为 3-4 个字母)和标签主 ID 之间的 1-n 关系。 2. 两个字段上的索引。 3. 每次用户进行搜索时,请查看搜索表,如果存在组合,则使用它 - 速度非常快,因为所有内容都已建立索引。如果没有,则进行正则表达式搜索并将所有结果放入 SEARCHTABLE。
注释:
- 如果出现以下情况,您应该使表格无效: 您添加标签,但这应该很多 比搜索频率低。什么时候 使您不做的表无效 必要时截断它,你可以 轻松重建它 考虑到关键词。
- 如果你想加快速度,你可以“预生成”所有两个甚至三个 字母搜索。
- 如果您足够关心,您应该使用 n-1 个字母关键词中的信息来生成 n 个字母的关键字。它极大地加快了速度。假设用户输入了“mo” 并且您已经向他们展示了 SEARHTABLE 的适当结果。比她输入“n”时 给它“mon”,您只需要搜索已经选定的项目即可生成新的 回复。
希望现在更加全面。
关于sql - 标签建议(不是标签自动完成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656172/