Запрос агрегации Elasticsearch не дает ожидаемого результата

1

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

client.prepareSearch("myindex").
       setTypes("mytype").
       setQuery(
           QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
           FilterBuilders.andFilter(FilterBuilders.termFilter("server","x")))).
       addAggregation(AggregationBuilders.avg("cpu_agg")
           .field("dt_time").field("cpu_time"))
       .get()

Пожалуйста, направляйте. Я хочу, чтобы время avg cpu на последней дате сообщило сегодня дату. Я новичок в ElasticSearch. Заранее спасибо.

  • 0
    Вроде странный поисковый запрос. Почему вы используете andfilter только с одним предложением? И это отчасти устарело - используйте вместо этого boolfilter. Почему вы предоставляете два поля для агрегации в среднем? AFAIK это нужно только один. Если вы хотите avg только для указанной даты, используйте фильтр диапазона на dt_time
  • 0
    да, вы должны переместить ваш dt_time в часть фильтрации (т.е. удалить его из агрегации и добавить еще один фильтр, который фильтрует на последнюю дату)
Теги:
elasticsearch

1 ответ

3
Лучший ответ
   client.prepareSearch("myindex").
   setTypes("mytype").
   setQuery(
       QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
       FilterBuilders.andFilter(FilterBuilders.termFilter("server","x")))).
   addAggregation(AggregationBuilders.avg("cpu_agg")
       .field("dt_time").field("cpu_time"))
   .get()

посмотрите на часть (где поле сначала установлено на dt_time и заменено на cpu_time), что означает, что агрегация построена для cpu_time,

Если вы хотите получить время процессора в сегодняшнюю дату, тогда одним из способов является фильтр даты использования,

       FilterBuilders.andFilter(FilterBuilders.termFilter("server","x"),FilterBuilders.rangeFilter("dt_time").to(to).from(from))))

Для вашей проблемы, от = до = today_date (или последней даты)

поэтому, наконец,

client.prepareSearch("myindex").
                setTypes("mytype").
                setQuery(
                        QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
                                FilterBuilders.andFilter(FilterBuilders.termFilter("server", "x"), FilterBuilders.rangeFilter("dt_time").to("to").from("from")))).
                addAggregation(AggregationBuilders.avg("cpu_agg")
                        .field("cpu_time"))
                .get();
  • 0
    Привет, спасибо большое за ответ. Как мне указать дату ввода, если я не знаю заранее. Я хочу что-то вроде select max (date) из таблицы;
  • 0
    Вы не можете передать результат одной (метрической) агрегации другому. Если вам нужно выполнить max (date), затем выполнить агрегацию, чтобы получить max date для получения даты, и выполнить другую агрегацию для cpu_time.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню