从NEST客户端获取原始查询

时间:2015-03-09 09:50:26

标签: elasticsearch nest

是否可以从NEST客户端获取原始搜索查询?

var result = client.Search<SomeType>(s => s
                .AllIndices()
                .Type("SomeIndex")
                .Query(query => query
                    .Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
                );

我真的很想调试我获得某些结果的原因。

9 个答案:

答案 0 :(得分:26)

您可以从RequestInformation获取原始查询json:

var rawQuery = Encoding.UTF8.GetString(result.RequestInformation.Request);

或者在ConnectionSettings对象上启用跟踪,因此NEST将打印每个跟踪输出的请求

var connectionSettings = new ConnectionSettings(new Uri(elasticsearchUrl));
connectionSettings.EnableTrace(true);
var client = new ElasticClient(connectionSettings); 

答案 1 :(得分:16)

在ElasticSearch 5.x中,RequestInformation.Request中不存在ISearchResponse<T>属性,但similar to the answer provided here您可以使用Elastic Client Serializer和SearchDescriptor生成原始查询JSON。例如,对于给定的NEST搜索查询:

var results = elasticClient.Search<User>(s => s
    .Index("user")
    .Query(q => q                    
        .Exists(e => e
            .Field("location")
        )
    )            
);

您可以按如下方式获取原始查询JSON:

SearchDescriptor<User> debugQuery = new SearchDescriptor<User>()
    .Index("user")
    .Query(q => q                    
        .Exists(e => e
            .Field("location")
        )
    )
;

using (MemoryStream mStream = new MemoryStream())
{
    elasticClient.Serializer.Serialize(debugQuery, mStream);
    string rawQueryText = Encoding.ASCII.GetString(mStream.ToArray());
}

答案 2 :(得分:16)

这样做的方法似乎在每个主要版本中都会发生变化,因此答案的数量令人困惑。 如果您希望它在NEST 6.x中工作,并且希望在实际发送之前看到反序列化的请求,则非常简单:

var json = elasticClient.RequestResponseSerializer.SerializeToString(request);

如果您正在Visual Studio中进行调试,则在此行之后放置一个断点很方便,当您点击它时,将鼠标悬停在上方的json变量上并点击magnifying glass thingy。您将获得一个漂亮的JSON格式化视图。

答案 3 :(得分:13)

对于NEST / Elasticsearch.NET v6.0.2,请使用IResponse对象的ApiCall属性。您可以编写一个方便的扩展方法,如下所示:

public static string ToJson(this IResponse response)
{
    return Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}

或者,如果要记录对Elastic发出的所有请求,可以使用连接对象拦截响应:

var node = new Uri("https://localhost:9200");
var pool = new SingleNodeConnectionPool(node);
var connectionSettings = new ConnectionSettings(pool, new HttpConnection());
connectionSettings.OnRequestCompleted(call =>
{
    Debug.Write(Encoding.UTF8.GetString(call.RequestBodyInBytes));
});

答案 4 :(得分:12)

在发出请求之前,从Nest Query - For Nest 5.3.0:

var stream = new System.IO.MemoryStream();
elasticClient.Serializer.Serialize(query, stream );
var jsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());

答案 5 :(得分:3)

使用result.ConnectionStatus.Request

答案 6 :(得分:3)

在嵌套版本6上使用

connextionString.DisableDirectStreaming();

然后在response.DebugInformation上可以查看所有信息。

答案 7 :(得分:0)

如何使用Fiddler? :)

答案 8 :(得分:0)

虽然可以通过代码获得原始请求/响应,但我发现使用 fiddler 分析它更容易。
原因是我可以轻松地分析原始请求、响应、标头、完整 URL、执行时间——所有这些都在一起,而无需更改代码。

这里有一些参考链接,以防不熟悉 fiddler 的人想查看详细信息:
#1 https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/logging-with-fiddler.html
#2 NEST 1.0: See request on Fiddler
#3 https://newbedev.com/how-to-get-nest-to-work-with-proxy-like-fiddler