仅在同时存在两个来源的情况下才使用复合弹性搜索桶

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

我有一个Elasticsearch查询,它具有这样的聚合:

"aggs" : {
        "my_buckets": {
            "composite" : {
                "sources" : [
                    { "abc.firstfield": 
                        { "terms" :
                            { "field": "abc.firstfield" }

                        }
                    },
                    { "abc.secondfield": 
                        { "terms" :
                            { "field": "abc.secondfield"  }
                        }
                    }
                ], "size": 10000
            }
        }
     }

最初的意图是,第一字段和第二字段都具有相同的值,并且对(例如,存储)第一字段或第二字段中具有ABC的项目数进行计数(“存储”)。不过,这并不是一个存储桶,因为这意味着文档可以放入两个存储桶(如果firstfield或secondfield不同)。但是请继续解决我当前的问题。因此,据我所知,这种聚合只是具有firstfield + secondfield存储桶,对我来说也足够了。问题是,在某些情况下,例如,缺少秒字段,就没有第一字段:某物,第二字段:空的存储桶。因此,很多元素都无法使用。

文档说必须定义所有字段:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-composite-aggregation.html

我该怎么做才能得到类似的结果,但像是像桶装一样

{
   "key": {
      "abc.firstfield": "abcd"
   },
   "doc_count": 123
}

我只看到了这种可能的方法,但这意味着我必须确保firstfield始终可用:

"aggs": {
        "first": {
            "terms": {
                "size": 10000,
                "field": "abc.firstfield"
            },
            "aggs": {
                "second": {
                    "terms": {
                        "size": 10000,
                        "field": "abc.secondfield"
                    }
                }
            }
        }
    }

而且我的口味解析起来有点混乱。

amazon-web-services elasticsearch bucket
1个回答
0
投票
在复合聚合中,您可以使用missing_bucket: true

{ "aggs": { "my_buckets": { "composite": { "sources": [ { "field1": { "terms": { "field": "field1.keyword", "missing_bucket": true } } }, { "field2": { "terms": { "field": "field2.keyword", "missing_bucket": true } } } ], "size": 10000 } } } }

结果:

"buckets" : [ { "key" : { "field1" : "abc", "field2" : "xyz" }, "doc_count" : 1 }, { "key" : { "field1" : "def", "field2" : null }, "doc_count" : 1 } ]

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