2016-11-04 32 views
1

這是一個奇怪的問題,但我試圖避免兩次調用ES以獲得來自兩個不同時間範圍的不同數據。 我想說:ElasticSearch:在兩個不同的範圍內搜索不同的聚合,每個

從「2016-10-01到2016-10-31」我想彙總「orders.total_sales」字段(僅作爲示例)和另一個總數「reviews.count」。

而且從「2016-09-01到2016-09-30」 我只想總結「orders.total_sales」。

(事實是我需要在第一個範圍上有50個總和),但對於第二個範圍,我只需要2個)。

我知道可以使用should而不是must來過濾兩個範圍的任何東西。但是有可能將結果與每個範圍區分開來以便與它們一起操作(總計總和)。

我不認爲這是可能的,但以防萬一以前有人遇到過這個問題。

在此先感謝。

回答

2

您可以使用filter aggregation來達到此目的。你基本上會爲兩個不同的範圍編寫兩個過濾器,然後根據需要進行子聚合。

{ 
    "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

我最後寫像這樣用(由於ES的錯誤,直到我得到它的工作)

非常感謝您!它的工作,但不帶過濾器,但這個想法是一樣的 我做了這樣的事情:

{ 
    "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(我需要)以及從最早的日期(第一個範圍的開始日期)到最新日期(第二個範圍的結束日期)(否則,它將搜索所有文檔,只需要通過一個獲得的結果集對其進行聚合操作即可)。但我是ES新手,所以不確定我看到它是對的。然而,它的工作就像魅力! 非常感謝1

+0

你已經做對了,聚合在更少的結果上會更快。 – ChintanShah25

相關問題