'Get raw query from NEST client

Is it possible to get the raw search query from the NEST client?

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

I'd really like to debug why I am getting certain results.



Solution 1:[1]

You can get raw query json from RequestInformation:

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

Or enable trace on your ConnectionSettings object, so NEST will print every request to trace output

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

NEST 7.x

Enable debug mode when creating settings for a client:

var settings = new ConnectionSettings(connectionPool)
    .DefaultIndex("index_name")
    .EnableDebugMode()
var client = new ElasticClient(settings); 

then your response.DebugInformation will contain information about request sent to elasticsearch and response from elasticsearch. Docs.

Solution 2:[2]

For NEST / Elasticsearch.NET v6.0.2, use the ApiCall property of the IResponse object. You can write a handy extension method like this:

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

Or, if you want to log all requests made to Elastic, you can intercept responses with the connection object:

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));
});

Solution 3:[3]

In ElasticSearch 5.x, the RequestInformation.Request property does not exist in ISearchResponse<T>, but similar to the answer provided here you can generate the raw query JSON using the Elastic Client Serializer and a SearchDescriptor. For example, for the given NEST search query:

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

You can get the raw query JSON as follows:

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

Solution 4:[4]

Before making Request, from 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());

Edit: It's changed from from Nest 6.x, and you can do below:

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

Solution 5:[5]

on nest version 6 use

connextionString.DisableDirectStreaming();

then on response.DebugInformation you can see all information.

Solution 6:[6]

Use result.ConnectionStatus.Request.

Solution 7:[7]

While it's possible to get raw request/response through code, I find it much easier to analyze it with fiddler.
The reason is that I can easily analyze raw request, response, headers, Full URL, execution time - all together without any hassle of code changes.

Here's some reference links in case someone unfamiliar with fiddler wants to check details:
#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

Solution 8:[8]

When using NEST 7 and you don't want to enable debug mode.

public static string GetQuery<T>(this IElasticClient client, SearchDescriptor<T> searchDescriptor) where T : class
    {
        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            client.RequestResponseSerializer.Serialize(searchDescriptor, ms);

            return Encoding.UTF8.GetString(ms.ToArray());
        }
    }

Solution 9:[9]

How about using Fiddler ?! :)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Frederik Struck-Schøning
Solution 3 Frederik Struck-Schøning
Solution 4
Solution 5 Mahyar
Solution 6 rkrahl
Solution 7
Solution 8 acivic2nv
Solution 9 havij