Berin Loritsch Berin Loritsch - 1 month ago 20
C# Question

How do you debug your Nest queries?

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'll use my current problem as an example.

I have several documents in ElasticSearch of the type

Series
. I'll stub it out below without the attributes and public modifiers with just the information pertinent to the query:

class Series
{
string Id {get; set;}
DateTime StartDate {get; set;}
DateTime EndDate {get; set;}
HashSet<Role> ReleasableTo {get; set;}
}


These are all fine and dandy. I can
Get()
a
Series
object no problem. The problem I'm running into is trying to figure out how Nest is formatting my query. My immediate goal is to find the most recent
Series
that is releasable to
Role.Visitor
. I set up the Nest query like this:

ISearchResponse<Series> response = client
.Search<Series>(r =>
r.Filter(f =>
f.Term<Role>(t=>t.ReleasableTo.First(), Role.Visitor))
.SortDescending(ser => ser.EndDate).Size(1));


In my mind, this should be producing a query that filters the Series so it only considers the ones that are
ReleasableTo
my
Role.Visitor
, reverse sorts by end date, and limits the results to one returned. That would be exactly what I want. In the multiple thousands of records I have for Series, about 90% fit this profile. Unfortunately the query returns 0 results. There is no error, just no results. What I don't know is if I'm using the API incorrectly, if Nest is producing a query structure that doesn't make sense, or I simply don't know ElasticSearch well enough. When I remove the
Filter
clause I get a result, but I'm not guaranteed everyone is allowed to see it.

How do I view the JSON that Nest produces and sends to ElasticSearch?

Answer

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.