0

我将这个问题抛给“更大的创造力”,以获取有关可能解决此问题的搜索方法的一些建议。我想出了一个有些人为的例子来试图很好地解释这个问题,以便推荐一些解决方案。

问题:我们使用的是关系数据库(MSSQL),需要搜索具有以下约束的产品:

  • 可用性
  • 市场
  • 价格

我们还需要对 - 价格 - 市场 - 更大的实体汇总进行分组和排序

让我看看我是否可以使用半现实世界的实体来解释:

考虑一个允许用户搜索他们可以预订的酒店房间的应用程序。以下条件可能可用于搜索: - 客房预订天数 - 他们想要酒店客房的市场(纽约市、波士顿等) - 酒店客房可能拥有的设施(热门)浴缸,壁炉 - 床数 - 套房与否

在所有情况下,可能会或可能不会选择上述搜索条件。因此,可以进行非常广泛的搜索(在这些日期,不关心哪个市场)或不同程度的特异性(在纽约市,2 张床,带壁炉)。

为了增加复杂性,我们还需要返回所选标准的酒店房间价格。显然,特殊定价,不同住宿天数的不同价格(周四晚上一个价格,周末住宿周五和周六晚上不同的价格)。

我们玩过的一些事情是: - Solr - Endeca - SQL 查询 - 在 C# 代码中实现并在必要时/在必要时进行优化(想想装饰器模式)

我在这里寻找的是来自社区的一些建议 - 以上哪个不适合这个问题 - 哪个可能非常适合这个问题 - 哪些其他技术可能会更好,我们没有考虑过 - 技术其他人在类似问题上使用的效果很好(非技术特定)

提前感谢您的任何想法或建议。我将尝试对这个问题应用适当的标签,但我是开放的,可以添加/删除以帮助获得正确的大脑。

4

1 回答 1

1

您所描述的归结为具有属性的实体。我花了很多时间在一个类似的问题上,在我的案例中,产品和属性可以是任何东西(例如类别、条件、价格、颜色等)。产品不必共享属性,尽管有一个共同的集合。

我最终得出的解决方案是使用 lucene(在我的例子中是 .net)。但是我建议您使用 Solr,因为它更容易使用它的过滤功能(我不能使用它有一个特定原因,但它可能是更简单的解决方案......虽然它很容易启动和运行Lucene.net)。基本思想是您创建将属性作为属性的文档。然后设计一些对象,您可以将其传递给您的搜索代码,列出人们正在搜索他们想要过滤的值的属性。之后,很容易使用该对象在 Lucene 中构建一个查询来检索您想要的文档。

如果需要,实现分页相对简单。我发现 Solr 的一个优点是它可以轻松计算属性组(例如,我可以搜索“Nikon”并且返回所有带有“Nikon”的文档,它可以对属性进行分组,例如不同的类别或不同的颜色....你可以用 Lucene 来做到这一点,但它的工作量更大)。

在查看了各种搜索选项后,我选择了 Lucene,花了相当多的时间使用 SQL Server 的搜索功能来实现功能,但我发现 Lucene 速度更快,而且它看起来减轻了我的数据库服务器的负载(我收集了 Stack OverFlow 本身从使用 SQL Server 的搜索转移到 Lucene)堆栈溢出搜索

于 2012-01-05T19:58:02.403 回答