使用 MySQL 和约束搜索匹配的标签(相似性搜索)



这是我的第一个线程。如果这是重复的,我深表歉意,但后来我无法搜索正确的关键字。

我的问题: 网站上有标记的项目。在项目的详细视图上,例如 http://localhost/items/a.html 我想根据其标签显示类似/相关项目的列表。

  • 物品 A 标签

    • 劳动
    • 化学
    • Analytik
    • 梅尔维格
  • 物品 B 标签

    • 劳动
    • 化学
    • 定量
    • 拉克托斯
  • 商品C标签

    • 定量
    • 阿布谢登
    • 弗拉申普凡德

表格的结构:(如此处(

表:文章 字段:文章 ID、标题

表:标签 字段:标记、标记文本

表:文章标签 字段:标记、文章标识

当我现在访问项目 B 的以下入口点 (http://localhost/items/b.html( 时,我想向用户打印一个列表,按以下顺序显示相关项目:

  • 项目 A(因为有两个相同的标记(
  • 项目 C(因为同一个标签(

当我在谷歌中搜索时,我发现了这样的东西: 如何使用MySQL比较两个逗号分隔的字符串列表

它看起来就像我的问题一样,但我没有看到任何提示如何为我的查询解决这个问题。我找到的大多数其他帖子只会排除项目 a 和 c,因为它们不匹配所有标签(项目 a 与标签 qantitativ 和 Laktose 不匹配(

您需要哪些进一步的信息? 顺便说一句:我不会将所有标签作为额外属性添加到项目表中,因为能够在此列上执行匹配。我只是不想在标签更改时总是更新此标签。这只是将数据库中保存的数据大小增加了一倍。

SELECT  c.articleid, COUNT(*) AS ct
FROM articletag AS b
JOIN articletag AS c  ON c.tagid = b.tagid
AND c.articleid != b.articleid
WHERE b.articleid = 123
GROUP BY c.articleid
ORDER BY ct DESC;

在搜索与 123(示例中的项目 B("相似"的内容时, 输出应

Item-A, 2
Item-C, 1

这是articletag的完整扫描。 因此,请注意我讨论的提示 多:多映射.

如果在执行查询后需要获取有关项目的信息,请将其用作"派生"表;例如:

SELECT articles.*
FROM ( the above SELECT ) AS x
JOIN articles USING(articleid)
ORDER BY x.ct DESC;

(您可以从内部查询中删除ORDER BY,因为它将被优先忽略,而不是外部ORDER BY

最新更新