我的系统类似于stackoverflow。基本上,帖子可以有多个标签,并且有一个搜索功能可以查找具有匹配查询标签的帖子(所有标签必须匹配)
我想知道是否有任何算法/数据结构可以有效地解决标记/搜索的问题?哪一个在速度方面最有效(时间复杂度)?
答案 0 :(得分:2)
过去我没有使用任何专门的DS。事实上,如果您想使用RDBMS执行此操作,请仔细阅读how Wordpress do this using taxanomies的详细信息。大多数情况下,你会有一个单独的标签表,然后个别帖子可以链接多个标签(使用键)。
另一种流行的方法是将您的问题视为一个分面问题。您必须使用全文索引框架并在此基础上开发您的分面浏览。 Here is an excellent post from the creator of Lucene/Solr解释了这种情况。通过分层浏览,您将能够显示stackoverflow的功能:
algorithm × 21165
search × 8863
data-structures × 5867
tags × 2886
stackoverflow × 721
答案 1 :(得分:0)
存储此类数据进行搜索的最省时的方法通常是Inverted index。这也恰好是最常见的搜索引擎/信息检索系统的基础。
为了实际实现这一点,我建议您查看Apache Lucene。
答案 2 :(得分:0)
对于这个问题,答案是肯定的。 我正在开发一个学生内联网作为我的作业项目,实现的算法取决于数据库设计。我确实为标签创建了 3 个单独的表,为类似于帖子的公告创建了 1 个表。 并有一个关于它的数据库设计的问题:How appropriate is one column table
就我而言,有一个大约 140 行代码的算法。
tag (tagID*, tagName)
tagMap (tagSetID*, tagID*)
tagSet (tagSetID*)
announce (announceID*, tagSetID, title, content)
如上所述,我自己开发了多个标签匹配算法。以防万一我的算法不够高效,现在我不小心知道了@joel 和@abhinav 提到的倒排索引。