2014-11-05 64 views
4

我們的客戶端代碼直接與elasticsearch響應一起工作,但我想將NEST放在中間以執行一些安全性和過濾。使用NEST(或elasticsearch.net)構建查詢的最簡單方法是什麼,然後只需將最少的處理將原始json響應傳回給我的客戶端即可。順便說一句,我也使用ServiceStack。如何從NEST Elasticsearch查詢中「傳遞」原始json響應?

上一頁similiar問題現在已經過時的答案 - Returning Raw Json in ElasticSearch NEST query

感謝

回答

3

Elasticsearch.Net允許你直接返回響應流,

var search = client.Search<Stream>(new { size = 10 }); 

.Search()有許多重載通過指數來限制其範圍並鍵入。

這將返回一個IElasticsearchResponse<Stream>,您可以將響應流直接傳遞給您選擇的反序列化器(在您的情況下是SS.Text),而無需客戶端之間的緩衝。

+0

嗨Martijn, 當我嘗試這個,它給了我堆棧溢出。 返回新的HttpResult(搜索); 其中'搜索'是ISearchResponse 。我應該如何通過這個服務棧? 謝謝。 – richardwhatever 2014-11-19 21:37:17

+0

流保存原始JSON作爲由elasticsearch發送,你可以簡單地閱讀你的自我,並將其作爲JSON字符串或更精細地使用像http://msdn.microsoft.com/en-us/library /system.net.http.pushstreamcontent%28v=vs.118%29.aspx直接流式傳輸到web api響應。如果你使用字符串,你也可以使用'Search '這裏要注意的關鍵是響應已經是json作爲一個字符串或流,不需要SS.Text來序列化任何東西。 – 2014-11-24 10:56:46

+0

嗨馬丁,對不起,但我無法得到這個工作。你可能舉一個例子調用。搜索和操縱結果到一個標準的字符串變量?非常感謝! – richardwhatever 2015-09-03 18:38:00

3

這是爲了讀者的利益,他們希望在本文寫作時在新版本的NEST v2.3中實現相同的功能。如果你只是想響應,所有你需要做的是使用ElasticLowLevelClient,根據doc

var responseJson = client.Search<string>(...); 

但是,如果你想輸入的結果,以及那麼它稍微有點複雜。您需要在設置對象上調用DisableDirectStreaming(),然後從response.ApiCall.ResponseBodyInBytes中檢索原始json,如here所示。

var settings = new ConnectionSettings(new Uri("http://localhost:9200")) 
    .DefaultIndex("index1") 
    .DisableDirectStreaming(); 

var response = new ElasticClient(settings) 
      .Search<object>(s => s.AllIndices().AllTypes().MatchAll()); 

if (response.ApiCall.ResponseBodyInBytes != null) 
{ 
    var responseJson = System.Text.Encoding.UTF8.GetString(response.ApiCall.ResponseBodyInBytes); 
}