2016-11-04 4 views
1

これは奇妙な質問ですが、2つの異なる範囲から異なるデータを取得するためにESを2回呼び出さないようにしようとしています。 ElasticSearch:それぞれ異なる集計で2つの異なる範囲で検索

から "2016-10-01 to 2016-10-31"フィールド「orders.total_sales」(単なる例)と別の合計「reviews.count」をSUMにしたいとします。

「2016-09-01〜2016-09-30」 「orders.total_sales」を合計したいだけです。

(真実は最初の範囲で50個の合計集計のように必要ですが)2番目の範囲では2)が必要です。

私は、2つの範囲で何かをフィルタリングする必要があることを知っています。しかし、それらを操作するために各範囲と結果を区別することは可能です(集計合計)。

私はそれが可能ではないと思いますが、もし誰かがこの問題を以前に来たのであれば。

ありがとうございます。

答えて

2

この目的でfilter aggregationを使用できます。基本的に2つの異なる範囲の2つのフィルタを作成し、必要に応じてサブ集計を行います。

(私はそれが働いてしまったまで、原因ESエラーのために)私はこのような何かを書くことになった
{ 
    "size": 0, 
    "aggs": { 
    "range_one": { 
     "filter": { 
     "range": { 
      "your_date_field": { 
      "gte": "2016-01-01", 
      "lte": "2016-02-02" 
      } 
     } 
     }, 
     "aggs": { 
     "sum_orders": { 
      "sum": { 
      "field": "your_sum_field1" 
      } 
     } 
     } 
    }, 
    "range_two": { 
     "filter": { 
     "range": { 
      "your_date_field": { 
      "gte": "2016-02-01", 
      "lte": "2016-03-02" 
      } 
     } 
     }, 
     "aggs": { 
     "sum_orders": { 
      "sum": { 
      "field": "your_sum_field2" 
      } 
     } 
     } 
    } 
    } 
} 
+0

ありがとうございました!あなたがペーストしたものに基づいて、私はこのようなもので終わった(次の投稿) – user3049941

+0

私は助けることができてうれしい – ChintanShah25

0

ありがとうございました!それは働いたが、ないフィルタではなく、考え方は同じ である私は、このようなものでした:私の場合のパフォーマンスとスピードで

{ 
    "timeout" : 1500, 
    "query" : { 
    "bool" : { 
     "must" : [ 
     { 
      "term" : { 
      "businessId" : "101598" 
      } 
     } , 
     { 
      "range" : { 
      "date" : { 
       "from" : "2016-10-15T03:00:00.000Z", 
       "to" : "2016-10-31T03:00:00.000Z", 
       "include_lower" : true, 
       "include_upper" : true 
      } 
      } 
     }] 
    } 
    }, 
    "aggs": { 
    "range_one": { 
     "date_range": { 
     "field": "date", 
     "ranges": [ 
      { 
      "from": "2016-10-15T03:00:00.000Z", 
      "to": "2016-10-22T03:00:00.000Z" 
      } 
     ] 
     }, 
     "aggs": { 
     "sum_orders_sales": { 
      "sum": { 
      "field": "orders.totalSales" 
      } 
     } 
     } 
    }, 
    "range_two": { 
     "date_range": { 
     "field": "date", 
     "ranges": [ 
      { 
      "from": "2016-10-23T03:00:00.000Z", 
      "to": "2016-10-31T03:00:00.000Z" 
      }      
     ] 
     }, 
     "aggs": { 
     "sum_orders_count": { 
      "sum": { 
      "field": "orders.orderCount" 
      } 
     } 
     } 
    } 
    } 
} 

が重要ですが、私の二つの範囲が連続していることから、私は私がすることによってフィルタリングすることができると思いましたクエリの結果と連動していると仮定して、business_id(必要があります)と最も古い日付(最初の範囲の開始日)から最新の日付(2番目の範囲の終了日)までです(そうでなければ、 、それがただ1つだけ得られた結果セットを介して集約オペレーションを行うことは素晴らしいことです)。しかし、私はESに新しいので、私はそれが正しいと確信していません。しかし、それは魅力のように働いている! ありがとうございます

+0

あなたはそれを正しくしました。 – ChintanShah25

関連する問題