【问题标题】:RavenDB rebuilds all indexes when one document is updatedRavenDB 在更新一个文档时重建所有索引
【发布时间】:2015-04-22 18:01:59
【问题描述】:

即使在谷歌搜索之后,我似乎也无法找到答案。

我们遇到了导致我们的应用被锁定的问题。部分原因是我们有未完成的WaitForNonStaleResultsAsOfNow 调用,我们正在等待发布修复(即我们已经删除了它们),但这也是由所有索引的完全重建引起的。我相信导致重建所有索引的触发器是当我们对一个(类型)文档进行更改时。例如:

我们有一个名为“代理”的模型。当我们的用户登录时,我们使用他们的“AgencyId”来为他们提供特定于他们的数据。因此,大多数其他文档(例如“展示位置”、“发票”等)都有一个“AgencyId”字段。

代理模式类似于:

public class Agency
{
    public string Id {get;set;}
    public string AgencyName {get;set;}
    // ... 
}

Placement 示例(和其他机构特定文件)

public class Placement
{
    public string Id {get;set;}
    public string AgencyId {get;set;} // relates to Agency Document
    // ...
}

我们有一项功能,允许管理员将文档 (PDF) 上传到代理机构的资料中。我们将 PDF 存储在 DFS 中,并将代理模型上的“DocumentPath”属性设置为保存位置。

我的问题:更新代理记录会导致重建所有相关文档的索引吗?即我知道AgencyIndex 会重建,但这会导致PlacementIndex(和所有其他相关索引)也重建吗?

更多信息:
Raven Client Build#:2.5.2952
Raven Server Build#:2.5.2952 (RavenHQ)

另外值得注意的是:我们正在努力尽快升级到 RavenDB 3.0,但这是一个真实存在的问题,我需要了解它为什么会发生!

【问题讨论】:

  • 总是很高兴看到有人投反对票并现在解释原因。 叹息
  • 我为你解决了问题。我也需要一个答案!

标签: c# ravendb


【解决方案1】:

是的,许多其他人指出的更新文档肯定会导致索引重建。 某些类型的操作需要索引不是过时的(或强制更新过时的索引)。有必要将截止日期传递给您的 WaitForNonStaleResultsAsOfNow,它可以接收 TimeSpan 作为参数,因此您将等待预定义类型的索引不会过时。

【讨论】:

  • 好的,有没有一种方法可以实现这种设计而不必触发索引重建?顺便说一句,我在 WaitForNonStaleResultsAsOfNow 调用中添加了一个 TimeSpan,但是在 TimeSpan 持续时间(60 秒)之后,它会抛出一个 TimeoutException 并返回 0 个结果,这小于 Ideal。
  • 并非如此。由于 raven 指向这个 Doc (Agency) 并且所有索引都使用这个文档,所以如果所有这些索引都被重建,这真的很有意义。关键是要确保此时没有过时的索引。
  • 是的,我明白了。猜猜我们只需要尽快迁移到 3.0!
猜你喜欢
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
相关资源
最近更新 更多