terms
Elasticsearch 2.0.0で、特定の用語の上位ヒット数でマルチバケット集約のバケットをソートしようとしています。
わかりやすくするための例を次に示します。顧客の購入を表す次のデータセットがあるとします。
[{
"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
し、後者 (降順) でアルファベット順に並べ替えることです。あれは、
[{
"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
は、2 番目のマルチバケットterm
サブ集計が必要になることです。私が関心があるのは、結果として得られる配列の最初の要素だけです。これは、最も頻繁なチャネルに必要な値を保持しています。これにより、byCustomer
次のようなものを使用して集計を並べ替えることができなくなります。
"byCustomer": {
"terms": {
"field": "customer.id",
"order": {
"channel": "desc"
}
}
}
その結果:
AggregationExecutionException[無効な用語の集計順序パス [チャネル]。用語バケットは、パス内の 0 個以上の単一バケット集計と、パスの最後の単一バケットまたはメトリック集計から構築されたサブ集計パスでのみ並べ替えることができます。
誰かが似たようなことに取り組みましたが(私のシナリオとは異なります)、質問に適切に答えませんでした。
それで、どうすればこれを行うことができますか?何か案は?
編集:ESバージョンに関連付けられていない質問。可能な回答は、特定の API バージョンに適用できます。