【问题标题】:How to map Elasticsearch Spring Data AggregationsContainer contents to custom model?如何将 Elasticsearch Spring Data AggregationsContainer 内容映射到自定义模型?
【发布时间】:2021-12-30 09:19:56
【问题描述】:

我正在使用 Elsaticsearch Spring Data。我有一个自定义存储库,它根据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 

    }

我返回以下代码的结果:

    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
 }

【问题讨论】:

    标签: kotlin elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

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

    你必须自己解析这个,我在另一个问题(https://stackoverflow.com/a/63105356/4393565)的答案中有一些东西。对您来说有趣的是传递聚合的最后一个代码块。您基本上必须遍历元素,将它们转换为适当的类型并评估它们。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 2019-04-09
      • 2017-05-18
      • 2016-07-18
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多