【问题标题】:How to find the records with most common tags, like the related questions in StackOverflow如何查找带有最常见标签的记录,例如 StackOverflow 中的相关问题
【发布时间】:2010-09-19 19:08:17
【问题描述】:

我们可能会在 StackOverflow 网站上用多个标签标记一个问题,我想知道如何用常见标签找出最相关的问题。

假设我们在一个数据库中有 100 个问题,每个问题都有几个标签。假设用户正在浏览一个特定的问题,我们想让系统在页面上显示相关的问题。相关问题的标准是它们具有最常见的标签。

例如: 问题 1 标记为 AAA、BBB、CCC、DDD、EEE。

问题 2 与前 1 个相关,因为它也包含所有这 5 个标签。 问题 3 与前 2 个相关,因为它只有 Questio1 具有的 4 或 3 个标签。 ......

所以我的问题是如何设计数据库并快速找出与问题 1 相关的问题。非常感谢。

【问题讨论】:

    标签: sql database algorithm tags


    【解决方案1】:

    可能是这样的:

    select qt.question_id, count(*)
    from   question_tags qt
    where  qt.tag in
    ( select qt2.tag
      from   question_tags qt2
      where  qt2.question_id = 123
    )
    group by qt.question_id
    order by 2 desc
    

    【讨论】:

      【解决方案2】:

      如果您可以保证一个问题没有重复的标签,那么您可以执行以下操作:

      SELECT
           QT2.question_id,
           COUNT(*) AS cnt
      FROM
           Question_Tags QT1
      INNER JOIN Question_Tags QT2 ON QT2.tag = QT1.tag AND QT2.question_id <> QT1.question_id
      WHERE
           QT1.question_id = @question_id
      GROUP BY
           QT2.question_id
      ORDER BY
           cnt DESC
      

      如果您不能保证问题中标签的唯一性,那么 Tony Andrews 的解决方案将起作用。他在任何情况下都会起作用,但是如果您可以通过约束保证唯一性,则应该将您的系统上的性能与此方法进行比较。

      【讨论】:

        【解决方案3】:

        不完全确定您的意思,但the Tags page 按受欢迎程度(如标记数量)列出标签。

        编辑:这是关于 SO 还是关于您自己的应用程序?如果是关于您自己的应用程序,请删除 SO 标签,因为它有点误导。

        Edit2:我想说的是:

        SELECT * FROM `questions` WHERE `tag` LIKE '%tagname%' OR (looped for each tag) LIMIT 5,0
        

        其中 5 是您想要返回的最大结果(至少进行一些优化)。可能不是最好的解决方案,但我可以看到它有效。

        您可能还想尝试使用标题匹配LIKE

        【讨论】:

          猜你喜欢
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 2013-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多