/ / ElasticSearch - 集約:バケットのフィルタリングとソート - json、elasticsearch

ElasticSearch - 集約:バケットのフィルタリングとソート - json、elasticsearch

ElasticSearch 5.2の使用

一例として、私は世界のすべての人を代表するデータベースを使用しています。

リクエストの例:30歳以上のすべての人の、国別に分類された人の平均給与を取得します。 (回答には上位10カ国の平均給与を含める必要があります)

集計クエリを作成する手順は次のとおりです。

  1. 生データセットをフィルタリングする(filter: age > 30
  2. 集約 "country"
  3. フィールドでメトリックAvgを使用する "salary"

私が直面している問題は、集約する前にフィルタを適用するか、バケットを並べ替えることができますが、ESで両方を行うことができないようです。
言い換えれば、私は私の "order"クエリ"myInnerAggregation"それは"myFilterAggregation"

GET myIndex/_search
{
"size":0,
"aggs": {
"myAggregation": {
"terms": {
"size":10,
"field": "country",
"order": [
{
"myInnerAggregation": "desc"
// I cannot specify "myInnerAggregation" here, only
// "myFilterAggregation" (because it"s out of scope I guess)
}
]
},
"aggs": {
"myFilterAggregation": {
"filter": { /* age > 30 (filter syntax is not the problem)*/},
"aggs": {
"myInnerAggergation": {
"avg": {
"field": "salary"
}
}
}
}
}
}

} }

私は、ES 6.1+が "bucket_sort"これはおそらくこの問題を解決するだろうが、私はこのような単純な集約がES 5.2では処理できないとは信じられない。

回答:

回答№1は0

これはトリックを行う必要があります:

"order": [
{
"MyFilterAggregation>MyInnerAggregation": "desc"
}
]

回答№2の場合は0

フィルターを query リクエストの一部フィルタを集計として宣言する必要はありません。 query あなたの要求の一部。うまくいけば、この方法で問題を回避することができます。