我的ElasticSearch中有文档,有两个字段。我想在这些组合中构建聚合,类似于SQL GROUP BY field_A,field_B,并且每个现有组合获得一行。我到处读到我应该使用子聚集。
{
"aggs": {
"sales_by_article": {
"terms": {
"field": "catalogs.article_grouping",
"size": 1000000,
"order": {
"total_amount": "desc"
}
},
"aggs": {
"total_amount": {
"sum": {
"script": "Math.round(doc['amount.value'].value*100)/100.0"
}
},
"sales_by_submodel": {
"terms": {
"field": "catalogs.submodel_grouping",
"size": 1000,
"order": {
"total_amount": "desc"
}
},
"aggs": {
"total_amount": {
"sum": {
"script": "Math.round(doc['amount.value'].value*100)/100.0"
}
}
}
}
}
}
},
"size": 0
}
以下简化结果:
{
"aggregations": {
"sales_by_article": {
"buckets": [
{
"key": "19114",
"total_amount": {
"value": 426794.25
},
"sales_by_submodel": {
"buckets": [
{
"key": "12",
"total_amount": {
"value": 51512.200000000004
}
},
...
]
}
},
...
]
}
}
}
然而,问题在于订购不是我想要的。在这种特殊情况下,它首先根据每篇文章的total_amount对文章进行排序,然后在文章中根据每个子模型的total_amount对子模型进行排序。但是,我想要实现的只是具有最深层次并获得文章和子模型组合的聚合,按此组合的total_amount排序。这是我想要的结果:
{
"aggregations": {
"sales_by_article_and_submodel": {
"buckets": [
{
"key": "1911412",
"total_amount": {
"value": 51512.200000000004
}
},
...
]
}
}
}
答案 0 :(得分:0)
基本上,您可以使用脚本来创建一个在查询运行时从每个文档派生的术语(使用所需的任意多个字段),但这会很慢。如果您要进行临时分析,它将很好用。如果您需要以较高的速度满足这些请求,那么您可能希望在模型中创建一个字段,该字段是您感兴趣的两个字段的组合,因此已经为您填充了索引。
使用脚本方法的示例查询:
GET agreements/agreement/_search?size=0
{
"aggs" : {
"myAggregationName" : {
"terms" : {
"script" : {
"source": "doc['owningVendorCode'].value + '|' + doc['region'].value",
"lang": "painless"
}
}
}
}
}
答案 1 :(得分:0)
我知道我应该为此使用composite aggregates。