2015-12-27 52 views
0

我有以下幾點: 我注意到,在運行的代碼,如果我打印出aggregations.asMap()結束得到(「主體」)。 我越來越: [email protected]cff59fa如何在spring-data-elasticsearch中使用聚合獲得elasticsearch json響應?

打印出 「聚合」 給我:[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響應這種方式,因爲春季數據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,然後使用elasticsearch slowlog文件進行匹配,如果查詢正確的話是瘋狂的! – dy10