对多桶子聚合的元素进行聚合排序

时间:2015-12-06 18:22:04

标签: json elasticsearch elasticsearch-2.0

在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 [无效术语聚合顺序路径[channel]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合构成,最后一个桶或路径末端的度量聚合

有人在那里,tackled something similar(但不是我的情景),但没有正确回答这个问题。

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

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

0 个答案:

没有答案