【问题标题】:catch query sent to elasticSearch捕获发送到 elasticSearch 的查询
【发布时间】:2020-07-06 14:34:09
【问题描述】:

我想捕获发送到弹性的查询,我使用的是 Nest 7.6.1。 我怎样才能看到请求的查询。这是代码:

ISearchResponse<Document> initialResponse = this.clientBundle.GetClient().Search<Document>
                (
                    scr => scr
                     .From(0)
                     .Take(scrollSize)
                     .Query(q =>
                                q.Bool(y => boolQuery)
                            )
                     .Scroll(scrollTimeout));

【问题讨论】:

  • 检查this问题。

标签: c# elasticsearch nest


【解决方案1】:

默认情况下,NEST 直接序列化到请求流并从响应流中反序列化,但这可以在全局或基于每个请求的基础上禁用,以便这些缓存在内存中并在 API 调用详细信息中可用回应

var client = new ElasticClient(settings);

var searchResponse = client.Search<object>(s => s
    .RequestConfiguration(r => r
        .DisableDirectStreaming()
    )
);

var requestJson = Encoding.UTF8.GetString(searchResponse.ApiCall.RequestBodyInBytes);

如果您想查看所有请求和响应,您可能需要在 ConnectionSettings 上设置 DisableDirectStreaming(...) 并配置使用 OnRequestCompleted(...) to print these out 的委托

var defaultIndex = "default_index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

var settings = new ConnectionSettings(pool)
    .DefaultIndex(defaultIndex)
    .PrettyJson()
    .OnRequestCompleted(callDetails =>
    {
        if (callDetails.RequestBodyInBytes != null)
        {
            Console.WriteLine(
                $"{callDetails.HttpMethod} {callDetails.Uri} \n" +
                $"{Encoding.UTF8.GetString(callDetails.RequestBodyInBytes)}");
        }
        else
        {
            Console.WriteLine($"{callDetails.HttpMethod} {callDetails.Uri}");
        }

        Console.WriteLine();

        if (callDetails.ResponseBodyInBytes != null)
        {
            Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
                     $"{Encoding.UTF8.GetString(callDetails.ResponseBodyInBytes)}\n" +
                     $"{new string('-', 30)}\n");
        }
        else
        {
            Console.WriteLine($"Status: {callDetails.HttpStatusCode}\n" +
                     $"{new string('-', 30)}\n");
        }
    });

var client = new ElasticClient(settings);

var searchResponse = client.Search<object>();

这基本上就是.EnableDebugMode() 上的ConnectionSettings 所做的。


如果您希望能够在发出实际请求的情况下查看请求,则可以使用RequestResponseSerializer 序列化请求

var client = new ElasticClient(settings);

ISearchRequest searchRequest = new SearchDescriptor<object>()
    .Query(q => q
        .Match(m => m
            .Field("foo")
            .Query("bar")
        )
    );

var json = client.RequestResponseSerializer.SerializeToString(searchRequest);

使用这种方法,应将请求转换为请求接口以正确序列化,例如SearchDescriptor&lt;T&gt; -> ISearchRequest.

另一种方法是使用InMemoryConnection

var defaultIndex = "default_index";
var settings = new ConnectionSettings(new InMemoryConnection())
    .DefaultIndex(defaultIndex)
    .DisableDirectStreaming();

var client = new ElasticClient(settings);

var response = client.Search<object>(s => s
    .Query(q => q
        .Match(m => m
            .Field("foo")
            .Query("bar")
        )
    )
);

var json = Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);

和以前一样,OnRequestCompleted(...) 可以与这种方法一起使用来捕获所有请求。

【讨论】:

    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多