2014-11-05 91 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); 
} 
相关问题