复合弹性搜索桶仅在两个源都存在的情况下

Composite elastic search buckets only those cases where both source exist

我有一个 elasticsearch 查询,它有一个像这样的聚合:

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

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

最初的意图是 firstfield 和 secondfield 具有相同类型的值,并计算 ("bucketing") 在 firstfield 或 secondfield 中具有例如 ABC 的项目数。这不是分桶,因为这意味着一个文档可以进入两个桶(如果 firstfield 或 secondfield 不同)。但是继续解决我当前的问题。因此,正如我所知道的那样,这种聚合只是简单地具有 firstfield + secondfield 分桶,这对我来说也足够了。问题是,在那些情况下,例如,secondfield 丢失,没有桶是 firstfield: something, secondfield: empty。所以很多元素都从分桶中出来了。

文档说必须定义所有字段: 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"
                    }
                }
            }
        }
    }

根据我的口味,它的解析结果有点混乱。

在复合聚合中,您可以使用 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
        }
      ]