【发布时间】:2015-12-10 17:00:29
【问题描述】:
我们有一个具有嵌套属性的对象,我们想让它易于搜索。这很容易实现,但我们还希望基于多个字段聚合信息。就领域而言,我们有多个交易,除了卖方之外,这些交易具有相同的细节。我们需要将这些合并为一个结果,并在下一页显示卖家选项。但是,我们仍然需要能够根据初始页面上的卖家进行过滤。
我们尝试了类似下面的方法,试图连续收集多个卖家,但它包含重复项,并且索引的创建需要很长时间。
Map = deals => deals.Select(deal => new
{
Id = deal.ProductId,
deal.ContractLength,
Provider = deal.Provider.Id,
Amount = deal.Amount
});
Reduce = deals => deals.GroupBy(result => new
{
result.ProductId,
result.ContractLength,
result.Amount
}).Select(result => new
{
result.Key.ProductId,
result.Key.ContractLength,
Provider = result.Select(x => x.Provider).Distinct(),
result.Key.Amount
});
我不确定这是解决这个问题的最佳方法,但对于 Raven 来说还是个新手,并且还在为想法而苦苦挣扎。如果我们保持索引简单并在客户端分组,那么我们就无法保持分页一致。
有什么想法吗?
【问题讨论】:
-
Provider = result.Select(x => x.Provider).Distinct()你不能这样做。 Map/Reduce 是分布式的,你不能假设你曾经拥有整个 Providers 集合。 reduce 中唯一值得信赖的 linq 运算符是Count()和Sum()这样的运算符,因为它们是关联的 -
我知道这是分布在 Hadoop 等平台上的,但你确定这实际上是分布在 RavenDB 中的吗?
-
是的,你永远不能依赖在 reduce 中设置完整的对象。这并不是说你不会拥有它,甚至可能有 99% 的时间拥有全套,但即使有 1% 的时间你没有,你也会将自己带入误导性数据的雷区。像这样在 reduce 中运行
.Provider选择,您可以确保您的索引中会丢失数据。
标签: c# indexing mapreduce ravendb lucene.net