2017-02-01 11 views
0

У меня есть набор данных с 1000 датами, охватывающими период в 1 месяц. Я хотел бы сделать агрегацию на основе этого поля даты, но только на нескольких образцах, разделенных интервалом (например, неделю).Выберите набор данных на образцах в elasticsearch

Для примера: для дат от 1-го до 30-дек, я должен получить ведра для дат: 1 декабря, 8 декабря, 15 декабря, 22 декабря & 29 дек. PS: Я не хочу использовать гистограммы даты здесь, поскольку это группы данные в заданный интервал. Таким образом, для примера выше, он формирует ведро от 1-7, 8-15 и так далее.

Я рассмотрел сборку sampler, и для этого требуется сценарий. Я не мог понять, как сценарий должен быть написан таким образом, чтобы собирать образцы и поставлять эти образцы в агрегацию ребенка.

+0

Почему бы не просто ограничить агрегацию 'date_histogram' фильтром, который отфильтровывает любые другие даты, чем тот, который вы хотите отбирать? – Val

+0

Как я уже сказал, гистограмма даты будет ** **, а не ** фильтровать **. Можете ли вы доказать свою точку зрения на примере? –

ответ

0

Существуют разные способы сделать это. Один из них заключается в использовании date_histogram агрегации сдерживается фильтром, который будет только выбрать желаемые даты:

{ 
    "aggs": { 
    "5_days": { 
     "filter": { 
     "filter": { 
      "bool": { 
      "minimum_should_match": 1, 
      "should": [ 
       { 
       "range": { 
        "date": { 
        "from": "2016-12-01T00:00:00.000Z", 
        "to": "2016-12-02T00:00:00.000Z" 
        } 
       } 
       }, 
       { 
       "range": { 
        "date": { 
        "from": "2016-12-08T00:00:00.000Z", 
        "to": "2016-12-09T00:00:00.000Z" 
        } 
       } 
       }, 
       { 
       "range": { 
        "date": { 
        "from": "2016-12-15T00:00:00.000Z", 
        "to": "2016-12-16T00:00:00.000Z" 
        } 
       } 
       }, 
       { 
       "range": { 
        "date": { 
        "from": "2016-12-22T00:00:00.000Z", 
        "to": "2016-12-23T00:00:00.000Z" 
        } 
       } 
       }, 
       { 
       "range": { 
        "date": { 
        "from": "2016-12-29T00:00:00.000Z", 
        "to": "2016-12-30T00:00:00.000Z" 
        } 
       } 
       } 
      ] 
      } 
     } 
     }, 
     "aggs": { 
     "samples": { 
      "date_histogram": { 
      "field": "date", 
      "interval": "day" 
      } 
     } 
     } 
    } 
    } 
} 

Второй способ является более кратким и сводится к использованию date_range aggregation только с выбранными датами:

{ 
    "aggs": { 
     "range": { 
      "date_range": { 
       "field": "date", 
       "ranges": [ 
        { "from": "2016-12-01T00:00:00.000Z", "to": "2016-12-02T00:00:00.000Z" }, 
        { "from": "2016-12-08T00:00:00.000Z", "to": "2016-12-09T00:00:00.000Z" }, 
        { "from": "2016-12-15T00:00:00.000Z", "to": "2016-12-16T00:00:00.000Z" }, 
        { "from": "2016-12-22T00:00:00.000Z", "to": "2016-12-23T00:00:00.000Z" }, 
        { "from": "2016-12-29T00:00:00.000Z", "to": "2016-12-30T00:00:00.000Z" } 
       ] 
      } 
     } 
    } 
} 
+0

Удачи вам в этом? – Val

+0

Первый вариант выглядит хорошо, и он должен работать. Просто быстрый вопрос, почему вы использовали ** interval = daily **, а не ** еженедельно **? Будет ли это иметь значение? –

+0

Прохладный, рад, что это помогло. 'daily', потому что вам нужен только один день выборки в вашем ответе, а не полная неделя. – Val