【问题标题】:Best way to pull similar items from a MySQL database从 MySQL 数据库中提取类似项目的最佳方法
【发布时间】:2011-09-04 15:20:54
【问题描述】:

我有一个项目数据库(与此相关的文章)。
我想做的是,我想基于两件事提取与特定项目相似的 X 个项目 - 标题,即文章的标题,以及位于另一个表中的标签。

结构如下(仅相关字段):

表格:文章
字段:articleid、title

表格:标签
字段:tagid、tagtext

表格:文章标签
字段:tagid、articleid

最好的方法是什么?

【问题讨论】:

  • 您将不得不对您认为“相似”的内容给出更具体的解释
  • @Derek Kromm Similar - 具有相似标题的项目(我在想 MATCH AGAINST,然后按分数排序)和匹配标签(显然不是必需的)。

标签: mysql similarity


【解决方案1】:

对于 myisam 表,您可以使用自然语言全文搜索: http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

SELECT * FROM article a
LEFT JOIN articletag at ON (at.articleid = a.articleid)
LEFT JOIN tag t ON (at.tagid = t.tagid)
WHERE MATCH (a.title) AGAINST ('some title' IN NATURAL LANGUAGE MODE)
OR MATCH (t.tagtext) AGAINST ('some tag' IN NATURAL LANGUAGE MODE)
GROUP BY a.articleid # if you don't want get duplicates 

您还可以考虑将有关标签的冗余信息添加到文章表中的一个字段(例如<taga><tagb><tagz>)中,并在每次添加/删除标签时更新它。这将简化查询并且应该更快:

SELECT * FROM article a
WHERE MATCH (a.title, a.tagtext) AGAINST ('some title or tag' IN NATURAL LANGUAGE MODE)

【讨论】:

  • 我正在寻找类似的物品。
  • 要使用FULLTEXT 并保持基于标签,您需要从原始标签列表中构造AGAINST 字符串。
猜你喜欢
  • 2016-05-20
  • 2011-10-19
  • 2013-10-30
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多