当前位置: 首页 > 知识库问答 >
问题:

如何在sping-data-elasticsearch中使用聚合获取elasticsearch json响应?

董高洁
2023-03-14

我有以下内容:我注意到在运行代码的末尾,如果我打印出aggregations.asMap(). get('subject');我得到:org.elasticsearch.search.aggregations.bucket.terms.StringTerms@6cff59fa

打印出“聚合”给了我:org.elasticsearch.search.aggregations.InternalAggregations@65cf321d

我真正想要的是整个字符串/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
}

共有2个答案

越英范
2023-03-14

将EsRequest的大小设置为零

获取Esresponse.to字符串()

字符串转换为Json

从Json获取聚合字段。

娄利
2023-03-14

您无法以这种方式获得原始JSON响应,因为Spring Data 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被返回,您可以做的是使用序列化将解析的Aggregations对象重新写入JSON,但这并没有真正的帮助:

InternalAggregations aggregations = ...;
XContentBuilder jsonBuilder = JsonXContent.contentBuilder();
aggregations.toXContent(jsonBuilder, ToXContent.EMPTY_PARAMS);
String rawJson = jsonBuilder.string();
 类似资料:
  • 我有一套文件。每个文档有两个字段—“代码”和“状态”。我的mongodb集合包含以下文档: 我想按每个代码的状态查找计数。我想要的输出如下所示: 如何使用spring data mongodb实现这一点?我对mongodb很陌生。 更新我已成功编写mongodb查询。这是: 有人能帮助您在spring data mongodb中编写此查询吗?

  • 我使用聚合从嵌套字段收集数据并卡住了一点 文件示例: ES允许通过rectangle.attributes._id来分组数据,但是有没有办法让一些“其他”桶把没有添加到任何组中的文档放在那里?或者,也许有一种方法可以通过创建查询来为文档创建桶。我认为桶将是完美的,因为我需要使用“其他”文档进行进一步的聚合。或者也许有一些很酷的解决方法 我使用这样的查询进行聚合 然后得到这个结果 这样的结果将是完美

  • 我必须在弹性搜索中使用聚合执行搜索。因为刻面将在不久的将来被删除,所以我不能使用刻面。 当然,我被鼓励使用聚合。 下面的代码给了我想要的输出: 聚合聚合=elasticsearch chTemplate.query(搜索查询,新的结果提取器(){@覆盖公共聚合提取(搜索响应响应){返回response.get聚合(); 但问题是,它成为了我的弹性搜索查询之外的第二个查询,这使得它变得非常慢。 我正

  • 我希望从ES中获得聚合结果,例如,对于与术语匹配的文档,

  • 我在Mongodb中有一个如下所示的文档: 现在,我想转到一个基于特定“”的文档,对于该文档,我想转到“时间表”列表,其中对于几个特定日期(不仅是一个日期,而且是多个日期),我想将状态更新为“已预订”。我浏览了这个链接,如何使用过滤的位置运算符和ArrayFilter应用更新,但是在MongoTemplate类中,方法不接受参数。有人能帮忙吗 我出去。真的会感谢任何建议。谢谢。 注意:我使用的是s

  • 我使用的是MongoDB,我必须在spring数据mongo DB中使用$date的聚合查询。这是我的用户收藏。 现在我必须使用MongoTemplate在spring data mongodb中编写这个查询。我是使用聚合的新手。他们是任何简单的方法来使用它。请帮忙 谢谢你。