我的第一个镜头是这样的:
SELECT
P.product_id,
COUNT(*)
FROM
Product_Keywords PK1
INNER JOIN Product_Keywords PK2 ON
PK2.keyword_id = PK1.keyword_id
INNER JOIN Products P ON
P.product_id = PK.product_id
WHERE
PK1.product_id = @product_id
GROUP BY
P.product_id
ORDER BY
COUNT(*) DESC
Product_Keywords 到 Product_Keywords(PK2 到 PK1)的连接可能很粗糙,所以我无法谈论性能。这是我要开始的地方,然后看看优化。
作为 Assaf 评论的后续行动,需要考虑的一件事是,您可以为 Product_Keywords 和 SUM(PK1.weight) + SUM(PK2.weight) 添加“权重”以进行排名。只是一个想法。
编辑:详细说明权重...您可能决定要允许对关键字进行加权。不过,用于确定权重的实际方法将是一个商业决策,所以我真的不能在那里给你太多的指导。
作为一个例子,这个问题是关于“编程”、“关键字匹配”和“SQL”的。编程是相当通用的,所以如果两个问题有共同点,它仍然可能并不意味着它们是相关的,所以也许你只把它加权为 1。SQL 更具体一点,所以你可以加权为 5。关键字匹配既是问题的主要焦点,又非常具体,所以你可以用 10 来衡量它。
当然,这只是一个例子,正如我所说,权重的确切确定以及如何评分取决于具体的业务。您可能会认为匹配关键字的数量比权重更重要,因此权重可能仅用作决胜局等 HTH。