我正在使用elasticsearch-java api 客户端(8.10.3)并面临一个小问题,我希望有人之前已经遇到过这个问题。
我正在尝试对可能不包含我尝试聚合的字段的文档执行最小聚合。如果与我的查询匹配的所有文档不包含我尝试聚合的字段,则“value”:null将通过在 setupSingleMetricAggregateBaseDeserializer SingleMetricAggregateBase 类中定义的 JsonpDeserializer.doubleOrNullDeserializer(0) 反序列化为 0
在我看来,这种方法可能会导致我们的产品混乱,我正在寻找一种方法来避免这种反序列化,但到目前为止我还没有找到。在这种情况下返回 null 是可以的,我更愿意实现这一点。
有什么想法吗? :)
我还尝试添加值计数聚合,以确定我尝试聚合的字段中是否有值,并且它有效,但在我看来有点奇怪。
您可以通过
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 代码