2

在 Elasticsearch 2.0.0 上,我试图按terms给定术语的最高命中数对多桶聚合上的桶进行排序。

这是一个让事情更清楚的例子。假设我们有以下代表客户购买的数据集:

[{
  "id": "95aee6b0-9c41-11e5-8994-feff819cdc9f",
  "name": "Ingrid Bergman",
  "channel": "WEB",
  "productId": 3124,
  "totalPreTax": 221.5
},
{
  "id": "95aee6b0-9c41-11e5-8994-feff819cdc9f",
  "name": "Ingrid Bergman",
  "channel": "MOB",
  "productId": 5527,
  "totalPreTax": 12.5
},
{
  "id": "95aee6b0-9c41-11e5-8994-feff819cdc9f",
  "name": "Ingrid Bergman",
  "channel": "WEB",
  "productId": 1188,
  "totalPreTax": 55.6
},
{
  "id": "2854b9d6-9c42-11e5-8994-feff819cdc9f",
  "name": "Luis Borges",
  "channel": "IPAD",
  "productId": 779,
  "totalPreTax": 119.0
}]

我需要的是为每个客户获取平均值totalPreTax和他们最频繁channel的,按后者(desc)的字母顺序排序。那是,

[{ 
   "id": "95aee6b0-9c41-11e5-8994-feff819cdc9f",
   "name": "Ingrid Bergman",
   "channel": "WEB",
   "totalPreTax": 96.53
 },
 {
  "id": "2854b9d6-9c42-11e5-8994-feff819cdc9f",
  "name": "Luis Borges",
  "channel": "IPAD",
  "totalPreTax": 119.0
}]

到目前为止,我有以下(仅显示相关位),按平均值排序totalPreTax

{ //...
  "aggs": {
    "byCustomer": {
      "terms": {
        "field": "customer.id",
        "order": {
          "averageTotalPreTax": "desc"
        }
      },
      "aggs": {
        "averageTotalPreTax": {
          "avg": {
            "field": "totalPreTax"
          }
        },
        "channel": {
          "terms": {
            "field": "channel",
            "order": {
              "_term": "desc"
            },
            "size": 1
        }
    }
}

问题是,找出channel每个桶(也就是每个客户)的顶部需要第二个多桶子term聚合。我只对结果数组的第一个元素感兴趣,它保存了最频繁频道所需的值。这可以防止我byCustomer使用以下方法对聚合进行排序:

"byCustomer": {
      "terms": {
        "field": "customer.id",
        "order": {
          "channel": "desc"
        }
      }
}

导致:

AggregationExecutionException [无效术语聚合顺序路径 [通道]。术语桶只能在子聚合器路径上排序,该路径由路径内的零个或多个单桶聚合以及路径末端的最终单桶或指标聚合构建而成

有人在那里解决了类似的问题(但不是我的场景),但没有正确回答问题。

那么,我该怎么做呢?有任何想法吗?

编辑:问题与 ES 版本无关。可能的答案适用于任何特定的 API 版本。

4

0 回答 0