首页 > 解决方案 > 如何通过 API 从 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?或者有没有其他方法可以检索不同的记录?

标签: javaspring-bootelasticsearch

解决方案


因此,经过几个小时的尝试和错误,我找到了基于@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();

从这个响应中,我收到一个条款对象,该对象将结果保存在它的 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());
}

给出的结果与控制台中的结果完全相同。


推荐阅读