2015-04-17 25 views
16

ElasticSearch ile etkileşimde bulunmak için NEST kütüphanesini kullanıyorum ve tip olmayan verilere göre indeks türleri/iç içe nesneler oluşturmanın bir yolunu bulmaya çalışıyorum. Tip aşağıdaki temel yapıya sahiptir.Tek bir .NET türünü, ElasticSearch/NEST içinde birden çok iç içe geçmiş nesne türüne nasıl eşlerim?

public class Entity : DynamicObject 
{ 
     public string Id { get; set; } 
     // a bunch of other simple properties 

     public override IEnumerable<string> GetDynamicMemberNames() 
     { 
       return Data.Select(x => x.Name); 
     } 

     public override bool TryGetMember(GetMemberBinder binder, out object result) 
     { 

      var dictionary = Data.First(x => x.Name == binder.Name); 
      result = dictionary; 
      return true; 
     } 

     // each instance of one these should be a nested object type 
     public IList<NestedType> Data { get; set; } 

     public class NestedType 
     { 
      // How do I make Name be the nest type name? 
      public string Name { get; set; } 
      public IDictionary<string, string> Values { get; set; } 
     } 
} 

Her NestedType örneği için yuvalanmış bir nesne/tür oluşturmak istiyorum. Dolayısıyla, iki NestedType örneği varsa, iki yuvalanmış nesne olacaktır. NEST'in doğru olarak eşleştiğini (yani, her bir sözlük anahtarını bir özelliğe dönüştürdüğünüzde) "gerçek" özelliklere dönüştürmek için, DynamicObject öğesinden NestedType'ı alabilirim. Sorun, iç içe geçmiş nesnenin adını/türünü nasıl ayarlayacağımı anlayamamam.

Bildiğim isimleri eşlemek için iki yol vardır: ElasticType özniteliği ve NestedObject akıcı arabirimi. Buradaki problem, çoklu yuvalanmış nesne tiplerini temsil eden tek bir tip olmasıdır. Bazı çalışma zamanı tipi yapıları yapabilirim, ancak bunu önleyebilir miyim?

İç içe nesnenin adı/türü olarak bir yöntem veya özellik kullanılmasının bir yolu var mı? Ya da bu türdeki verileri ElasticSearch'e (NEST üzerinden umarım) haritalamak için daha iyi bir yaklaşım var mı?

Teşekkürler! Erick Ben (İstediğimi yapmak JsonSerializer almak için DynamicObject kullanarak) ne yapıyorum yansıtacak şekilde varlık tanımını güncellenmiş

DÜZENLEME. İstediğim şey, farklı sözlüklerin farklı eşlemelere sahip olma yeteneği (farklı kaynak, analizci, vb.). Uygun türler varsa, bunu ayarlamak için NEST akıcı sözdizimini kullanabilirdim, ancak dinamik kullanırken, kullanılacak akıcı API için herhangi bir tür yoktur. Sonuçta, akıcı API'yi türler yerine dizelere dayalı bir dizeyle karıştırmak istiyorum. Bu mantıklı mı?

+0

Girdiye bir örnek verebilir misiniz ve ES'de ne olmasını bekler misiniz? thx –

+0

Örnek bir haritalama yararlı olacaktır. Bunun gibi bir özel json dönüştürücü özniteliği olabilir misiniz: http://stackoverflow.com/questions/29173196/c-sharp-json-serialization-use-value-instead-of-property-name – Calle

cevap

5

Doğru niyetinizi anlarsam, Entity nesnesinde yalnızca iç içe nesneler olur, değil mi?

Nesne nesnesi için elasticsearch işlevinin dynamic mapping işlevini kullanmayı deneyebilirsiniz. Varlığın bir kök nesnesi olduğunu varsayalım. Bir değeri, iç içe türü haritalama olarak uygulanacağı

curl -X POST localhost:9200/myindex/entity/_mapping 
{"dynamic_templates": [ 
    {"nested_data_template": { 
     "mapping": { 
      "type": "nested" }, 
     "match_mapping_type": "object", 
     "path_match": "*" }}]} 

path_match: * ve match_mapping_type: object nesne ile tüm alan adları için anlamına gelir.

NEST ve Fluent API'yi kullanarak aşağıdaki API'yi kullanabilirsiniz. IntelliSense, yukarıdaki haritaların nasıl oluşturulacağını size rehberlik edecektir. ;)

descriptor.DynamicTemplates(DynamicTemplatesDescriptor<Entity>) 

bu şablonu uyan yeni bir özellik, elasticsearch dinamik haritalama dayalı eşleme güncelleyecektir gösterildiği her seferde. Bir süre sonra haritanız şöyle görünecektir:

Bu yardımcı olacaktır umuyoruz!

+0

Ah, ben yapmadım Dinamik şablonlar yöntemini bilir. Bu ilerlememe yardımcı olur - teşekkürler! –

İlgili konular