2014-10-17 71 views
5

我有一個基本的Elasticsearch查詢,看起來像這樣Elasticsearch.net客戶端無法做基本的搜索

POST /fruit/_search 
{"query":{"term":{"Name":"banana"}}} 

我得到的結果返回,當我感覺運行沒有問題。

所以我嘗試做這elasticsearch.net

var requestBody = new { query = new { term = new { Name = "banana" } } }; 
       var result = client.Search<string>("fruit", requestBody); 

而且我沒有得到任何結果回來。如果我只有一個新的搜索主體{},那麼我會得到點擊,但不會被過濾。

我在做什麼錯?

+0

這是奇怪的工作對我來說 – keety 2014-10-18 00:36:31

+0

我覺得鳥巢可能lowercasing名稱。您可以序列化並記錄搜索以進行調試。 – 2014-10-18 00:37:01

+0

如何一步一步通過代碼並試圖找出問題的來源? – Aybe 2014-10-18 07:36:04

回答

8

如果使用低等級客戶機(elasticsearch.net)直接也不會做任何正常化和連載逐字對象:

var query = new { query = new { term = new { Name = "banana" } } }; 
var json = new ElasticsearchClient().Serializer.Serialize(query).Utf8String(); 

這將導致以下JSON:

{ 
    "query": { 
    "term": { 
     "Name": "banana" 
    } 
    } 
} 

如果您使用NEST,默認行爲是對camelCase屬性名稱(NEST是獨立的):

{ 
    "query": { 
    "term": { 
     "name": "banana" 
    } 
    } 
} 

如果通過高級客戶端(client.Raw)使用低級客戶端,它將使用與高級客戶端完全相同的序列化設置。

您可以控制通過高層次的客戶對這個行爲:

var connectionSettings = new ConnectionSettings() 
    .SetDefaultPropertyNameInferrer(p=>p); 
var client = new ElasticClient(connectionSettings); 
+1

感謝您的回答。如果不是用戶自己實現的話,我仍然認爲套管應該獨立。 – 2014-10-30 14:34:54

+1

我同意,NEST是我寫的東西,主要是爲了我自己的使用,而我在2010年將elasticsearch集成到了我的應用程序中。該協議在此之後就已經出爐了,儘管NEST已經完全被內部重寫,導致其1.0版本現在發生了改變給現有用戶造成很多問題。當分解出低級別的客戶端時,我們故意選擇了它,但不要讓這樣的魔法烘焙。 – 2014-10-30 14:42:22