搜索此产品数据库的最佳方式是什么?

时间:2015-03-09 16:17:51

标签: sql sql-server algorithm permutation

我在一家电子商务公司工作,最近我们推出了一个新网站。我负责创建搜索算法。

我们正在使用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'

我希望有所帮助。

所以我的问题是,最好的方法(最快,最有效?)是什么让我通过这些标签并返回顶部最相关的产品,同时也不遗漏任何产品。

我是否可以对这些标签进行所有可能的排列并为每个排列返回产品? (似乎很多)除了返回每个标签的产品,就像最后一样。

例如,匹配三个“标签”的产品将位于搜索结果的顶部,而仅匹配一个“标签”的产品位于底部。用户可以搜索任意数量的标签,因为有很多标签可用。我放下的只是一个简单的例子。如果事情没有意义,请告诉我。

由于

1 个答案:

答案 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表中是不规范化的。