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

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

汪臻
2023-03-14

我正在使用Elsaticsearch Spring数据。我有一个自定义存储库,它使用基于文档示例的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
}

如何将上述输出转换为如下所示的预期输出模型?在我测试时,无法访问聚合()的内容,类型为Any:

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

共有1个答案

井镜
2023-03-14

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

你必须自己分析,我在另一个问题的答案中找到了一些东西(https://stackoverflow.com/a/63105356/4393565). 您感兴趣的是传递聚合的最后一个代码块。基本上,您必须迭代元素,将其转换为适当的类型并对其求值。

 类似资料:
  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我需要通过连接3个不同的表来获取6列。我在entity类的顶部将它们声明为NamedNativequery,并且使用了create named query method form JPA。当我尝试fo获取结果集时,我得到的是数组对象列表,而不是POJO类型的对象列表。为了将结果集映射到外部POJO,我应该定义任何外部映射吗?

  • 让我们假设我有以下json 如何在java中创建一个自定义类来映射它?我试过这个班的形状 并且形状是 用Jackson地图绘制器绘制地图 正如预期的那样,给我一个错误: 我想要"0008005"作为字段值而不是字段键,这些值是根据API动态变化的,所以如何映射这个json,有没有其他直接的方法最后一个选项op自定义反序列化?

  • 我从一个xml模式生成java类,对于一个复杂类型,我希望jaxb使用一个现有的类,我有一个外部绑定定制文件。自定义类被解组为正确的,除了该类型的单个属性,该属性从未在java类中填充。 下面是类型/类问题的演示。 模式中定义的内容是: 读取匹配xml文件的代码段是: 在这个xml中阅读: 使用JAXB生成的Thing类(不使用自定义xjb),输出符合预期: 使用只有getters的自定义Thin

  • 问题内容: 有人可以向我展示如何在Hibernate中编写以下SQL并正确获取结果的示例吗? 如果可能的话,我想做的就是将结果放入自己的基类中: 我相信在JPA(使用)中是可能的,但是我还没有弄清楚如何在Hibernate(使用和)中做到这一点。 我试图更好地学习Hibernate,即使这个“简单”查询也令人困惑,无法知道Hibernate以哪种形式返回结果,以及如何将结果映射到我自己的(基)类中

  • 我试图将postgres过程返回的自定义类型数组映射到java 我在postgres中有一个自定义类型为 Hibernate和PostgreSQL中具有UserType的数组-->MappingException Mayer more编写了一个实现sampletype数组的类,但我最终得到了这个异常 原因: 当我试图获取CustomType的数组时,可能会遇到一些问题,无法理解如何为CustomT