【问题标题】:What is the best way for me to search this Product database?搜索此产品数据库的最佳方式是什么?
【发布时间】:2015-03-09 16:17:50
【问题描述】:

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

我们使用的是 SQL Server 数据库。我们使用“标签”将产品与某些产品关键字相关联。我不想使用我们的任何实际信息,所以我将用其他名称替换实际的数据。

有一个Product 表、一个Tags 表和一个将产品与标签相关联的ProductTags 表。 Tag 可以有很多产品,反之亦然。

Tag 表有:

int TagId
varchar TagName

Product 表有:

Name
ProductId
Price

ProductTags 有:

TagId
ProductId
TagName
ProductName

现在我正在对查询中的空格拆分一个搜索查询,并查找适用于每个字符串的所有“标签”。

示例查询如下所示:“Red fish M60”。

拆分查询中的空格后,我从查询中的每个字符串中获取标签列表。 以下都是'Tag's。

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'

希望对你有帮助。

所以我的问题是,什么是最好的方式(最快、最有效?)让我浏览这些标签并在顶部返回最相关的产品,同时又不会遗漏任何产品。

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

例如,匹配三个“标签”的产品将位于搜索结果的顶部,而仅匹配一个“标签”的产品将位于底部。用户将能够搜索任意 n 个标签,因为有很多可用的标签。我放下的只是一个简单的例子。如果有什么不明白的地方请告诉我。

谢谢

【问题讨论】:

  • 您使用的是哪个 RDBMS?
  • 产品的相关性如何确定?
  • 我们正在使用 SQL Server。我不确定你的意思丹。
  • 您的问题表明您希望最相关的产品位于顶部。因此我的问题。
  • 哦,我明白了。最相关的产品将是标签点击次数最多的产品。我编辑了我的原件,希望它现在更清晰一些。

标签: sql sql-server algorithm permutation


【解决方案1】:

这是一个开始。但我不知道仅根据标签命中数进行匹配是否足以进行排序。

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

【讨论】:

  • 是的,我认为就排序而言这很好。标签点击次数最多的产品将位于搜索结果的顶部。
  • 请注意,他也希望能够通过标签前缀进行搜索。这意味着这样做,您需要执行LIKE "...%" OR LIKE "...%" ...,这将是低效的。
  • 谢谢肖恩,我认为这可以解决问题。我只需要能够将此查询转换为 Linq
  • @dragoste 我在任何地方都看不到这个问题。但我看不出这本身是如何特别低效的。
  • 那么dragoste 是正确的,我正在搜索包含TagName 列中字符串的Tag 对象。但我目前正在代码中执行此操作,并且已经获取了所有标记对象。现在我只需要遍历所有这些并获得标签的不同组合(排列?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2011-07-03
  • 2010-09-14
  • 2013-01-19
  • 2020-01-22
相关资源
最近更新 更多