我在一家电子商务公司工作,最近我们推出了一个新网站。我负责创建搜索算法。
我们正在使用SQL Server数据库。我们使用“代码”将产品与特定产品关键字相关联。我不想使用任何实际信息,因此我将用其他名称替换实际数据。
有一个Product
表,一个Tags
表和一个ProductTags
表,用于将产品与标签相关联。 Tag
可以有很多产品,反之亦然。
Tag
表有:
int TagId
varchar TagName
Product
表有:
Name
ProductId
Price
ProductTags
有:
TagId
ProductId
TagName
ProductName
现在我正在查询查询中的空格并查找适用于每个字符串的所有“标签”。
示例查询看起来像:'Red fish M60'。
在分割查询中的空格后,我从查询中的每个字符串中获取一个标记列表。 以下都是'Tag'。
字符串Red返回:
[Red]
鱼会回来:
[Fish_Male]
[Fish_Female]
[Fish_North_America]
和M60返回:
[M60_connection]
[M60_secure]
该搜索的热门点击可能是一些名称为
的产品'Red Male Fish Secure'
'Red Female Fish Secure'
'Red Male fish North america connection'
然后低于那些不太相关的产品,如
'red male fish farmed'
'black female fish secure'
然后在下面那将是不太相关的结果,只匹配一个标签,如
'red crab'
或
'black male fish'
我希望有所帮助。
所以我的问题是,最好的方法(最快,最有效?)是什么让我通过这些标签并返回顶部最相关的产品,同时也不遗漏任何产品。
我是否可以对这些标签进行所有可能的排列并为每个排列返回产品? (似乎很多)除了返回每个标签的产品,就像最后一样。
例如,匹配三个“标签”的产品将位于搜索结果的顶部,而仅匹配一个“标签”的产品位于底部。用户可以搜索任意数量的标签,因为有很多标签可用。我放下的只是一个简单的例子。如果事情没有意义,请告诉我。
由于
答案 0 :(得分:2)
这是一个开始。但我不知道是否仅仅根据标签点击次数进行匹配就足以进行排序。
select p.ProductId, count(*) as Relevance
from Product as p inner join ProductTags as pt on pt.ProductId = p.ProductId
where pt.TagId in (
select TagId from Tags where TagName in (...)
)
group by p.ProductId
order by Relevance desc
顺便说一句,将ProductName和TagName放在ProductTags表中是不规范化的。