【问题标题】:What's the optimal solution for tag/keyword matching?标签/关键字匹配的最佳解决方案是什么?
【发布时间】:2010-10-11 12:50:08
【问题描述】:

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

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

所以,假设我有两张桌子; ProductsKeywords 以经典的多对多关系与第三个表 Products_Keywords 链接。

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

我们应该考虑到记录可能共享多个关键字,这一事实应该决定最相关产品的排序。

我也愿意接受其他想法,但由于性能原因,T-SQL 将是更可取的解决方案。

【问题讨论】:

  • 迂腐警告:某些东西不可能是“最佳的”。它要么是最佳的,也称为“最佳”,要么不是。 ;-)

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


【解决方案1】:

嗯,也许是这样的:

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 语句,但它应该可以完成工作。但我无法验证它,因为我只是从头开始编写它,没有实际的后备表或要测试的数据。

【讨论】:

  • 如果您想要上面的加权关键字并且您选择权重为 0 > x >= 1 之间的数字,您可以将排名设置为 (count(related.productId)*(sum(pk .weight)/sum(pk.weight) + 1)) 作为排名或 [C * (w/w+1) = rank] 其中 C 是计数,w 是总权重。
【解决方案2】:

我的第一个镜头是这样的:

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。

【讨论】:

  • 您能详细说明一下重量概念吗?我应该如何加权关键字?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2013-05-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多