从NEST客户端获取原始查询

Mar*_*lsh 44 elasticsearch nest

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

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

我真的很想调试为什么我会得到一定的结果.

Rob*_*Rob 26

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

var rawQuery = Encoding.UTF8.GetString(result.RequestInformation.Request);
Run Code Online (Sandbox Code Playgroud)

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

var connectionSettings = new ConnectionSettings(new Uri(elasticsearchUrl));
connectionSettings.EnableTrace(true);
var client = new ElasticClient(connectionSettings); 
Run Code Online (Sandbox Code Playgroud)

  • 如果需要查询_before_,则发送:`Encoding.UTF8.GetString(elasticClient.Serializer.Serialize(query))` (5认同)
  • @RicardoSilva,你正在使用NEST 2.x. 答案是用1.x版本编写的.检查[this](http://stackoverflow.com/questions/35554890/nest-2-0-enable-trace/35555214#35555214)之一. (4认同)
  • ISearchResponse中没有RequestInformation:\ (3认同)
  • result 没有 RequestInformation 属性,我需要添加一些依赖项才能访问它吗? (2认同)

Tod*_*ier 21

执行此操作的方法似乎随每个主要版本而变化,因此答案数量令人困惑.如果你想在NEST 6.x中使用它,并且你希望在实际发送之前看到反序列化的请求,那么它很容易:

var json = elasticClient.RequestResponseSerializer.SerializeToString(request);
Run Code Online (Sandbox Code Playgroud)

如果你在Visual Studio中进行调试,在这一行之后放置一个断点很方便,当你点击它时,将鼠标悬停在json上面的变量上并点击放大镜.您将获得一个很好的格式化JSON视图.

  • 您的要求是什么?您如何定义它? (2认同)

Hen*_*y C 16

在ElasticSearch 5.x中,该RequestInformation.Request属性不存在的ISearchResponse<T>,而是类似于为这里的答案你就可以使用弹性客户端串行和好SearchDescriptor原始查询JSON.例如,对于给定的NEST搜索查询:

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

您可以按如下方式获取原始查询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());
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*lor 16

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

public static string ToJson(this IResponse response)
{
    return Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果要记录对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));
});
Run Code Online (Sandbox Code Playgroud)

  • 在我的情况下,`RequestBodyInBytes`为null.使用`connectionSettings.DisableDirectStreaming(true)`它可以工作 - 默认情况下,请求/响应序列化不会保存在内存中. (9认同)

Jay*_*hah 13

在发出请求之前,从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());
Run Code Online (Sandbox Code Playgroud)


Mah*_*yar 5

在Nest版本6上使用

connextionString.DisableDirectStreaming();
Run Code Online (Sandbox Code Playgroud)

然后在response.DebugInformation上,您可以看到所有信息。