2014-11-01 4 views
2

Im используя elasticsearch aggregations вернуть два различных агрегатных группы, один для текущей недели и один за предыдущую неделю, моя текущая неделя агрегат выглядит следующим образом:ElasticSearch extended_bounds мин макс

"aggregations": {    
    "current": { 
     "date_histogram": { 
      "field": "date", 
      "interval": "1d", 
      "min_doc_count": 0, 
      "extended_bounds": { 
       "min": new Date().setDate(new Date().getDate() - 7), 
       "max": new Date().getDate() 
      } 
     } 
    } 
} 

На данный момент все это штраф, im используя min_doc_count в сочетании с extended_bounds, чтобы заполнить пробелы для пустых ведер в случае их наличия.

В моем другом агрегате я повторяю этот процесс почти так же, но хочу, чтобы мои ведра были в предыдущий период!

Я знаю, что extended_boundsне фильтровальные ведра поэтому я, хотя о добавлении фильтра поверх моей агрегации, как это:

"aggregations": { 
    filtered: { 
     "filter" : { 
      "bool": { 
       "must": [{ 
        "range" : { 
         date: { 
          from: new Date().setDate(new Date().getDate() - 14), 
          to: new Date().setDate(new Date().getDate() - 7) 
         } 
        } 
       }] 
      } 
     }, 
    }, 
    "previous": { 
     "date_histogram": { 
      "field": "date", 
      "interval": "1d", 
      "min_doc_count": 0, 
      "extended_bounds": { 
       "min": new Date().setDate(new Date().getDate() - 14), 
       "max": new Date().setDate(new Date().getDate() - 7) 
      } 
     } 
    } 
} 

Второй агрегат должен вернуться назад во времени, ровно за 14 дней до до 7 дней назад. Я знаю, что min работает, но max нет, возвращенные ведра поднимаются до сегодняшнего дня, хотя Im использует фильтр для ограничения диапазона, Im, используя must здесь, но ничего не делает. Im совершенно новый для ES, возможно, я пропустил что-то очевидное здесь, прошу прощения за недостаток знаний.

ответ

5

Согласно documentation:

Обратите внимание, что (как следует из названия) extended_bounds не фильтрует ведра. Значение, если extended_bounds.min выше, чем значения, извлеченные из документов, документы будут по-прежнему определять, что будет первым ведром (и то же самое относится к extended_bounds.max и последнему ведру). Для фильтрации ковшей необходимо вложить агрегацию гистограмм в агрегацию фильтра диапазона с соответствующими настройками//.

Пример:

{ 
    "query" : { 
     "filtered" : { "filter": { "range" : { "price" : { "to" : "500" } } } } 
    }, 
    "aggs" : { 
     "prices" : { 
      "histogram" : { 
       "field" : "price", 
       "interval" : 50, 
       "min_doc_count" : 0, 
       "extended_bounds" : { 
        "min" : 0, 
        "max" : 500 
       } 
      } 
     } 
    } 
} 

Короче говоря: использовать фильтр запроса, или гнездо агрегацию гистограммы внутри агрегации вашего фильтра. В вашем примере вы не вставляете скопления, но используете их рядом друг с другом (так что agg гистограммы не фильтруется filter-agg).

+0

Спасибо, я определенно рассмотрю, как их вложить в фильтр, так как теперь я запускаю оба запроса, разделенные в нескольких запросах, возможно, не самый эффективный способ сделать это ... – bmaggi