8

如何检查索引是否存在?- 打电话之前:

IndexCreation.CreateIndexes(typeof(MyIndexClass).Assembly, documentStore);

我见过的所有示例(包括示例项目中的示例)每次启动客户端时都会重新创建索引,这似乎不正确。

还有一般的策略是什么?似乎有正常的 CRUD 操作,然后有管理命令,例如上面的索引。人们是否只是创建一个控制台应用程序来执行管理员并与主应用程序分开部署/运行它?

4

2 回答 2

18

您不必检查是否存在。服务器将自动比较您发送的索引定义并检查它是否已经存在。如果存在具有相同名称和定义的一个,则将其单独放置。如果存在同名但定义已更改,则删除旧的并创建新的。

通常人们会在应用程序启动时在同一个应用程序中创建索引。对于可能在 global.asax 中的 Web 应用程序,以及对于控制台/桌面应用程序,它只是启动代码的第一部分。

但有时这是不可能的,例如,如果您有许多不同的数据库,就像多租户应用程序经常做的那样。在这些情况下,您将在创建每个租户数据库时创建索引,并且在推出版本升级时可能需要更新或创建更多索引。

另外,我应该提到您可以通过几种不同的方式创建索引。

// scans the assembly for all indexes and creates them
IndexCreation.CreateIndexes(assembly, documentStore);

// scans a MEF catalog for all indexes and creates them
IndexCreation.CreateIndexes(catalog, documentStore);

// puts a single index the HARD way
documentStore.DatabaseCommands.PutIndex(...);

// puts a single index the easy way
documentStore.ExecuteIndex(new YourIndexCreationTask());

还有一些其他的,但你明白了。

并且为了彻底,如果你真的想检查索引是否存在,你可以使用

documentStore.DatabaseCommands.GetIndex("YourIndex") != null

但这只会按名称检查,而不是按定义检查。而你不需要它。

于 2012-12-12T22:22:07.897 回答
0

对主要和隐含问题的当代答案(RavenDB v4.x)将是:

如何检查索引是否存在?

无法检查特定索引,但您可以获得所有索引的列表(参见官方文档),如下所示

IndexDefinition[] indexes = store.Maintenance.Send(new GetIndexesOperation(0, 100));

如何迁移数据库?

是的,您可以在每次启动应用程序时运行索引创建。它适用于一个小型应用程序,如果不需要更改,它会很快(参见官方文档):

IndexCreation.CreateIndexes(typeof(YourClass).Assembly, _store);

However, for a bigger app I'd encourage to create a migration procedure (either a separate tool or just another endpoint in the app) where you handle:

  • Errors in indexes (e.g. see a story of LINQ gotchas). Index errors may happen and some records can fall out of the query results if they fail to be indexed. Get notified on index errors ASAP. See "How to Get Index Errors" in the docs.
  • Have migration procedure in place. Many DB modifications may require to execute a migration script, which subsequently requires DB versioning, ensuring you're running correct version, etc. Check out RavenMigrations NuGet package for that.
于 2019-09-05T06:14:32.417 回答