2017-01-04 2 views
0

есть что-то, что я имею в связи с ES (1.7), и я не уверен, как это сделать. Позвольте мне посмотреть, могу ли я показать его с помощью sql и таблицы, возможно, проще перевести на запрос ES. Представьте за столом points_by_dateElasticsearch: сумма операций над ковшом date_range

DATE PURCHASE_COUNT ACCUMULATED_POINTS 
day 1   5    548 
day 2   8    498 
day 3   9    623 
day 4   9    635 
day 5  13    620 

если это таблица, я бы сделать запрос так, чтобы получить то, что мне нужно:

SELECT SUM(q.AVG_POINT_PURCHASE) as POINT_BY_PURCHASE 
FROM (
    SELECT (ACCUMULATED_POINTS/PURCHASE_COUNT) as AVG_POINT_PURCHASE 
    FROM points_by_date 
) q; 

Можно ли это сделать в ES? Мне нужно добавить, что эти операции выполняются над ведрами диапазона дат, что-то вроде этого:

{ 
    "timeout": 1500, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "date": { 
       "from": "2016-12-01", 
       "to": "2016-12-05", 
       "include_lower": true, 
       "include_upper": true 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggregations": { 
    "my_ranges": { 
     "date_range": { 
     "field": "date", 
     "ranges": [ 
      { 
      "from": "2016-12-01", 
      "to": "2016-12-05" 
      }, 
      { 
      "from": "2016-12-06", 
      "to": "2016-12-10" 
      } 
     ] 
     }, 
     "aggregations": { 
     "TOTAL_POINTS" : { 
      "sum" : { 
      "field" : "ACCUMULATED_POINTS" 
      } 
     }, 
     "PURCHASE_COUNT" : { 
      "avg" : { 
      "field" : "PURCHASE_COUNT" 
      } 
     } 
     } 
    } 
    } 
} 

Каждый диапазон дат, будет представлять собой набор N строки в таблице, откуда мне нужно сделать что математику.

Запрос ES имеет предыдущий подход, в котором я получал средний показатель покупки_количество за ведро, и позже разделил сумму накопленных_поиска ведра на это среднее значение. Теперь мне нужно сначала делить, а затем накопить за ведро. Любая идея, если это возможно и как?

Заранее благодарен!

ответ

0

Только в случае, если кто-то нуждается в нем или что-то подобное, мне удалось это:

{ 
    "timeout": 1500, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "range": { 
      "date": { 
       "from": "2016-12-01", 
       "to": "2016-12-05", 
       "include_lower": true, 
       "include_upper": true 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggregations": { 
    "my_ranges": { 
     "date_range": { 
     "field": "date", 
     "ranges": [ 
      { 
      "from": "2016-12-01", 
      "to": "2016-12-05" 
      }, 
      { 
      "from": "2016-12-06", 
      "to": "2016-12-10" 
      } 
     ] 
     }, 
     "aggregations": { 
     "sum_avg_purchase_point": { 
      "sum": { 
      "script": { 
       "inline": "doc[accumulatedPoints].value.intValue()/(doc[purchaseCount].value.intValue() == 0 ? 1 : doc[purchaseCount].value.intValue())", 
       "params": { 
       "accumulatedPoints": "ACCUMULATED_POINTS", 
       "purchaseCount": "PURCHASE_COUNT" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

я впервые попробовал все против ES, и как только я имел его работать и делать исчисление мне нужно, и после проверки В результате я создал этот запрос с помощью API Java.

Надеет, что это помогает некоторым! С уважением!!!