【问题标题】:Aggregate over multiple fields without subaggregation聚合多个字段而不进行子聚合
【发布时间】:2018-11-06 23:59:54
【问题描述】:

我的 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 排序。这是我想要的结果:

{
  "aggregations": {
    "sales_by_article_and_submodel": {
      "buckets": [
        {
          "key": "1911412",
          "total_amount": {
            "value": 51512.200000000004
          }
        },
        ...
      ]
    }
  }
}

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    这里的文档中有一些讨论: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"
                    }
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2010-12-20
        • 1970-01-01
        • 2020-02-18
        • 2021-05-11
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 2019-03-30
        • 1970-01-01
        相关资源
        最近更新 更多