“克隆”索引映射

时间:2018-03-21 19:05:24

标签: elasticsearch nest elasticsearch-net

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

我有这个:

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

我尝试创建一个索引:

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

我应该准确传递给上面的.Mappings(...),以便将源索引的映射复制到目标索引中?我不想明确地“了解”这些类型。

我正在尝试使用Nest。

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

1 个答案:

答案 0 :(得分:1)

您可以从一个索引获取映射并使用它们在

中创建另一个索引中的映射
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
});
  

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

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