如何按相似性对匹配关键字的项目进行排名

时间:2010-10-19 13:53:14

标签: sql search keyword

我有一个链接到关键字表的项目表。 我想列出共享关键字的所有项目,并且我想对结果进行排名,以便最相似的项目显得最高。 因此,我认为匹配所有关键字的项目最高的项目只匹配列表中较低的一个关键字。

如果项目符合我想要的相同数量的关键字,则会根据关键字的频率对结果进行排名,以便共享不寻常关键字的项目会显得高于共享经常出现的关键字的项目。

目前我的架构是这样的(但必要时可以更改):

Item    ItemKeywords    Keywords
____    ____________    ________
ID       ItemID          ID
Item    KeywordID       Word

我很难开始使用sql来获取与大多数关键字匹配的项目。有人可以帮忙吗? 我正在使用Sql Server 2005

编辑 - (为完整性而添加)

使用Beth的SQL作为指针我已经提出了以下内容,我认为它正在按照我的意愿工作,只需要做更多的测试:

   SELECT IK1.ItemID, 
      IK2.ItemID, 
      COUNT(IK2.KeywordID) AS KeywordCount, 
      MIN(WordFrequency) AS WordFrequency
    FROM ItemKeywords IK1
    INNER JOIN ItemKeywords IK2 
        ON IK1.KeywordID = IK2.KeywordID --Keywords match
        AND IK1.ItemID < IK2.ItemID --Eliminate pairs (Bill & Ted but not Ted and Bill or Bill and Bill)
    INNER JOIN (SELECT KeywordID, COUNT(*) WordFrequency 
                FROM dbo.ItemKeywords 
                GROUP BY KeywordID) AS KF 
        ON KF.KeywordID = IK2.KeywordID --Join to sub-query to get frequency of word
    GROUP BY IK1.ItemID, IK2.ItemID
    ORDER BY COUNT(IK2.KeywordID) DESC, MIN(WordFrequency) ASC  --Order by most matching keywords then by  most unusual word

我稍微修改了语法以避免子查询(在连接上执行所有操作),我已将IK1.ItemID <> IK2.ItemID更改为IK1.ItemID < IK2.ItemID以消除对,并且我添加了第二个按项目排序,以考虑使用单词的频率。但基本上Beth回答了这个问题所以我将其标记为答案(非常感谢)

1 个答案:

答案 0 :(得分:2)

Select keywordID, count(itemID) as cnt_item
from itemKeywords
group by keywordID
order by count(itemID) desc

好的,更好地了解您不想要的内容,尝试在itemID不匹配的keywordID字段上加入itemKeyword表的2个实例:

select ik.itemID, ik1.itemID as itemID1, ik.keywordID
from itemkeyword ik inner join itemkeyword ik1 on ik.keywordID = ik1.keywordID
where ik.itemID <> ik1.itemID

然后,使用该集合,计算keywordID的数量并按降序返回列表:

select itemID, itemID1, count(keywordID) as count_kwd
from 
(    select ik.itemID, ik1.itemID as itemID1, ik.keywordID
    from itemkeyword ik inner join itemkeyword ik1 on ik.keywordID = ik1.keywordID
    where ik.itemID <> ik1.itemID
) t
group by itemID, itemID1
order by count(keywordID) desc