是否可以从NEST客户端获取原始搜索查询?
var result = client.Search<SomeType>(s => s
.AllIndices()
.Type("SomeIndex")
.Query(query => query
.Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
);
我真的很想调试我获得某些结果的原因。
答案 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