在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版本。