java - 如何通过 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?或者有没有其他方法可以检索不同的记录?
解决方案
因此,经过几个小时的尝试和错误,我找到了基于@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());
}
给出的结果与控制台中的结果完全相同。
推荐阅读
- node.js - 如何在节点服务器上创建结构对象?
- aframe - 实体的定向音频
- javascript - 创建自定义 EventEmitter 时不需要调用 .emit 吗?
- processing - 在 P5.js 中使用 loadBytes 的奇怪行为
- java - Java - ServiceLoader - Intellij 找不到实现类文件
- python - Python - 在where子句中动态传递产品名称
- python-3.x - 在新的 python 程序文件中从套接字编程中读取客户端文件的结果
- r - 在 tibble 的不同级别应用函数
- firebase - React Native with Firebase:任何人都可以看到电子邮件格式不正确的地方吗?
- rdf - 如何使用任何 owl 本体映射大型数据文件