【问题标题】:"Clone" index mappings“克隆”索引映射
【发布时间】:2018-08-31 01:35:27
【问题描述】:

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

我有这个:

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 可以获取目标索引名称并为我创建索引以及源的映射?

【问题讨论】:

    标签: elasticsearch nest elasticsearch-net


    【解决方案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 的 fluent API 实现中的某些地方需要 Promise,其中值是相加的,并且需要在稍后返回最终值。

    你也可以使用对象初始化语法来做同样的事情,而不是Promise&lt;T&gt;

    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 不会将目标索引创建为操作的一部分,因此需要在启动 reindex 过程之前进行设置。

    【讨论】:

    • 谢谢。 Reindex 的 Observable 实现基本上创建了索引的完整克隆?您指的是ReindexObserver 和.Reindex&lt;T&gt;,对吗?我可以覆盖一些设置,例如索引的分片数吗?看看我是否做对了,NEST 1.x 版本在客户端重新索引,而 ES 2.3 重新索引通过ReindexOnServer 访问并在服务器上完成?
    • 正确,可观察的Reindex&lt;T&gt;,创建索引的克隆,尽管您可以控制哪些文档被重新索引,并重新映射它们的索引方式。您可以控制设置,但只能在Reindex&lt;T&gt; 调用,然后将它们传入,类似于在答案中创建索引。 Reindex&lt;T&gt; 使用scroll API 将文档拉取到应用端,并向 Elasticsearch 发送索引请求; ReindexOnServer 在 Elasticsearch 中执行重新索引。两者都存在于 NEST 2.x+ 中(ReindexOnServer 需要针对 Elasticsearch 2.3.0+ 运行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多