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ò?
potresti fornire un esempio di input e cosa ti aspetti di avere in ES per favore? grazie –
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