How do you debug your Nest queries? How do you debug your Nest queries? elasticsearch elasticsearch

How do you debug your Nest queries?


You can get the values of search request URL and JSON request body as under:

var requestURL = response.RequestInformation.RequestUrl;var jsonBody = Encoding.UTF8.GetString(response.RequestInformation.Request);

You can find other useful properties in RequestInformation for debugging.


NEST is Baroque of .NET APIs. For 2.1+ on call level:

IElasticClient client = new ElasticClient();var searchDescriptor = new SearchDescriptor<Series>();var query = Query<Series>.Term(...);var pretty = query.ToPrettyString(query);var json = client.ToRawRequest(searchDescriptor.Query(descriptor => query));

On configuration level:

    var settings = new ConnectionSettings()                     .PrettyJson().DisableDirectStreaming()                     .OnRequestCompleted(details=> Debug.WriteLine(Encoding.UTF8.GetString(details.RequestBodyInBytes)));

On response level look into CallDetails.RequestBodyInBytes.

Used extensions:

    /// <summary>    /// Converts search to raw JSON request for debugging.    /// </summary>    /// <typeparam name="T">The type.</typeparam>    /// <param name="self">The self.</param>    /// <param name="searchDescriptor">The search descriptor.</param>    /// <returns>The string.</returns>    public static string ToRawRequest<T>(this IElasticClient self, SearchDescriptor<T> searchDescriptor) where T : class    {        using (var output = new MemoryStream())        {            self.Serializer.Serialize(searchDescriptor, output);            output.Position = 0;            var rawQuery = new StreamReader(output).ReadToEnd();            return rawQuery;        }    }    /// <summary>    /// Prints query into string.    /// </summary>    /// <param name="self">The self.</param>    /// <returns>The value.</returns>    public static string ToPrettyString(this QueryContainer self)    {        using (var settings = new ConnectionSettings())        {            var visitor = new DslPrettyPrintVisitor(settings);            self.Accept(visitor);            return visitor.PrettyPrint.Replace(Environment.NewLine, string.Empty);        }                                                                             }


I like to take it a step further than bsarkar suggests and eliminate the need for a roundtrip altogether:

var client = new ElasticClient();var seriesSearch = new SearchDescriptor<Series>();seriesSearch.Filter(f => f    .Term<Role>(t => t.ReleasableTo.First(), Role.Visitor))    .SortDescending(ser => ser.EndDate)    .Size(1));string searchJson = Encoding.UTF8.GetString(client.Serializer.Serialize(seriesSearch));

Note that your ElasticClient doesn't need any connection properties, so you have no dependency on an ES node.