我在一家电子商务公司工作,最近我们启动了一个新网站。我负责创建搜索算法。
我们正在使用SQL Server数据库。我们正在使用“标签”将产品与某些产品关键字相关联。我不想使用我们的任何实际信息,所以我将用其他名称替换数据的实际含义。
有一个Product
表,一个Tags
表和一个ProductTags
将产品与标签关联的表。一个Tag
可以有很多产品,反之亦然。
Tag
表有:
int TagId
varchar TagName
Product
表有:
Name
ProductId
Price
ProductTags
已:
TagId
ProductId
TagName
ProductName
现在,我将搜索查询拆分为查询中的空格,并找到适用于每个字符串的所有“标记”。
查询示例如下:“ Red fish M60”。
在对查询中的空格进行分割之后,我从查询中的每个字符串中获取了一个标签列表。以下是所有“标签”。
字符串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'
希望对您有所帮助。
所以我的问题是,对我来说,浏览这些标签并在顶部返回最相关的产品,同时又不丢失任何产品的最佳方式是什么(最快,最有效?)。
对我来说,获取这些标签的所有可能排列并返回每个排列的乘积是否可行?(似乎很多)以及为每个单独的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表中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句