标签/关键字匹配的最佳解决方案是什么?

时间:2009-03-05 14:51:50

标签: sql search stored-procedures many-to-many

我正在寻找数据库中不同记录之间关键字匹配的最佳解决方案。这是一个经典问题,我发现了类似的问题,但没有具体的问题。

我已经完成了全文搜索,连接和子查询,临时表,......所以我真的很想看看你们是如何解决这个常见问题的。

所以,假设我有两张桌子; ProductsKeywords,它们与第三个表格Products_Keywords在经典的多对多关系中相关联。

如果我在页面上显示一条Product条记录,并希望显示与 n 相关的顶级产品,那么最佳选择是什么?

我们应该考虑到记录可能会共享几个关键字,而这个事实应该决定顶级相关产品的排序。

我也对其他想法持开放态度,但由于性能原因,T-SQL将是更好的解决方案。

2 个答案:

答案 0 :(得分:3)

我的第一枪就是:

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来加重。

这只是一个例子当然,正如我所说,权重的确切确定以及你如何评分它取决于具体的业务。您可能认为匹配关键字的数量比权重更重要,因此加权可能仅用作打破平局等.HPH。

答案 1 :(得分:0)

好吧也许就像下面这样:

select p.productId, p.name, r.rank
from products p inner join (
/* this inner select should bring in only products that have at least one keyword
=> shared with the requested product, and will count the actual number shared (for ranking)*/
    select related.productId, count(related.productId) as rank
    from
        products_keywords related   inner join 
        products_keywords pk ON (pk.productId = @productId  AND related.keywordId = pk.keywordId)
    where related.productId <> @productId
    group by related.productId
) r on p.productId = r.productId
order by r.rank DESC /* added DESC (not in orignal solution, but needed to put higher ranked on top)*/

现在我严重怀疑这是一个最佳的sql语句,但它应该完成工作。我无法验证它,因为我只是从头开始编写它没有实际的支持表,或者要测试的数据。