2014-11-04 4 views
7

का उपयोग कर एक गतिशील वस्तु इंडेक्स मैं एक एपीआई एप्लिकेशन बना रहा हूं जो अनिवार्य रूप से उपयोगकर्ता को एक दस्तावेज़ बनाने की अनुमति देता है, जिसे संरचित किया जा सकता है, हालांकि वे चाहते हैं, जिसे एलैस्टिकसेर्च में संग्रहीत किया जाएगा। अनिवार्य रूप से, मैं उपयोगकर्ताओं के लिए हमारे लोचदार खोज उदाहरण तक पहुंचने के लिए एक सरल इंटरफ़ेस प्रदान कर रहा हूं। मैं कार्यान्वयन को यथासंभव सरल रखने की कोशिश कर रहा हूं। यहां तक ​​कि मैं अब तक क्या कर रहा हूं। एनईईटी

उम्मीद शरीर के लिए वस्तु:

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; } 
} 

सरल कार्यान्वयन:

[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); 
} 

यह ठीक काम करता है, लेकिन यह सूचकांक, प्रकार शामिल है, और ईद स्रोत में। जो मैं वास्तव में करना चाहता हूं वह इंडेक्सिंग के दौरान केवल उन तीन टुकड़ों की जानकारी प्रदान करता है, लेकिन वास्तव में केवल सूचकांक दस्तावेज़। दस्तावेज़, जो एक गतिशील प्रकार का है। लेकिन, कि, घोंसला से सहमत नहीं के रूप में यह IDE में और संकलन समय पर एक त्रुटि फेंकता लगता है:

"एक अनाम समारोह या विधि समूह एक गतिशील बाध्य आपरेशन के एक घटक मूल्य के रूप में इस्तेमाल नहीं किया जा सकता"

"एक लैम्ब्डा अभिव्यक्ति का उपयोग किसी गतिशील रूप से प्रेषित ऑपरेशन के लिए तर्क के रूप में नहीं कर सकता है, बिना किसी प्रतिनिधि या अभिव्यक्ति वृक्ष प्रकार के इसे कास्ट किए।"

मैं केवल document.Document कैसे इंडेक्स कर सकता हूं? गतिशील प्रकार का उपयोग करने से अज्ञात संरचना के आने वाले JSON दस्तावेज़ को संभालने का कोई बेहतर तरीका है?

उत्तर

15

ऐसा करने के कुछ तरीके हैं।

दस्तावेज को गतिशील प्रकार के रूप में इंडेक्स करने की कोशिश करना काम नहीं करेगा, लेकिन आप इसे indexRequest ऑब्जेक्ट के माध्यम से किसी ऑब्जेक्ट के रूप में सूचीबद्ध कर सकते हैं।

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); 

या अगर थोक में दस्तावेजों के साथ काम कर

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); 

घोंसला (या अधिक सही, Elasticsearch.Net) भी एक .Raw विधि संस्करण ElasticClient वर्ग से जुड़ी है जो सूचकांक कर सकते हैं कच्चे JSON । का उपयोग करते हुए Raw.Index() हमें इस तरह बातें करते है करते हैं:

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

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

प्रतिक्रिया के लिए प्रकार वर्णनकर्ता प्रकार आप जवाब में होने की उम्मीद जाएगा (स्ट्रिंग मतलब है कि आप एक धारावाहिक json प्रतिक्रिया करनी होगी जो आप deserialize और कुछ कर सकते हैं)। यह हमें पूरे ऑब्जेक्ट टाइप इश्यू को हटाने और एनएएसटी को दस्तावेज़ को एलैस्टिकसेर्च में अपेक्षित रूप से अनुक्रमित करने की इजाजत देता है।

+0

मेरी इच्छा है कि रॉ। इंडेक्स ने नई इंडेक्स – Adrian

+0

में पुरानी इंडेक्स से माता-पिता के रिश्तों को रखा है 'गतिशील' के विकल्प के रूप में मैंने 'शब्दकोश <स्ट्रिंग, ऑब्जेक्ट>' या कक्षा से उत्तराधिकारी का उपयोग किया है। चेतावनी: यदि आप 'शब्दकोश' एनईईटी से प्राप्त करते हैं तो आपके दस्तावेज़ पर अन्य गुणों को स्वचालित नहीं किया जाएगा (उन्हें इसके बजाय शब्दकोश में डालें)। यह परिवर्तनीय विशेषताओं के लिए भी अच्छी तरह से काम करता है: सामान्य गुण POCO गुणों में चला गया, परिवर्तनीय गुण 'डेटा' गुण (प्रकार' शब्दकोश <स्ट्रिंग, ऑब्जेक्ट> ') के साथ गए। इस थोक विधि का उपयोग करना आसान है। 'इंकर्स' आदि की जांच के लिए 'थोक' पर कॉल का नतीजा न भूलें! – nothingisnecessary