2016-01-13 98 views
1

在我的ElasticSearch服務器中,我有一個現有的索引模板,其中包含一些設置和一些映射。將映射添加到現有索引模板(使用NEST屬性)

我想爲模板添加新類型的映射,但由於無法更新模板,我需要刪除現有模板並重新創建它。

因爲我想保留所有現有的設置,我試圖讓現有的定義,在這個例子中,映射添加到它,然後刪除/重建,如:

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類似於東西?

回答

2

您可以通過使用更強大的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命名空間

正如上面的評論所述,如果映射是唯一需要更新的內容,我建議您不要刪除舊的模板,否則您需要將所有其他相關設置複製到您的新請求中。

+0

謝謝,這正是我所需要的。關於刪除,即使我刪除模板,它看起來仍然保留設置:畢竟,GET _template'請求也返回設置,對吧? –

相關問題