如何通过API从Elasticsearch查询不同的记录

时间:2018-10-01 13:53:12

标签: java spring-boot elasticsearch

我有以下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)有用?还是有其他方法可以检索不同的记录?

1 个答案:

答案 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());
}

具有与控制台中完全相同的结果。