【问题标题】:RavenDB Map Reduce Distinct IndexRavenDB Map 减少不同索引
【发布时间】: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


【解决方案1】:

您正在对文档 ID 进行分组。 deal.Id,因此您永远不会真正跨多个文档生成缩减。 我不认为这是故意的。

【讨论】:

  • 道歉阿扬德!当我试图简化发布示例时,错误地创建了这种情况。我已经更新了问题以反映实际问题。将 ID 视为链接产品信息的共享 ID。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多