java - 解析嵌套聚合查询响应

标签 java json elasticsearch

这是嵌套 ES 聚合查询的结果。我需要解析此响应并将其转换为新的 JSON 格式。从以下 JSON 中,我唯一感兴趣的字段是值 key_as_a_string 以及每个键的苹果和橙子的值。

"aggregations": {
    "Inner_aggregation": {
        "doc_count": 366,
        "Hours_aggregation": {
            "doc_count": 366,
            "by_day": {
                "buckets": [
                    {
                        "key_as_string": "2016-01-11",
                        "key": 1452556800000,
                        "doc_count": 1,
                        "Apples": {
                            "value": 5
                        },
                        "Oranges": {
                            "value": 3
                        }
                    },
                    {
                        "key_as_string": "2016-01-12",
                        "key": 1452556800000,
                        "doc_count": 1,
                        "Apples": {
                            "value": 43
                        },
                        "Oranges": {
                            "value": 2
                        }
                    },
                    .........,
                    .........
                ]
            }
        }
    }
 }
}

我可以使用 Jackson objectmapper 或使用 sr.getAggregations().get("histogram_name") 方法解析它,然后迭代集合。想知道是否有简单的方法。

所需的 JSON 格式

{
    "Results": [{
        "key_as_string": "2016-01-11",
        "Apple_to_Orange_Ratio": 0.112
    }, {
        "key_as_string": "2016-01-12",
        "Apple_to_Orange_Ratio": 0.12
    }]
}

通过简单除以苹果和橙子的数量即可得出比率。

最佳答案

当您的 Java 表示与复杂的嵌套结构有很大不同时,将 json 直接映射到 Java 类可能没有帮助。您可以动态处理此类数据。

这是一种使用 Java 8 和库处理此类数据的方法 Dynamics .

我们将 json 解析为映射/列表结构,并将其包装为动态实例

Map jsonMap = new ObjectMapper().readValue(exampleJson, Map.class);
Dynamic jsonData = Dynamic.from(jsonMap);

这为我们提供了一种空安全且流畅的方式来处理这种嵌套结构。在本例中,我们对桶感兴趣,如果能够轻松获得这些桶就太好了。

List<MyResult> results = jsonData
    .dget("aggregations.Inner_aggregation.Hours_aggregation.by_day.buckets")
    .children()
    .map(bucket -> new MyResult(bucket))
    .collect(toList());

现在我们的类 MyResult 可以处理存储桶数据,它也是一个动态实例。

public class MyResult {
    private final Dynamic bucket;

    public Result(Dynamic bucket) {
        this.bucket = bucket;
    }

    public String getKey() {
        return bucket.get("key_as_string").asString();
    }

    public double getAppleToOrangeRatio() {
        double apples = bucket.dget("Apples.value").convert().intoDouble();
        double oranges = bucket.dget("Oranges.value").convert().intoDouble();
        return oranges / apples;
    }
}

我们可以访问比率。

double appleToOrangeRatio = results.get(0).getAppleToOrangeRatio();
// 0.6

参见https://github.com/alexheretic/dynamics获取源代码、文档和示例。

关于java - 解析嵌套聚合查询响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39995977/

相关文章:

java - xPath 表达式 : Getting elements even if they don't exist

mongodb - Elasticsearch嵌套查询

java - 我试图在每次按下按钮时更改 JPanel 的背景颜色

java - 如何关闭 JEditorPane 中的自动换行?

java - 在 Amazon Elasticbeanstalk 中运行 netty 应用程序

django - 序列化ManyToMany字段Drf干草堆

elasticsearch - 基巴纳。通过匹配来自另一个过滤器的值来过滤记录

javascript - 在工厂内获取 json 数据的 Angular 指南

c# - 必需的数字参数在不包含在 JSON 中时默认为 0

python - Json 循环的列表索引超出范围错误