gpt4 book ai didi

c# - 将映射添加到现有索引模板(使用NEST属性)

转载 作者:行者123 更新时间:2023-12-02 23:00:45 24 4
gpt4 key购买 nike

在我的ElasticSearch服务器中,我有一个现有的索引模板,其中包含一些设置和一些映射。

我想为模板添加一种新类型的映射,但是由于无法更新模板,因此需要删除现有模板并重新创建它。

由于我想保留所有现有设置,因此我尝试获取现有定义,将映射添加到其中,然后删除/重新创建,如以下示例所示:

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并添加到 Mappings集合中,类似于 MapFromAttributes

最佳答案

您可以使用更强大的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命名空间中

如上面的注释中所述,如果映射是唯一需要更新的内容,则建议您不要删除旧模板,否则,您需要将所有其他相关设置复制到新请求中。

关于c# - 将映射添加到现有索引模板(使用NEST属性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com