Elasticsearch Java Api 客户端单指标聚合反序列化器

问题描述 投票:0回答:1

我正在使用elasticsearch-java api 客户端(8.10.3)并面临一个小问题,我希望有人之前已经遇到过这个问题。

我正在尝试对可能不包含我尝试聚合的字段的文档执行最小聚合。如果与我的查询匹配的所有文档不包含我尝试聚合的字段,则“value”:null将通过在 setupSingleMetricAggregateBaseDeserializer SingleMetricAggregateBase 类中定义的 JsonpDeserializer.doubleOrNullDeserializer(0) 反序列化为 0

https://github.com/elastic/elasticsearch-java/blob/main/java-client/src/main/java/co/elastic/clients/elasticsearch/_types/aggregations/SingleMetricAggregateBase.java

在我看来,这种方法可能会导致我们的产品混乱,我正在寻找一种方法来避免这种反序列化,但到目前为止我还没有找到。在这种情况下返回 null 是可以的,我更愿意实现这一点。

有什么想法吗? :)

我还尝试添加值计数聚合,以确定我尝试聚合的字段中是否有值,并且它有效,但在我看来有点奇怪。

elasticsearch elasticsearch-java-api elasticsearch-java-api-client
1个回答
0
投票

您可以通过

exist
查询过滤没有字段的文档

样本文件

POST /filter_without_field/_bulk
{"create":{"_id":1}}
{"comment":"document with field","field": 1}
{"create":{"_id":2}}
{"comment":"document without field"}
{"create":{"_id":3}}
{"comment":"document with field","field": 10}

使用过滤器和聚合进行查询

GET /filter_without_field/_search?filter_path=aggregations
{
    "query": {
        "bool": {
            "filter": [
                {
                    "exists": {
                        "field": "field"
                    }
                }
            ]
        }
    },
    "aggs": {
        "min_field_value": {
            "min": {
                "field": "field"
            }
        }
    }
}

回应

{
    "aggregations" : {
        "min_field_value" : {
            "value" : 1.0
        }
    }
}

或者你可以使用缺失的参数和一个很大的数字

POST /filter_without_field/_search?filter_path=aggregations
{
    "aggs": {
        "min_field_value": {
            "min": {
                "field": "field",
                "missing": 1000
            }
        }
    }
}

反应是一样的

将喜爱的查询转换为 Java 代码

© www.soinside.com 2019 - 2024. All rights reserved.