DSL-фильтр Elasticsearch по агрегации и расширенной статистике

Если я использую aggregations.bucket с метрикой, как я могу отфильтровать ее, чтобы контролировать период просмотра? Точно так же можно ли использовать фильтр таким же образом для расширенной статистики? Вот фрагмент кода, который работает (вместе с фильтром, который я хотел бы использовать):

s = Search(using=client)
s.aggs.bucket('some_bucket_by_day', 'date_histogram', field='time_field', interval='day')
        .metric('some_avg', 'avg', field='some_field')

Пытаюсь фильтровать как-то так:

filter='range', **{'time_field': {'gte': 'now-10d'}}

Кроме того, если вы используете extended_stats, может ли работать фильтр?

s.aggs.bucket('exchange_stats', 'extended_stats', field='some_field')

Спасибо!


person jeff_new    schedule 23.07.2020    source источник


Ответы (1)


Фильтр можно применять на уровне запроса, что уменьшит количество документов, для которых необходимо вычислить агрегацию. Также extended_stats — это агрегация метрик, а не сегментов. Итак, вы можете сделать это следующим образом:

// create search and filter the document by date
s = Search(using=client)
     .filter('range', time_field={'gte': 'now-10d'})

// add some aggregations
s.aggs.bucket('some_bucket_by_day', 'date_histogram', field='time_field', interval='day')
     .metric('some_avg', 'avg', field='some_field')
     .metric('exchange_stats', 'extended_stats', field='some_field')
person Val    schedule 11.08.2020