2014-12-03 5 views
10

Per impostazione predefinita, NEST camelerà i nomi degli oggetti e delle proprietà del caso quando si invia un oggetto a Elasticsearch per l'indicizzazione. In che modo i nomi dei campi di carcasse di cammelli possono essere disattivati ​​nei documenti NEST per Elasticsearch? Ho svolto una discreta attività di ricerca e sull'argomento c'è uno mailing list thread, ma sembra obsoleto in quanto alcuni dei metodi sono stati rinominati o non esistono più. Come disattivare i nomi dei campi Elasticsearch del rivestimento del cammello in NEST?

IConnectionPool connectionPool = new SniffingConnectionPool(m_ElasticsearchNodeUris); 
ConnectionSettings settings = new ConnectionSettings(connectionPool); 
settings.SetDefaultTypeNameInferrer(p => p.Name); //This disables camel casing for object type names 
ElasticClient client = new ElasticClient(settings); 

Le informazioni contenute in mailing list indica questo codice dovrebbe essere aggiunto per gestire le cose per i nomi dei campi, ma il metodo cliente non sembra esistere:

client.ModifyJsonSerializationSettings(s => s.ContractResolver = new Nest.Resolvers.ElasticResolver(settings); 

Qualcuno ha qualche aggiornamento sintassi per gestire questo? Grazie.

+0

come stai volere il 'name' per incontrare ..? 'UpperCase, LosweCase ..?' Per favore chiarire .. se non si può usare '.ToUpper() o ToLower()' ad esempio – MethodMan

+0

@DJKRAZE: Non voglio affatto modificare il nome. Quando invio un oggetto da indicizzare, voglio che i nomi delle proprietà dell'oggetto non vengano molestati. Nota: settings.SetDefaultTypeNameInferrer ha effetto solo sul tipo di oggetto (che viene spesso considerato come il tipo di documento Elasticsearch se non lo si sovrascrive con qualcos'altro più specifico quando si crea la richiesta). Quella riga di codice non ha alcuna relazione con i nomi delle proprietà dell'oggetto. – Ellesedil

risposta

13

ConnectionSettings.SetDefaultPropertyNameInferrer() è quello che stai cercando. Questo metodo accetta una funzione che accetta un nome di proprietà e ne applica una trasformazione. La funzione viene quindi richiamata su ciascuna proprietà prima che le richieste vengano inviate a Elasticsearch.

Se si desidera mantenere i nomi di proprietà incontaminata, allora si può fare questo:

settings.SetDefaultPropertyNameInferrer(p => p)

p => p qui solo essere semplicemente una funzione che prende una stringa (il vostro nome di proprietà) e restituisce la stessa stringa non modificato.

+0

Eccellente. Quindi 'settings.SetDefaultTypeNameInferrer (p => p.Name);' e 'settings.SetDefaultPropertyNameInferrer (p => p);' disabiliterà la carcassa di cammello per l'intero oggetto (quale sarebbe il tipo e i nomi dei campi in Elasticsearch)? – Ellesedil

+0

Questo è corretto. –

3

Nella versione 2.5.0 è:

settings.DefaultFieldNameInferrer(p => p)