Получить необработанный запрос от клиента NEST

Можно ли получить необработанный поисковый запрос от клиента NEST?

var result = client.Search<SomeType>(s => s
                .AllIndices()
                .Type("SomeIndex")
                .Query(query => query
                    .Bool(boolQuery => BooleanQuery(searchRequest, mustMatchQueries)))
                );

Я бы очень хотел отладить, почему я получаю определенные результаты.

Ответы

Ответ 1

Методы для этого, кажется, меняются с каждой основной версией, отсюда и запутанное количество ответов. Если вы хотите, чтобы это работало в NEST 6.x, и хотите, чтобы десериализованный запрос ДО того, как он действительно отправил, это довольно просто:

var json = elasticClient.RequestResponseSerializer.SerializeToString(request);

Если вы отлаживаете в Visual Studio, удобно поставить точку останова сразу после этой строки, а когда вы нажмете ее, наведите курсор на переменную json выше и нажмите увеличительное стекло. Вы получите хороший отформатированный вид JSON.

Ответ 2

Вы можете получить сырой запрос json из RequestInformation:

var rawQuery = Encoding.UTF8.GetString(result.RequestInformation.Request);

Или включить трассировку на свой объект ConnectionSettings, поэтому NEST будет печатать каждый запрос для вывода трассировки

var connectionSettings = new ConnectionSettings(new Uri(elasticsearchUrl));
connectionSettings.EnableTrace(true);
var client = new ElasticClient(connectionSettings); 

Ответ 3

В ElasticSearch 5.x свойство RequestInformation.Request не существует в ISearchResponse<T>, но, как и в приведенном здесь ответе, вы можете сгенерировать необработанный запрос JSON с помощью Серийного клиента Elastic Client и SearchDescriptor. Например, для данного поискового запроса NEST:

var results = elasticClient.Search<User>(s => s
    .Index("user")
    .Query(q => q                    
        .Exists(e => e
            .Field("location")
        )
    )            
);

Вы можете получить необработанный запрос JSON следующим образом:

SearchDescriptor<User> debugQuery = new SearchDescriptor<User>()
    .Index("user")
    .Query(q => q                    
        .Exists(e => e
            .Field("location")
        )
    )
;

using (MemoryStream mStream = new MemoryStream())
{
    elasticClient.Serializer.Serialize(debugQuery, mStream);
    string rawQueryText = Encoding.ASCII.GetString(mStream.ToArray());
}

Ответ 4

Для NEST/Elasticsearch.NET v6.0.2 используйте свойство ApiCall объекта IResponse. Вы можете написать удобный метод расширения следующим образом:

public static string ToJson(this IResponse response)
{
    return Encoding.UTF8.GetString(response.ApiCall.RequestBodyInBytes);
}

Или, если вы хотите зарегистрировать все запросы, сделанные в Elastic, вы можете перехватить ответы с объектом соединения:

var node = new Uri("https://localhost:9200");
var pool = new SingleNodeConnectionPool(node);
var connectionSettings = new ConnectionSettings(pool, new HttpConnection());
connectionSettings.OnRequestCompleted(call =>
{
    Debug.Write(Encoding.UTF8.GetString(call.RequestBodyInBytes));
});

Ответ 5

Перед выполнением запроса из Nest Query - для Nest 5.3.0:

var stream = new System.IO.MemoryStream();
elasticClient.Serializer.Serialize(query, stream );
var jsonQuery = System.Text.Encoding.UTF8.GetString(stream.ToArray());

Ответ 6

на гнезде версии 6

connextionString.DisableDirectStreaming();

то на response.DebugInformation вы можете увидеть всю информацию.

Ответ 7

Использовать result.ConnectionStatus.Request.

Ответ 8

Как насчет использования Fiddler?! :)