2015-05-18 7 views
1

Для целей отладки, мне нужно знать, какой запрос spring-data-elasticsearch отправляется в кластер ElasticSearch. Я попытался вызвать метод toString на объекте SearchQuery и не возвращает то, что мне нужно.Получение строкового запроса (JSON) из объекта SearchQuery

Что я делаю в Java (с использованием пружинного данных-elasticsearch) является:

private FilterBuilder getFilterBuilder(String id) { 
    return orFilter(
     termFilter("yaddayaddayadda.id", id), 
     termFilter("blahblahblah.id", id) 
    ); 
} 


SearchQuery sq = NativeSearchQueryBuilder() 
    .withQuery(new MatchAllQuery()) 
    .withFilter(fb) 
    .build(); 

И я ожидаю, чтобы вернуть что-то вроде этого простого запроса, выполненный в ES кластера REST API возвращает:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "or": [ 
        { 
         "term": { 
          "yaddayaddayadda.id": "9" 
         } 
        }, 
        { 
         "term": { 
          "blahblahblah.id": "9" 
         } 
        } 
       ] 
      } 
     } 
    } 
} 

Заранее благодарим!

ответ

4

Одним из способов достижения этого является регистрация запросов на стороне ES/server в файл медленного журнала. Откройте elasticsearch.yml конфигурационный файл и к нижней раскомментировать/изменить две строки ниже:

... 
index.search.slowlog.threshold.query.info: 1ms 
... 
index.search.slowlog.threshold.fetch.info: 1ms 
... 

Преимущество этого решения заключается в том, что любой клиент технологии вы используете для запроса сервера ES (Spring Data, Ruby, Browser , Javascript и т. Д.), Вы сможете отправлять и отлаживать свои запросы в одном месте.

+0

Я попробовал это, и это не является оптимальным решением, так как запросы, которые я получил, были преобразованы в двоичную форму в журналы. Так что мой запрос в журналах выглядел так: '{ "от": 0, "размер": 20, "query_binary": "eyAicXVlcnkiOiB7ICJxdWVyeV9zdHJpbmciIDogeyAiZmllbGRzIiA6IFsicG9ydE5hbWUiLCAiY291bnRyeU5hbWUiXSwgInF1ZXJ5IjoiKmUqIn19LCAic29ydCIgOiBbeyAicG9ydElkIiA6IHsgIm9yZGVyIjogIkFTQyIgfX1dfQ =="}'. Хотя, когда я запускал этот запрос, я получил те же результаты, но не могу отлаживаться. –

0

Интерфейс SearchQuery имеет метод getQuery() и getFilter() для получения необходимой информации.

 System.out.println(searchQuery.getQuery()); 
     System.out.println(searchQuery.getFilter()); 

Надеюсь, это поможет.

0

При использовании SearchRequest или SearchSourceBuilder, вызывая .toString() метод на их примере поможет вам реально JSON запрос:

SearchRequest searchRequest = new SearchRequest("index"); 
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 

// building the query 
// ... 

searchSourceBuilder.query(query); 
searchRequest.source(searchSourceBuilder); 

System.out.println(searchSourceBuilder.toString()); // prints json query 
System.out.println(searchRequest.toString()); // prints json query + other information 
Смежные вопросы