搜索此产品数据库的最佳方式是什么?
What is the best way for me to search this Product database?
我在一家电子商务公司工作,我们最近推出了一个新网站。我负责创建搜索算法。
我们正在使用 SQL 服务器数据库。我们正在使用 'tags' 将产品与某些产品关键字相关联。我不想使用我们的任何实际信息,所以我将用其他名称替换实际数据。
有一个 Product
table、一个 Tags
table 和一个将产品与标签相关联的 ProductTags
table .一个 Tag
可以有很多产品,反之亦然。
Tag
table 有:
int TagId
varchar TagName
Product
table 有:
Name
ProductId
Price
ProductTags
有:
TagId
ProductId
TagName
ProductName
现在我正在拆分查询中空格的搜索查询,并找到适用于每个字符串的所有 'Tags'。
示例查询如下所示:'Red fish M60'。
在拆分查询中的空格后,我从查询中的每个字符串中获得了标签列表。
以下均为'Tag's.
红色字符串returns:
[Red]
鱼会 return :
[Fish_Male]
[Fish_Female]
[Fish_North_America]
和 M60 returns:
[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'
希望对您有所帮助。
所以我的问题是,什么是最好的方式(最快、最有效?)让我浏览这些标签和 return 顶部最相关的产品,同时又不遗漏任何产品.
我是否可以对这些标签进行所有可能的排列并 return 每个排列的产品? (似乎很多)以及 returning 产品 每个人 标签,就像最后一样。
例如,匹配三个 'Tags' 的产品将位于搜索结果的顶部,而仅匹配一个 'Tag' 的产品将位于搜索结果的底部。用户将能够搜索任意 n 个标签,因为有相当多的可用标签。我放下的只是一个简单的例子。如果有什么不合理的地方,请告诉我。
谢谢
这是一个开始。但我不知道仅根据标签命中数进行匹配是否足以满足您的排序要求。
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 table 未规范化。
我在一家电子商务公司工作,我们最近推出了一个新网站。我负责创建搜索算法。
我们正在使用 SQL 服务器数据库。我们正在使用 'tags' 将产品与某些产品关键字相关联。我不想使用我们的任何实际信息,所以我将用其他名称替换实际数据。
有一个 Product
table、一个 Tags
table 和一个将产品与标签相关联的 ProductTags
table .一个 Tag
可以有很多产品,反之亦然。
Tag
table 有:
int TagId
varchar TagName
Product
table 有:
Name
ProductId
Price
ProductTags
有:
TagId
ProductId
TagName
ProductName
现在我正在拆分查询中空格的搜索查询,并找到适用于每个字符串的所有 'Tags'。
示例查询如下所示:'Red fish M60'。
在拆分查询中的空格后,我从查询中的每个字符串中获得了标签列表。 以下均为'Tag's.
红色字符串returns:
[Red]
鱼会 return :
[Fish_Male]
[Fish_Female]
[Fish_North_America]
和 M60 returns:
[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'
希望对您有所帮助。
所以我的问题是,什么是最好的方式(最快、最有效?)让我浏览这些标签和 return 顶部最相关的产品,同时又不遗漏任何产品.
我是否可以对这些标签进行所有可能的排列并 return 每个排列的产品? (似乎很多)以及 returning 产品 每个人 标签,就像最后一样。
例如,匹配三个 'Tags' 的产品将位于搜索结果的顶部,而仅匹配一个 'Tag' 的产品将位于搜索结果的底部。用户将能够搜索任意 n 个标签,因为有相当多的可用标签。我放下的只是一个简单的例子。如果有什么不合理的地方,请告诉我。
谢谢
这是一个开始。但我不知道仅根据标签命中数进行匹配是否足以满足您的排序要求。
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 table 未规范化。