Получить необработанный запрос от клиента 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?! :)