2010-02-10 56 views
9

如何构建SO这样的标签系统?如何构建像SO这样的标记系统?

我在我的asp.net mvc网站上使用一个独特的文本框来提交“标签”。

首先,我试图用逗号“asp.net,c#,sql server”拆分标签。 它的工作原理,但如果用户忘记用逗号分隔标签,我有一个问题来分割该字符串。

“asp.net c#sql server”:sql server应该是单个标签,而不是两个“sql”+“server”。

而且我“不能”(他不应该照顾这个...),要求用户使用“ - ”字符来单独标记的话:“SQL服务器”

有人帮忙吗?

+1

但是,那么我将如何标记与SQL和服务器的东西? (不要说“服务器的SQL”;)) – Aistina 2010-02-10 23:43:01

+0

你应该标记“sql,server”逗号分隔... – 2010-02-10 23:45:39

+0

那么,你不能* *逗号分隔*和*空格分隔。你将不得不选择一个或另一个。两者都有其优点和缺点。正如@bebop所指出的,只要您提供自动完成功能,我认为它不重要。 – Aistina 2010-02-10 23:48:31

回答

5

或者您匹配现有标记的字符串,那么您可以使用空格标记(假设您先搜索较大的标记,以便在搜索“sql”之前找到'sql server')。因为只有允许使用现有的标签,并且具有用于创建新标签的单独机制,这样用户可以很容易地用空格创建标签,因为在新标签框中输入的任何东西都将是单个标签,如'sql server 2005'。

编辑:

或者你可以在标签一些特殊的语法创建新的:

'SQL,asp.net,[NEWTAG]的SQL Server,C#' 将使用现有的标记 'SQL', 'asp.net', 'C#',并会创建一个新的标签 '的SQL Server'

/EDIT

或拆分的空间,并且不允许有空格标签

在你的榜样

你怎么说“SQL服务器”(1个标签)和“SQL”“服务器”之间的差值( 2个标签)?

如果你看起来这些标签都是空格分隔的,所以一个标签是sql-server。

只要你有标签建议他们,因为他们正在进入他们,我不认为这将是一个问题

+0

在我的第一个例子中,我用逗号分隔标签,所以我可以说出这种差异。 – 2010-02-10 23:43:15

+0

但你自己说过,这不是一个好的解决方案。否则你怎么能告诉如果用户提交'asp.net c#sql服务器',这不是一个标签? – 2010-02-10 23:45:01

+0

是的,这是我的问题... – 2010-02-10 23:46:27

6

StackOverflow上恰好有与用户输入不正确的标签,例如,如果你有同样的问题输入'字符串操作'而不是'字符串操作'。您刚刚将标记分隔符从空格更改为逗号。

的根本问题仍然是相同的,所以这是毫不奇怪的是,解决方案也相同:

  1. 通过网站上的便利帮助教育用户。
  2. 主持人有用地修复其他用户的错误,清理网站。
  3. 主持人还会在用户犯错时对他们进行教育,以便他们在将来不会犯同样的错误。

StackOverflow证明此模型可以很好地工作。由于您自己指出的含糊不清,用于纠正用户错误的自动化解决方案有时会自行产生错误。这会让那些正在做正确的人感到沮丧,只会被软件“修复”他们的标签。

2

你可能会尝试一种统计方法spelling correction种方法:如果有一堆已经标记为“sql server”的东西,它可能会作出有根据的猜测。当然,它有时会弄错。

9

我可以想到的一种(简单)方法可以让用户在标签中包含任何字符。该解决方案允许用户一次只输入一个一个标签。您可以在用户输入标签(现有标签的自动填充是确定的加号)的情况下输入文本框,输入完成后按下输入按钮或输入按钮,输入的标签将显示在文本框下方的应用标签列表中。这些应用标签必须为每个标签设置一个按钮,以便用户删除标签。

Wordpress在创建帖子时有一个类似的标记机制,但它们允许通过简单说明用什么字符定界标签来同时输入多个标签。询问分隔符并不是什么大问题,但如果您不想强制使用特定的分隔符,则只需限制用户每次输入一个标签即可。

image of wordpress's tag box

另一个想法(编辑)

我刚刚看了今天这个:Tokenizing Control

0

我的建议是:

首先,前面,选择的时候了:你想要允许在名称中包含空格的标签?选择一个或另一个,不要试图用启发式预测来创建一些疯狂的混搭,以预测用户是否意味着一件事或另一件事。

无论是这样的:

sql server 

总是意味着1个标签,或总是意味着2.现在你要什么只要选择。非此即彼。如果您选择不允许在标签空间(这意味着它的2个标签),但你也希望让用户用逗号分隔标签,例如:

sql,server 

然后,你可以处理用户输入一串混合标签,如:

sql server,regular expressions,java c# 

有了这样的代码:

string[] tags = Regex.Split(input, @"(,|\s)+"); 

这将让你:

tags[0]: sql 
tags[1]: server 
tags[2]: regular 
tags[3]: expressions 
tags[4]: java 
tags[5]: c#