如何在elasticsearch中的嵌套聚合中存储空和非空字段?

use*_*783 2 elasticsearch elasticsearch-aggregation

我在elasticsearch中有以下一组嵌套子聚合(field2是field1的子聚合,field3是field2的子聚合)。然而事实证明,field3 的术语聚合不会对没有 field3 的文档进行存储桶。

我的理解是,除了 field3 的术语查询之外,我还必须使用 Missing 子聚合查询来对这些查询进行存储。

但我不确定如何将其添加到下面的查询中以将两者都存储起来。

{
  "size": 0,
  "aggregations": {
    "f1": {
      "terms": {
        "field": "field1",
        "size": 0,
        "order": {
          "_count": "asc"
        },
        "include": [
          "123"
        ]
      },
      "aggregations": {
        "field2": {
          "terms": {
            "field": "f2",
            "size": 0,
            "order": {
              "_count": "asc"
            },
            "include": [
              "tr"
            ]
          },
          "aggregations": {
            "field3": {
              "terms": {
                "field": "f3",
                "order": {
                  "_count": "asc"
                },
                "size": 0
              },
              "aggregations": {
                "aggTopHits": {
                  "top_hits": {
                    "size": 1
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*keB 6

在版本 2.1.2 及更高版本中,您可以使用missingtermsaggregation 的参数,它允许您为缺少该字段的文档指定默认值。(仅供参考,该missing参数从 2.0 开始可用,但有一个错误导致它无法在子聚合上工作,这就是您在此处使用它的方式。)

     ...
     "aggregations": {
        "field3": {
          "terms": {
            "field": "f3",
            "order": {
              "_count": "asc"
            },
            "size": 0,
            "missing": "n/a"     <----- provide a default here
          },
          "aggregations": {
            "aggTopHits": {
              "top_hits": {
                "size": 1
              }
            }
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用的是 2.x 之前的 ES 集群,则可以使用与聚合相同深度的missing聚合field3来存储缺少“f3”的文档,如下所示:

     ...
     "aggregations": {
        "field3": {
          "terms": {
            "field": "f3",
            "order": {
              "_count": "asc"
            },
            "size": 0
          },
          "aggregations": {
            "aggTopHits": {
              "top_hits": {
                "size": 1
              }
            }
          }
        },
        "missing_field3": {
          "missing" : {
            "field": "f3"
          },
          "aggregations": {
            "aggTopMissingHit": {
              "top_hits": {
                "size": 1
              }
            }
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)