有没有办法在弹性搜索中对字段执行多个非嵌套聚合?我希望我的所有聚合都是孩子或父母,但在同一级别。
{
"size": 0,
"aggs": {
"one": {
"terms": {
"field": "A"
},
"aggs": {
"two": {
"terms": {
"field": "B"
},
"aggs": {
"three": {
"terms": {
"field": "C"
}
}
}
}
}
}
}
}
答案 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字段。