多个非嵌套聚合

时间:2016-05-09 12:07:53

标签: elasticsearch field aggregation term

有没有办法在弹性搜索中对字段执行多个非嵌套聚合?我希望我的所有聚合都是孩子或父母,但在同一级别。

{
    "size": 0,
    "aggs": {
        "one": {
            "terms": {
                "field": "A"
            },
            "aggs": {
                "two": {
                    "terms": {
                        "field": "B"
                    },
                    "aggs": {
                        "three": {
                            "terms": {
                                "field": "C"
                            }
                        }
                    }
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

ElasticSearch有三种类型的聚合。

Bucket - 允许您形成不同类型的“存储桶”。术语(在not_analyzed字符串字段上),时间间隔(如果您的数据具有“时间戳”类型的列,则为date_histogram聚合),地理形状(如果您的数据具有经度/纬度,则为地理散列聚合)。

指标 - 在存储桶或外部存储桶中应用的总和,平均值,最小值,最大值和数值聚合(在顶层)

管道 - 这是实验性的。将一个聚合的输出提供给另一个聚合。

您可以在同一级别上拥有多个存储桶聚合(顶级“aggs”元素或嵌套的“aggs”在其他存储桶聚合中)。您还可以将桶聚合嵌套在彼此内。

对于度量标准聚合,您可以将它们放在顶级“aggs”元素或另一个桶聚合内。

在您的示例中,如果A,B和C是String类型和not_analyzed字段。您可以执行诸如。

之类的桶聚合
{
  "size": 0,
  "aggs": {
    "one": {
      "terms": {
        "field": "A"
      },
      "aggs": {
        "two": {
          "terms": {
            "field": "B"
          }
        }
      }
    },
    "aggs": {
      "three": {
        "terms": {
          "field": "C"
        }
      }
    }
  }
}

“one”和“three”是顶级的术语聚合。 “two”嵌套在“one”中。

另外,如果您的文档中有一些数字字段。例如说D和E.你想要计算A的每个桶和B的每个桶中的D的总和,B的每个桶中的E的总和。也是C的每个桶中的D的总和。你可以做所有这些同时在一个查询中,单次传递...

{
  "size": 0,
  "aggs": {
    "one": {
      "terms": {
        "field": "A"
      },
      "aggs": {
        "sumOfDWithinA": {
          "sum": {
            "field": "D"
          }
        },
        "two": {
          "terms": {
            "field": "B"
          },
          "aggs": {
            "sumOfDWithinB": {
              "sum": {
                "field": "D"
              }
            },
            "sumOfEWithinB": {
              "sum": {
                "field": "E"
              }
            }
          }
        }
      }
    },
    "aggs": {
      "three": {
        "terms": {
          "field": "C"
        },
        "aggs": {
          "sumOfDWithinC": {
            "sum": {
              "field": "D"
            }
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

所以我发现术语聚合不支持从同一文档中的多个字段中收集术语。此外,有两种方法可用于在多个字段中执行术语聚合:脚本和映射时的copy_to字段。