2015-04-17 10 views
16

Uso la libreria NEST per interagire con ElasticSearch e sto cercando di capire come creare tipi di indice/oggetti nidificati basati su dati non di tipo. Il tipo ha la seguente struttura di base.Come mappare un singolo tipo .NET a più tipi di oggetti nidificati in ElasticSearch/NEST?

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

Voglio creare un oggetto/tipo nidificato per ogni istanza di NestedType. Quindi, se ci sono due istanze di NestedType, ci saranno due oggetti nidificati. Posso ereditare NestedType da DynamicObject per trasformare il dizionario in proprietà "reali" che NEST quindi esegue correttamente il mapping (cioè, trasforma ogni chiave del dizionario in una proprietà). Il problema è che non riesco a capire come impostare il nome/tipo dell'oggetto nidificato.

Esistono due modi per mappare i nomi che conosco: attributo ElasticType e interfaccia fluida NestedObject. Il problema qui è che esiste un singolo tipo che rappresenta più tipi di oggetti nidificati. Potrei fare qualche tipo di runtime, ma preferirei non se posso evitarlo.

C'è un modo per utilizzare un metodo o una proprietà come nome/tipo dell'oggetto nidificato? O c'è un approccio migliore per mappare questo tipo di dati a ElasticSearch (si spera tramite NEST)?

Grazie! Erick

EDIT

ho aggiornato la definizione di entità di riflettere quello che sto facendo (usando DynamicObject per ottenere il JsonSerializer a fare quello che voglio). Quello che voglio è la possibilità per i diversi dizionari di avere mappature diverse, (diverse derivazioni, analizzatori, ecc.). Se esistessero dei tipi corretti, potrei usare la sintassi fluente di NEST per configurarla, ma quando si usa la dinamica, non esiste un tipo per l'API fluente da usare. In definitiva, voglio mescolare l'API fluente con una stringa basata su stringhe anziché tipi. Ha senso ciò?

+0

potresti fornire un esempio di input e cosa ti aspetti di avere in ES per favore? grazie –

+0

Una mappatura di esempio sarebbe utile. Potresti utilizzare un attributo di un convertitore json personalizzato, ad esempio: http://stackoverflow.com/questions/29173196/c-sharp-json-serialization-use-value-instead-of-property-name – Calle

risposta

5

Se ho capito correttamente l'intenzione, l'oggetto Entity contiene solo oggetti nidificati, no?

È possibile provare a utilizzare la funzionalità dynamic mapping di elasticsearch per l'oggetto entità. Suppongo che Entity sia un oggetto radice.

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

path_match: * e match_mapping_type: object significa che per tutti i nomi di campo con oggetto come verrà applicato un valore nidificato tipo di mappatura.

Utilizzando l'API NEST e Fluent è possibile utilizzare la seguente API. IntelliSense ti guiderà su come costruire la mappatura sopra. ;)

descriptor.DynamicTemplates(DynamicTemplatesDescriptor<Entity>) 

Ogni volta che una nuova proprietà corrispondenza questo modello appare, elasticsearch aggiornerà mappatura sulla base di mappatura dinamica. Dopo un po 'sembrerà la mappatura:

{ 
    "entity": { 
    "mappings": { 
     "entity": { 
     "dynamic_templates": [ 
      { 
      "nested_data_template": { 
       "mapping": { 
       "type": "nested" 
       }, 
       "match_mapping_type": "object", 
       "path_match": "*" 
      } 
      } 
     ], 
     "properties": { 
      "test": { 
      "type": "nested", 
      "properties": { 
       "test": { 
       "type": "string" 
       }, 
       "another_property": { 
       "type": "string" 
       } 
      } 
      }, 
      "test1": { 
      "type": "nested", 
      "properties": { 
       "test": { 
       "type": "string" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Spero che questo possa essere d'aiuto!

+0

Ah, non l'ho fatto conoscere il metodo dei modelli dinamici. Questo mi aiuta ad andare avanti - grazie! –

Problemi correlati