2014-11-04 23 views
7

Ben aslında bir kullanıcı ancak istedikleri yapılandırılmış olabilir bir belge, oluşturmanıza olanak sağlayan bir API uygulaması inşa ediyorum kullanarak dinamik bir nesnesi. Esasen, bizim Elasticsearch örneği erişmeleri için basit bir arayüz sağlayan ediyorum. Uygulamayı olabildiğince basit tutmaya çalışıyorum. İşte şu ana kadar uğraştığım şey. beklenen vücut için Endeksi Elasticsearch saklanacaktır ANDAE

nesne:

public class DocumentModel 
{ 
    public string Index { get; set; } 
    public string Type { get; set; } 
    public string Id { get; set; } 
    [ElasticProperty(Type = FieldType.Nested)] 
    public dynamic Document { get; set; } 
} 

Basit uygulanması:

[HttpPost] 
[Route("")] 
public IHttpActionResult Post(DocumentModel document) 
{ 
    Uri nodeLocation = new Uri("http://localhost:9200"); 
    IConnectionPool connectionPool = new SniffingConnectionPool(new List<Uri> { nodeLocation }); 
    ConnectionSettings settings = new ConnectionSettings(connectionPool); 
    ElasticClient esClient = new ElasticClient(settings); 

    IIndexResponse result = esClient.Index(document, i => i 
     .Index(document.Index) 
     .Type(document.Type) 
     .Id(document.Id)); 

    return Ok(result.IsValid); 
} 

kaynağında Bu iyi çalışır, ancak Endeksi, Type içerir ve İd. Aslında yapmak istiyorum dizine eklerken sadece bilginin bu üç adet sağlamak olmakla birlikte, dinamik bir tiptedir aslında sadece indeks document.Document. Ama, işte bu IDE ve derleme zamanında bir hata atar gibi Nest hemfikir görünüyor:

"Anonim işlev veya yöntem grubu dinamik bağlı operasyon kurucu değeri olarak kullanılamaz"

"Önce bir temsilci ya da ifade ağacı türüne çevrim olmadan dinamik operasyonu sevk bir argüman olarak bir lambda ifadesi kullanılamaz".

Yalnızca document.Document numarasını nasıl dizine ekleyebilirim? Dinamik bir türünü kullanarak daha bilinmeyen yapının gelen JSON belgesini işlemek için daha iyi bir yolu var mı?

cevap

15

bunu yapmanın birkaç yolu var. tip dinamiği olarak belge çalışmaz indeksi çalışılıyor

ancak IndexRequest nesnesi aracılığıyla bir nesne olarak endeks bunu yapabilirsiniz.

dynamic dynamicDoc = new { /*fill in document format here*/ }; 
ElasticClient esClient = new ElasticClient(esSettings); 

IndexRequest<object> request = new IndexRequest<object>(dynamicDoc) 
{ 
    Index = "someindex", 
    Type = "SomeType", 
    Id = "someid" 
}; 

esClient.Index<object>(request); 

Ya da toplu olarak belgelerle

List<dynamic> Documents = new List<dynamic>(); 
//Populate Documents 

BulkDescriptor descriptor = new BulkDescriptor(); 
foreach(var doc in Documents) 
{ 
    descriptor.Index<object>(i => i 
     .Index("someindex") 
     .Type("SomeType") 
     .Id("someid") 
     .Document(doc)); 
} 

esClient.Bulk(descriptor); 

ANDAE ilgili (veya daha doğru bir şekilde, Elasticsearch.Net) da ElasticClient sınıfına bağlı bir Raw yöntem varyantı, sahip olabilir göstergesi ham JSON . Raw.Index() bizi bu gibi şeyler var let kullanma:

string documentJson = JsonConvert.SerializeObject(document.Document); 

ElasticsearchResponse<string> result = esClient.Raw.Index(document.Index, document.Type, document.Id, documentJson); 

yanıt tipi açıklayıcısı size tepki de olmasını bekliyoruz edeceğiz türüdür (string bir tefrika json yanıtı olacağı anlamına gelir ile seri hale getirebilir ve bir şeyler yapabilirsiniz). Bu, tüm nesne türü sorununu tersine çevirmemize olanak tanır ve NEST, belgeyi tam olarak beklendiği gibi Elasticsearch içine endeksler.

+0

Ben Raw.Index dynamic' ben kullandım 'Sözlük ' alternatif olarak yeni endeks – Adrian

+0

eski dizinden ebeveyn-çocuk ilişkileri muhafaza dilek 'veya sınıfından. Uyarı: Eğer 'Sözlük'den miras alırsanız NEST belgenizdeki diğer özellikleri otomatik olarak işaretlemez (onları sözlüğe ekler). Bu aynı zamanda değişken özellikler için iyi çalıştı: Ortak özelliklere POCO özelliklerinin girdi değişken özellikler (tip 'Sözlük ' ile) 'Data' özelliği girdi. Bu toplu yöntem kullanımı kolaydır. '.Errors' vb. Için kontrol etmek için' Bulk 'çağrısının sonucunu almayı unutmayın! – nothingisnecessary