【问题标题】:How to get the elasticsearch json response using aggregations in spring-data-elasticsearch?如何使用 spring-data-elasticsearch 中的聚合获取 elasticsearch json 响应?
【发布时间】:2016-04-01 16:24:41
【问题描述】:

我有以下几点: 我注意到在运行代码结束时,如果我打印出 aggregations.asMap().get('subjects'); 我正进入(状态: 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
}

【问题讨论】:

    标签: java elasticsearch spring-data-elasticsearch


    【解决方案1】:

    您无法以这种方式获取原始 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();
    

    【讨论】:

    • 有什么东西可以让我传入原始 JSON 而不必使用所有这些构建器来进行查询?
    • 我不这么认为。这个 API 的重点是让构建查询变得更容易,而无需处理 JSON。
    • @Rolando 我偶然发现了 elasticsearch 模板,看起来我很快就会使用它。试图找出 JAVA API,然后使用 elasticsearch slowlog 文件来匹配查询是否正确,这太疯狂了!
    • 假设这与 3.x spring-data-elasticsearch 相关,我是否正确? (我正在尝试找出 4.0 中的 docCounts。)
    【解决方案2】:

    将 EsRequest 的大小设置为零

    获取 Esresponse.toString()

    将字符串转换为 Json

    从 Json 中获取聚合字段。

    【讨论】:

    • 请更具体地说明您想要什么。在您的问题中使用标签来具体说明您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2016-06-25
    • 2021-11-23
    • 2021-03-06
    相关资源
    最近更新 更多