2015-03-09 8 views
18

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

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

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

+0

возможно дубликат [есть способ десериализации Elasticsearch поиска Nest запроса?] (http://stackoverflow.com/questions/23703570/is-there-a-way-to-deserialize-elasticsearch-nest-search-query) – bittusarkar

+0

Да, это дубликат. Будет флаг. –

ответ

19

Вы можете получить сырой 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

Если вам нужен запрос _before_, он отправляется: 'Encoding.UTF8.GetString (elasticClient.Serializer.Serialize (query))' – bushed

+0

result не имеет свойства RequestInformation, мне нужно добавить некоторые зависимость от доступа к нему? –

+4

@ RicardoSilva, возможно, вы используете NEST 2.x. и ответ был написан с учетом версии 1.x. Проверьте [это] (http://stackoverflow.com/questions/35554890/nest-2-0-enable-trace/35555214#35555214) один. – Rob

3

Использование result.ConnectionStatus.Request.

+0

Я пробовал это, но в массиве байтов не было данных. У вас есть пример того, как вы его используете? –

+0

Нет в реальном коде, но я обычно использую его для отладки запросов в visual studio. Попробуйте установить точку останова на 'result =', затем сделайте один шаг, а затем посмотрите, что вы получили в результате. ConnectionStatus. – rkrahl

+3

ConnectionStatus не существует в ISearchResponse: \ – cegprakash

6

Перед выполнением запроса, из гнезда Запрос - For Nest 5.3.0:

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

Принятый ответ не помог мне для этой работы. ES6 –

8

In ElasticSearch 5.x, свойство RequestInformation.Request не существует в ISearchResponse<T>, но similar to the answer provided here вы можете сгенерировать необработанный запрос 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()); 
}