"Clone" 索引映射

"Clone" index mappings

我有一个索引,我将对其重新编制索引。目前我想创建一个新索引,它应该包含可以在原始索引中找到的完全相同的映射。

我知道了:

var srcMappings = client.GetMapping(new GetMappingRequest((Indices)sourceIndexName)).Mappings;

然后我尝试创建一个索引:

var response = client.CreateIndex(destinationIndex, c => c
    .Settings(...my settings ...)
    .Mappings(... what here? ...)
);

我究竟应该向上面的 .Mappings(...) 传递什么,以便将源索引中的映射复制到目标索引中?我不想明确地 'know' 关于类型。

我正在尝试使用 Nest。

或者,是否有一个 Reindex API 可以获取目标索引名称并为我创建索引,以及源的映射?

您可以通过

从一个索引获取映射并使用它们在另一个索引中创建映射
var client = new ElasticClient();

var getIndexResponse = client.GetIndex("assignments");

var createIndexResponse = client.CreateIndex("assignments2", c => c
    .Mappings(m => Promise.Create(getIndexResponse.Indices["assignments"].Mappings))
);

您需要 IPromise<T> 实现才能做到这一点

public class Promise
{
    public static IPromise<TValue> Create<TValue>(TValue value) where TValue : class => 
        new Promise<TValue>(value);
}

public class Promise<T> : IPromise<T> where T : class
{
    public T Value { get; } 
    public Promise(T value) => Value = value;
}

在 NEST 的流畅 API 实现中的某些地方需要 Promise,其中值是累加的,最终值需要在稍后返回。

您也可以使用对象初始化语法而不是 Promise<T>

来做同样的事情
var createIndexResponse = client.CreateIndex(new CreateIndexRequest("assignments2")
{
    Mappings = getIndexResponse.Indices["assignments"].Mappings
});

Alternatively, is there a Reindex API which would take the destination index name and create the index for me, together with the mappings of the source?

NEST 中有两个 Reindex API;自 NEST 1.x 以来一直存在的 Observable 实现,以及自 2.3 以来的 Reindex API as available within Elasticsearch(在 NEST 中称为 ReindexOnServer)。以前的 Observable 实现可以为您创建目标索引,尽管它会复制所有设置、映射和别名。后面的 Reindex API 不会将创建目标索引作为操作的一部分,因此需要在开始 reindex 过程之前进行设置。