如何将 Elasticsearch Spring Data AggregationsContainer 内容映射到自定义模型?

How to map Elasticsearch Spring Data AggregationsContainer contents to custom model?

我正在使用 Elsaticsearch Spring 数据。我有一个基于 docs 上的示例使用 ElasticsearchOperations 的自定义存储库。我需要一些聚合查询结果,我成功地得到了预期的结果。但我需要将这些结果映射到模型。但目前我无法访问 AggregationsContainer 的内容。

 override fun getStats(startTime: Long, endTime: Long, pageable: Pageable): AggregationsContainer<*>? 
    {
        val query: Query = NativeSearchQueryBuilder()
            .withQuery(QueryBuilders.rangeQuery("time").from(startTime).to(endTime))
            .withAggregations(AggregationBuilders.sum("discount").field("discount"))
            .withAggregations(AggregationBuilders.sum("price").field("price"))
            .withPageable(pageable)
            .build()

        val searchHits: SearchHits<Product> = operations.search(query, Product::class.java)

        return searchHits.aggregations 

    }

我return下面代码的结果:

    val stats = repository.getTotalStats(before, currentTime, pageable)?.aggregations()

结果是:

{
    "asMap": {
        "discount": {
            "name": "discount",
            "metadata": null,
            "value": 8000.0,
            "valueAsString": "8000.0",
            "type": "sum",
            "fragment": true
        },
        "price": {
            "name": "price",
            "metadata": null,
            "value": 9000.0,
            "valueAsString": "9000.0",
            "type": "sum",
            "fragment": true
        }
    },
    "fragment": true
}

如何将以上输出转换为如下所示的预期输出模型?因为我测试了 aggregations() 的内容无法访问并且类型是 Any :

{
    "priceSum":9000.0,
    "discountSum":8000
 }

Elasticsearch RestHighLevelClient 类 中没有用于聚合的数据模型,Spring Data Elasticsearch 中也没有 on。因此,原始 Aggregations 对象返回给调用者(包含在那个 AggregationContainer 中,因为它会随着新的新客户端实现而改变,然后容器将持有不同的对象)。

这个你自己去解析吧,我在另一个问题的答案中有一些东西()。对您来说有趣的是传递聚合的最后一个代码块。您基本上必须遍历元素,将它们转换为适当的类型并对其求值。