2015-12-27 4 views
0

У меня есть следующее: Я замечаю, что в конце запуска кода, если я распечатаю aggregations.asMap(). Get ('subject'); Я получаю: [email protected]cff59faКак получить ответ elsonearch json с использованием скоплений в spring-data-elasticsearch?

печать из "агрегирование" дает мне: [email protected]21d

Я действительно хочу, чтобы весь ответ строки/json, который обычно возвращался, если вы должны завивать на elasticsearch, чтобы получить скопления. Как получить исходный ответ из запроса агрегации? Кроме того, есть ли способ итерации и распечатки того, что находится в этих «обернутых» объектах?

https://github.com/spring-projects/spring-data-elasticsearch/blob/ab7e870d5f82f6c0de236048bd7001e8e7d2a680/src/test/java/org/springframework/data/elasticsearch/core/aggregation/ElasticsearchTemplateAggregationTests.java

@Test 
public void shouldReturnAggregatedResponseForGivenSearchQuery() { 
    // given 
    SearchQuery searchQuery = new NativeSearchQueryBuilder() 
      .withQuery(matchAllQuery()) 
      .withSearchType(COUNT) 
      .withIndices("articles").withTypes("article") 
      .addAggregation(terms("subjects").field("subject")) 
      .build(); 
    // when 
    Aggregations aggregations = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() { 
     @Override 
     public Aggregations extract(SearchResponse response) { 
      return response.getAggregations(); 
     } 
    }); 
    // then 
    System.out.println(aggregations); // gives me some cryptic InternalAggregations object, how do I get to the raw JSON normally returned by elasticsearch? 
    System.out.println(aggregations.asMap().get("subjects")); // gives me some StringTerms object I have no idea how to iterate over to get results 
} 

ответ

1

Вы не можете получить сырье ответ JSON таким образом, так как Spring Data Elasticsearch будет заботиться о разборе это для вас, это все дело.

Если вам нужно разобрать эти ведра, вы можете сделать это так легко:

... 
StringTerms subjects = aggregations.asMap().get("subjects"); 
for (Terms.Bucket bucket : subjects.getBuckets()) { 
    String key = bucket.getKey(); 
    long docCount = bucket.getDocCount(); 
    // do something with the key and the doc count 
} 

Если вы действительно хотите, чтобы увидеть JSON возвращается, что вы можете сделать, это переписать разобранное агрегирование объект в JSON, используя сериализацию, но это не будет действительно полезно:

InternalAggregations aggregations = ...; 
XContentBuilder jsonBuilder = JsonXContent.contentBuilder(); 
aggregations.toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS); 
String rawJson = jsonBuilder.string(); 
+0

есть что-нибудь, что позволяет мне пройти в необработанном формате JSON без необходимости использовать все эти строитель, чтобы сделать запрос? – Rolando

+0

Я так не думаю. Весь смысл этого API заключается в том, чтобы упростить сбор запросов без необходимости использования JSON. – Val

+0

@ Rolando Я наткнулся на шаблоны elasticsearch и, похоже, вот что я скоро буду использовать. Попытка выяснить JAVA API, а затем использовать файл ellogearch slowlog, чтобы соответствовать, если запрос был прав, сумасшедший! – dy10