聚合多个字段而不进行子聚合

时间:2018-05-08 15:23:32

标签: elasticsearch

我的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
          }
        },
        ...
      ]
    }
  }
}

2 个答案:

答案 0 :(得分:0)

在文档中对此进行了一些讨论:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_multi_field_terms_aggregation

基本上,您可以使用脚本来创建一个在查询运行时从每个文档派生的术语(使用所需的任意多个字段),但这会很慢。如果您要进行临时分析,它将很好用。如果您需要以较高的速度满足这些请求,那么您可能希望在模型中创建一个字段,该字段是您感兴趣的两个字段的组合,因此已经为您填充了索引。

使用脚本方法的示例查询:

GET agreements/agreement/_search?size=0
{
    "aggs" : {
        "myAggregationName" : {
            "terms" : {
                "script" : {
                    "source": "doc['owningVendorCode'].value + '|' + doc['region'].value",
                    "lang": "painless"
                }
            }
        }
    }
}

答案 1 :(得分:0)

我知道我应该为此使用composite aggregates