我们可以一次使用NEST在ES中创建多个索引吗?

时间:2017-09-06 13:24:37

标签: elasticsearch nest

我有一个要求,我需要根据用户输入动态使用ES中的NEST创建新索引。在这里我可以创建一个索引但是如何通过单个调用一次创建多个索引?。

var settings = new ConnectionSettings(new Uri(indexURL));        
                settings.DefaultIndex(indexName);
                settings.RequestTimeout();
                settings.PingTimeout();
                settings.MaximumRetries();
   var _client = new Nest.ElasticClient(settings);`

1 个答案:

答案 0 :(得分:0)

CreateIndex()次调用只能创建一个索引。但是,如果要使用相同的映射创建多个索引,或者需要对属性的映射方式应用约定,则可以采取策略。

默认情况下,如果您尝试将文档索引到不存在的索引中,则将创建索引,并且Elasticsearch将从它看到的第一个文档中推断该类型的映射。这可能对您的用例很有用,您可以通过使用

控制自动创建的索引的映射来进一步使用它

Index templates

您可以定义索引模板,以将映射应用于与模板字段匹配的新创建的索引。使用*将匹配任何索引

var putIndexTemplateResponse = client.PutIndexTemplate("default", t => t
    .Template("*")
    .Mappings(m => m
        .Map("_default_", tm => tm
            .Properties(p => p
                .Keyword(k => k
                    .Name("id")
                )
            )
        )
    )
);

这会将任何新创建的索引中的任何类型的id属性映射为keyword字段。

Dynamic templates

如果您需要更多基于类型/属性约定的内容,可以使用带有规则的动态模板来确定应如何映射动态添加的字段

var createIndexResponse = client.CreateIndex("index-name", t => t
    .Mappings(m => m
        .Map("_default_", tm => tm
            .DynamicTemplates(d => d
                .DynamicTemplate("default", dt => dt
                    .Match("id")
                    .MatchMappingType("string")
                    .Mapping(mm => mm
                        .Keyword(k => k)
                    )
                )
            )
        )
    )
);

这两种方法都在Elasticsearch中设置了映射约定。