web-dev-qa-db-fra.com

Obtenir une requête brute du client NEST

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.

40
Mark Walsh

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.

18
Todd Menier

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); 
26
Rob

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());
}
16
Henry C

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));
});
14
Paul Taylor

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());
12
Jay Shah

sur la version nid 6, utilisez

connextionString.DisableDirectStreaming();

puis sur response.DebugInformation, vous pouvez voir toutes les informations.

4
Mahyar

Utilisation result.ConnectionStatus.Request.

3
rkrahl

Que diriez-vous d'utiliser Fiddler ?! :)

0
havij