集約

2017-12-13 17 views
1

のすべての結果を取得するための最も効果的な方法があり、どのI次のクエリがあります。集約

GET my-index-*/my-type/_search 
{ 
    "size": 0, 
    "aggregations": { 
    "my_agg": { 
     "terms": { 
     "script" : "code" 
     }, 
     "aggs": { 
     "dates": { 
      "date_range": { 
      "field": "created_time", 
      "ranges": [ 
       { 
       "from": "2017-12-09T00:00:00.000", 
       "to": "2017-12-09T16:00:00.000" 
       }, 
       { 
       "from": "2017-12-10T00:00:00.000", 
       "to": "2017-12-10T16:00:00.000" 
       } 
      ] 
      } 
     }, 
     "total_count": { 
      "sum_bucket": { 
      "buckets_path": "dates._count" 
      } 
     }, 
     "bucket_filter": { 
      "bucket_selector": { 
      "buckets_path": { 
       "totalCount": "total_count" 
      }, 
      "script": "params.totalCount == 0" 
      } 
     } 
     } 
    } 
    } 
} 

このクエリの結果は、バケツの束です。私が必要とするのは、私のバケツのキーのリストです。問題は集計結果のサイズがデフォルトで10であり、それらを取得した後で、私のbucket_filterはそれらを合計カウントでフィルタリングします。これらのうちのいくつかだけを取得します。すべての結果が必要です。つまり、"size" = n、ここでncodeという別個のカウントであるため、データが失われることはありません。私は何十億もの書類を持っているので、私の場合、nは約30.000です。私はクエリを実行しようとしたときに、 "メモリ不足"がクラスタ上で発生したので、それは最良のアイデアではないと思います。クエリにすべての結果を得るための良い方法はありますか?

答えて

1

これは30Kの一意の値を持つ高度なカーニティーフィールドにはお勧めできません。理由は、メモリコストと、発見したように断片から収集する必要がある大量のデータが原因です。これはうまくいくかもしれないが、その後、あなたはより多くのメモリを必要とする...

Aより効率的なソリューションを使用すると、フィールドから取得する値をScroll APIを使用して、検索要求にfieldsに指定することで、その後、いずれかのこれらの値を保存しますあなたのクライアントのメモリ内にあるか、それをストリームします。