2016-04-26 9 views
0

集計されたデータに対してポストフィルタを実行しようとしていますが、期待どおりに機能しません。誰かが私の質問を見直して、私がここで間違って何かをしているかどうかを提案できますクエリ内elasticsearchのサブ集約のポストフィルタ

"query" : { 
    "bool" : { 
     "must" : { 
     "range" : { 
      "versionDate" : { 
      "from" : null, 
      "to" : "2016-04-22T23:13:50.000Z", 
      "include_lower" : false, 
      "include_upper" : true 
      } 
     } 
     } 
    } 
    }, 
    "aggregations" : { 
    "associations" : { 
     "terms" : { 
     "field" : "association.id", 
     "size" : 0, 
     "order" : { 
      "_term" : "asc" 
     } 
     }, 
     "aggregations" : { 
     "top" : { 
      "top_hits" : { 
      "from" : 0, 
      "size" : 1, 
      "_source" : { 
       "includes" : [ ], 
       "excludes" : [ ] 
      }, 
      "sort" : [ { 
       "versionDate" : { 
       "order" : "desc" 
       } 
      } ] 
      } 
     }, 
     "disabledDate" : { 
      "filter" : { 
      "missing" : { 
       "field" : "disabledDate" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

手順:

  1. 未満indexDateによるフィルタ又は指定された日付に等しいです。
  2. formIdに基づいて集計します。フォームIDごとにバケットを作成する。
  3. 降順でソートし、バケットあたりのトップヒット結果を返します。
  4. 実行ソートsubaggregation後subaggregationフィルタと無効日付がnullでないバケツからすべての文書を削除する。(動作しない)

答えて

0

post_filterの全体の目的は、集計が持っていた後を実行することです計算された。そのため、post_filterは集約結果に何の影響も与えません。無disabledDateと文書はすなわち文書のみdisabledDateを検討し、集計の際に考慮されないように。あなたはあなたのケースで何ができるか

は、トップレベルfilter aggregationを適用することです

{ 
    "query": { 
    "bool": { 
     "must": { 
     "range": { 
      "versionDate": { 
      "from": null, 
      "to": "2016-04-22T23:13:50.000Z", 
      "include_lower": true, 
      "include_upper": true 
      } 
     } 
     } 
    } 
    }, 
    "aggregations": { 
    "with_disabled": { 
     "filter": { 
     "exists": { 
      "field": "disabledDate" 
     } 
     }, 
     "aggs": { 
     "form.id": { 
      "terms": { 
      "field": "form.id", 
      "size": 0 
      }, 
      "aggregations": { 
      "top": { 
       "top_hits": { 
       "size": 1, 
       "_source": { 
        "includes": [], 
        "excludes": [] 
       }, 
       "sort": [ 
        { 
        "versionDate": { 
         "order": "desc" 
        } 
        } 
       ] 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

ユースケースでは、集計を計算する際にdisabledDate!= nullのドキュメントを検討する必要があります。そして、集計が完了したら、すべてのバケットからdisabledDate!= nullですべてのドキュメントをフィルタリングしたいと思います。だから、無効になっているdisabledDateが見つからないドキュメントを返すために、集計が完了した後にポストフィルタを実行しようとしていました。== null。 –

+0

集計が計算された後、バケット**から何も削除することはできません。クエリとフィルタを使用すると、集計パイプラインに入れるドキュメントのセットのみを決定できますが、集計が計算されたらバケットを変更することはできません。 – Val

+0

疑いを晴れてくれてありがとう。私のユースケースは、バケットがdisabledDate!= nullのドキュメントを持っている場合、集約バケットのトフィップを実行した後、そのバケットから結果を返したくないということです.Consider V1はdisabledであり、givenTimeに最も近く、 tophitとして返されました。投稿フィルタを実行すると、そのバケットから何も返されません。それは要件です。しかし、集計前にV1ドキュメントをフィルタリングすると、同じバケットから次に近いドキュメントであるgivenTimeにV2が返される可能性があります。どのように私はこれを達成するのですか?これはSQLで動作します。 –