如何"pass through"来自 NEST Elasticsearch 查询的原始 json 响应?



我们的客户端代码直接使用弹性搜索响应,但我想把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),而不需要客户端缓冲。

最新更新