2014-12-03 56 views
10

默認情況下,將對象發送到Elasticsearch以進行索引時,NEST將駝峯大小寫對象和屬性名稱。在NEST for Elasticsearch文檔中,如何禁用駱駝套管字段名稱?我已經做了相當多的研究,關於這個問題有一個mailing list thread,但它似乎過時了,因爲一些方法已被重命名或不再存在。 如何在NEST中禁用駱駝套管Elasticsearch字段名稱?

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

在郵件列表的信息表示該代碼應該被添加到處理事情的字段名稱,但客戶端的方法似乎並不存在:

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

沒有人有任何更新語法來處理這個?謝謝。

+0

你是如何想的'Name'跨來..? 'UpperCase,LosweCase ..?'請澄清..如果你不能使用'.ToUpper()或ToLower()'例如 – MethodMan 2014-12-03 22:44:06

+0

@DJKRAZE:我根本不想修改這個名字。當我發送一個要編制索引的對象時,我希望該對象的屬性名稱不受干擾。注意:settings.SetDefaultTypeNameInferrer僅影響對象類型(如果您在構建請求時沒有用其他更具體的內容覆蓋它,通常會推斷爲Elasticsearch文檔類型)。該行代碼與對象的屬性名稱無關。 – Ellesedil 2014-12-03 22:45:55

回答

13

ConnectionSettings.SetDefaultPropertyNameInferrer()是你在找什麼。該方法接受一個函數,該函數接受一個屬性名稱並對其應用轉換。然後,在將請求發送到Elasticsearch之前,將在每個屬性上調用該函數。

如果你想保持你的屬性名稱不變,那麼你可以這樣做:

settings.SetDefaultPropertyNameInferrer(p => p)

p => p這裏只是簡單地作爲一個函數,它接受一個字符串(您的屬性名)並返回相同的字符串修改。

+0

非常好。因此'settings.SetDefaultTypeNameInferrer(p => p.Name);'和'settings.SetDefaultPropertyNameInferrer(p => p);'將會禁用整個對象的駱駝套管(這可能是Elasticsearch中的類型和字段名稱)? – Ellesedil 2014-12-04 14:54:48

+0

這是正確的。 – 2014-12-04 14:58:38

3

在2.5.0版是:

settings.DefaultFieldNameInferrer(p => p)