How do you debug your Nest queries?

前端 未结 8 1913
失恋的感觉
失恋的感觉 2021-02-05 14:02

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,

相关标签:
8条回答
  • 2021-02-05 14:31

    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.

    0 讨论(0)
  • 2021-02-05 14:36

    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);
            }                                                                         
        }
    
    0 讨论(0)
提交回复
热议问题