Est-il possible d'obtenir la requête de recherche brute à partir du client NEST?
var result = client.Search<SomeType>(s => s
.AllIndices()
.Type("SomeIndex")
.Query(query => query
.Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
);
J'aimerais vraiment déboguer pourquoi j'obtiens certains résultats.
Les méthodes pour le faire semblent changer avec chaque version principale, d'où le nombre déroutant de réponses. Si vous souhaitez que cela fonctionne dans NEST 6.x ET que vous souhaitez voir la demande désérialisée AVANT qu'elle ne soit réellement envoyée , c'est assez simple:
var json = elasticClient.RequestResponseSerializer.SerializeToString(request);
Si vous déboguez dans Visual Studio, il est pratique de placer un point d'arrêt juste après cette ligne, et lorsque vous le frappez, survolez la variable json
ci-dessus et appuyez sur thingy en forme de loupe . Vous obtiendrez une belle vue formatée du JSON.
Vous pouvez obtenir une requête brute json depuis RequestInformation
:
var rawQuery = Encoding.UTF8.GetString(result.RequestInformation.Request);
Ou activez la trace sur votre objet ConnectionSettings
, afin que NEST imprime chaque demande pour tracer la sortie
var connectionSettings = new ConnectionSettings(new Uri(elasticsearchUrl));
connectionSettings.EnableTrace(true);
var client = new ElasticClient(connectionSettings);
Dans ElasticSearch 5.x, le RequestInformation.Request
la propriété n'existe pas dans ISearchResponse<T>
, mais similaire à la réponse fournie ici vous pouvez générer la requête brute JSON à l'aide d'Elastic Client Serializer et d'un SearchDescriptor. Par exemple, pour la requête de recherche NEST donnée:
var results = elasticClient.Search<User>(s => s
.Index("user")
.Query(q => q
.Exists(e => e
.Field("location")
)
)
);
Vous pouvez obtenir la requête brute JSON comme suit:
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());
}
Pour NEST/Elasticsearch.NET v6.0.2, utilisez la propriété ApiCall de l'objet IResponse. Vous pouvez écrire une méthode d'extension pratique comme celle-ci:
public static string ToJson(this IResponse response)
{
return Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}
Ou, si vous souhaitez enregistrer toutes les demandes adressées à Elastic, vous pouvez intercepter les réponses avec l'objet de connexion:
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));
});
Avant de faire une demande, depuis Nest Query - Pour Nest 5.3.0:
var stream = new System.IO.MemoryStream();
elasticClient.Serializer.Serialize(query, stream );
var jsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());
sur la version nid 6, utilisez
connextionString.DisableDirectStreaming();
puis sur response.DebugInformation, vous pouvez voir toutes les informations.
Utilisation result.ConnectionStatus.Request
.
Que diriez-vous d'utiliser Fiddler ?! :)