2017-01-11 3 views
0

Я хотел бы добавить сопоставления в индекс после того, как я его создал. Я создал индекс как таковой:Динамически добавлять именованное сопоставление в индекс

client.CreateIndex("typeaheads", c => c 
         .Settings(t => t.Analysis(m => m.TokenFilters(fl => fl.EdgeNGram("edge_ngram_filter", ad => ad.MinGram(2).MaxGram(20))) 
         .Analyzers(anz => anz.Custom("edge_ngram_analyzer", an => an.Filters("lowercase", "edge_ngram_filter").Tokenizer("standard")))))); 

Переменная typeName - это имя, которое я хочу для сопоставления.

Когда я выполняю это:

var map = new CreateIndexDescriptor("typeaheads") 
           .Mappings(ms => ms 
           .Map(typeName, d => d.Properties(ps => ps.String(s => s.Name("countryCode"))) 
           .Properties(ps => ps.String(s => s.Name("display_ID"))) 
           .Properties(ps => ps.String(s => s.Name("display_String"))) 
           .Properties(ps => ps.String(s => s.Name("id"))) 
           .Properties(ps => ps.String(s => s.Name("languageCode"))) 
           .Properties(ps => ps.String(s => s.Name("match_String").SearchAnalyzer("standard").Index(FieldIndexOption.Analyzed).Analyzer("edge_ngram_analyzer"))) 
           .Properties(ps => ps.String(s => s.Name("type"))) 
           .Properties(ps => ps.Number(s => s.Name("boostFactor").Type(NumberType.Long))))); 
var response = client.Index(map); 

я получаю этот выход на моей службы ES: Wrong Mapping

Я хотел бы получить это: Correct Mapping

Любые идеи?

+0

Вы могли бы предоставить отображение как JSON? – BlackPOP

+0

Как это сделать через C#? –

+0

Вы можете разместить json в клиенте. – BlackPOP

ответ

0

Если у вас есть существующий индекс и хотите добавить отображение к нему, это может быть сделано с Put Mapping API, подвергаются в НЕСТ, как client.Map<T>() и client.MapAsync<T>()

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
var connectionSettings = new ConnectionSettings(pool);    
var client = new ElasticClient(connectionSettings); 

var typeName = "my-type"; 

var mappingResponse = client.Map<object>(d => d 
    .Index("typeaheads") 
    .Type(typeName) 
    .Properties(ps => ps 
     .String(s => s.Name("countryCode")) 
     .String(s => s.Name("display_ID")) 
     .String(s => s.Name("display_String")) 
     .String(s => s.Name("id")) 
     .String(s => s.Name("languageCode")) 
     .String(s => s 
      .Name("match_String") 
      .SearchAnalyzer("standard") 
      .Index(FieldIndexOption.Analyzed) 
      .Analyzer("edge_ngram_analyzer") 
     ) 
     .String(s => s.Name("type")) 
     .Number(s => s 
      .Name("boostFactor") 
      .Type(NumberType.Long) 
     ) 
    ) 
); 

который посылает следующий запрос

PUT http://localhost:9200/typeaheads/my-type/_mapping?pretty=true 
{ 
    "properties": { 
    "countryCode": { 
     "type": "string" 
    }, 
    "display_ID": { 
     "type": "string" 
    }, 
    "display_String": { 
     "type": "string" 
    }, 
    "id": { 
     "type": "string" 
    }, 
    "languageCode": { 
     "type": "string" 
    }, 
    "match_String": { 
     "type": "string", 
     "index": "analyzed", 
     "analyzer": "edge_ngram_analyzer", 
     "search_analyzer": "standard" 
    }, 
    "type": { 
     "type": "string" 
    }, 
    "boostFactor": { 
     "type": "long" 
    } 
    } 
} 
+0

Спасибо, это действительно сработало. Я думал, что для отображения потребуется имя имени объекта, указанного в «Карта ». Но, я думаю, его переопределили, установив '.Type()', правильно? –

+0

Тип будет выведен из 'T' в' Map () ', correct; по умолчанию NEST уменьшает имя типа POCO, и, как вы сказали, это можно переопределить, вызвав '.Type (TypeName typename)'. Я использовал «объект» в примере, поскольку было неясно, если у вас есть POCO для представления вашего документа. –

Смежные вопросы