我们的客户端代码直接使用弹性搜索响应,但我想把NEST放在中间来做一些安全和过滤。用NEST(或elasticsearch.net)构建查询,然后用最少的处理量将原始json响应传递回我的客户端,最简单的方法是什么。顺便说一下,我也在使用ServiceStack。
以前的类似问题现在有一个过时的答案-在ElasticSearch NEST查询中返回Raw Json
感谢
这是为了读者的利益,他们希望在撰写本文时在NEST v2.3的新版本中实现同样的功能。如果你只想要响应,你所需要做的就是使用ElasticLowLevelClient
,根据文档:
var responseJson = client.Search<string>(...);
但是,如果您也想要键入的结果,那么它会稍微涉及更多。您需要在settings对象上调用DisableDirectStreaming()
,然后从response.ApiCall.ResponseBodyInBytes
中检索原始json,如下所示。
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);
}
Elasticsearch.Net
允许您直接返回响应流,
var search = client.Search<Stream>(new { size = 10 });
.Search()
有许多重载,以通过索引和类型来限制其作用域。
这将返回一个IElasticsearchResponse<Stream>
,在这里您可以将响应流直接传递给您选择的反序列化程序(在您的情况下为SS.Text),而不需要客户端缓冲。