I\'m new to Nest, and I very likely am not creating my query like I think I am. My question is more along the lines of teach a man to fish rather than give me a fish. However,
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.
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);
}
}