将映射添加到现有索引模板(使用 NEST 属性)
Add a mapping to an existing index template (using NEST attributes)
在我的 ElasticSearch 服务器中,我有一个 existing 索引模板,其中包含一些设置和一些映射。
我想将新类型的映射添加到模板,但由于无法更新模板,我需要删除现有模板并重新创建它。
因为我想保留所有现有设置,所以我尝试获取现有定义,向其添加映射,然后 delete/recreate,如本例所示:
using Nest;
using System;
public class SomeNewType {
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public string SomeField { get; set; }
[ElasticProperty(Index = FieldIndexOption.Analyzed)]
public string AnotherField { get; set; }
}
class Program {
static void Main(string[] args) {
var settings = new ConnectionSettings(uri: new Uri("http://localhost:9200/"));
var client = new ElasticClient(settings);
var templateResponse = client.GetTemplate("sometemplate");
var template = templateResponse.TemplateMapping;
client.DeleteTemplate("sometemplate");
// Add a mapping to the template somehow...
template.Mappings.Add( ... );
var putTemplateRequest = new PutTemplateRequest("sometemplate") {
TemplateMapping = template
};
client.PutTemplate(putTemplateRequest);
}
}
但是,我找不到使用 ElasticProperty 属性将映射添加到模板定义的方法,例如
client.Map<SomeNewType>(m => m.MapFromAttributes());
是否可以创建一个 RootObjectMapping
以将类似于 MapFromAttributes
的内容添加到 Mappings
集合?
您可以通过使用更强大的 PutMappingDescriptor
来获取新的 RootObjectMapping
,然后将其添加到您的 GET _template
请求返回的集合中,如下所示:
var settings = new ConnectionSettings(uri: new Uri("http://localhost:9200/"));
var client = new ElasticClient(settings);
var templateResponse = client.GetTemplate("sometemplate");
var template = templateResponse.TemplateMapping;
// Don't delete, this way other settings will stay intact and the PUT will override ONLY the mappings.
// client.DeleteTemplate("sometemplate");
// Add a mapping to the template like this...
PutMappingDescriptor<SomeNewType> mapper = new PutMappingDescriptor<SomeNewType>(settings);
mapper.MapFromAttributes();
RootObjectMapping newmap = ((IPutMappingRequest) mapper).Mapping;
TypeNameResolver r = new TypeNameResolver(settings);
string mappingName = r.GetTypeNameFor(typeof(SomeNewType));
template.Mappings.Add(mappingName, newmap);
var putTemplateRequest = new PutTemplateRequest("sometemplate")
{
TemplateMapping = template
};
var result = client.PutTemplate(putTemplateRequest);
注意:TypeNameResolver 在 Nest.Resolvers
命名空间中
如上评论所述,如果映射是唯一需要更新的内容,我建议您不要删除旧模板,否则您需要将所有其他相关设置复制到新请求中。
在我的 ElasticSearch 服务器中,我有一个 existing 索引模板,其中包含一些设置和一些映射。
我想将新类型的映射添加到模板,但由于无法更新模板,我需要删除现有模板并重新创建它。
因为我想保留所有现有设置,所以我尝试获取现有定义,向其添加映射,然后 delete/recreate,如本例所示:
using Nest;
using System;
public class SomeNewType {
[ElasticProperty(Index = FieldIndexOption.NotAnalyzed)]
public string SomeField { get; set; }
[ElasticProperty(Index = FieldIndexOption.Analyzed)]
public string AnotherField { get; set; }
}
class Program {
static void Main(string[] args) {
var settings = new ConnectionSettings(uri: new Uri("http://localhost:9200/"));
var client = new ElasticClient(settings);
var templateResponse = client.GetTemplate("sometemplate");
var template = templateResponse.TemplateMapping;
client.DeleteTemplate("sometemplate");
// Add a mapping to the template somehow...
template.Mappings.Add( ... );
var putTemplateRequest = new PutTemplateRequest("sometemplate") {
TemplateMapping = template
};
client.PutTemplate(putTemplateRequest);
}
}
但是,我找不到使用 ElasticProperty 属性将映射添加到模板定义的方法,例如
client.Map<SomeNewType>(m => m.MapFromAttributes());
是否可以创建一个 RootObjectMapping
以将类似于 MapFromAttributes
的内容添加到 Mappings
集合?
您可以通过使用更强大的 PutMappingDescriptor
来获取新的 RootObjectMapping
,然后将其添加到您的 GET _template
请求返回的集合中,如下所示:
var settings = new ConnectionSettings(uri: new Uri("http://localhost:9200/"));
var client = new ElasticClient(settings);
var templateResponse = client.GetTemplate("sometemplate");
var template = templateResponse.TemplateMapping;
// Don't delete, this way other settings will stay intact and the PUT will override ONLY the mappings.
// client.DeleteTemplate("sometemplate");
// Add a mapping to the template like this...
PutMappingDescriptor<SomeNewType> mapper = new PutMappingDescriptor<SomeNewType>(settings);
mapper.MapFromAttributes();
RootObjectMapping newmap = ((IPutMappingRequest) mapper).Mapping;
TypeNameResolver r = new TypeNameResolver(settings);
string mappingName = r.GetTypeNameFor(typeof(SomeNewType));
template.Mappings.Add(mappingName, newmap);
var putTemplateRequest = new PutTemplateRequest("sometemplate")
{
TemplateMapping = template
};
var result = client.PutTemplate(putTemplateRequest);
注意:TypeNameResolver 在 Nest.Resolvers
命名空间中
如上评论所述,如果映射是唯一需要更新的内容,我建议您不要删除旧模板,否则您需要将所有其他相关设置复制到新请求中。