我有以下Elasticsearch获取查询:
GET /...
{
"size":"0",
"aggs" : {
"locations" : {
"terms" : { "field" : "locationid.keyword" }
}
}
}
可以在控制台上正常工作。但目标是通过Java API使该查询具有编程性。我将Spring Boor与ElasticSearchRepository结合使用:
@Query("{\"size\" : \"0\" , \"aggs\" : {\"locations\" : {\"terms\" : { \"field\" : \"locationid.keyword\" }}}}")
List<Bucket> findDistinctLocationids();
所以,现在我的问题是以下异常:
ParsingException[size] query malformed, no start_object after query name
该错误消息很清楚,但是在这种情况下,使用哪种注释或注释(而不是@Query)有用?还是有其他方法可以检索不同的记录?
答案 0 :(得分:0)
因此,经过数小时的尝试和错误,我发现了基于@Vals注释的解决方案。 首先,我设置了一个搜索,该搜索为我提供了SearchResponse:
final SearchResponse sr = client.prepareSearch("index").setTypes("type").setQuery(QueryBuilders.matchAllQuery()).setSearchType(SearchType.DEFAULT).addAggregation(
AggregationBuilders.terms("field").field("locationid.keyword")).execute().actionGet();
从此响应中,我收到一个Terms对象,该对象将结果保存在其Bucktes中:
final Terms locations = sr.getAggregations().get("field");
for (final Terms.Bucket entry : locations.getBuckets()) {
System.out.println(entry.getKey());
System.out.println(entry.getDocCount());
}
具有与控制台中完全相同的结果。