Отфильтрованное агрегирование не возвращает результатов

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

{
    "_source" : {"excludes": ["stderr"]},
    "aggs" : {
        "max_duration_filtered" : {
            "filter" : {
                "term": {
                        "pipeline": "{name_of_pipeline}"
                }
            },
            "aggs" : {
                "max_duration" : {
                        "max" : {
                                "field" : "duration"
                        }
                }
            }
        }
    }
}

Вызов этого возвращает следующий вывод вместе с 1 попаданием (я также передал размер = 1)

{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 63643,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "{name-of-index}",
        "_type" : "raw_data",
        "_id" : "{an-id}",
        "_score" : 1.0,
        "_source" : {
          "duration" : 42.8,
          "pipeline" : "{a-different-pipeline}",
          "buildNumber" : {build-number-integer}
        }
      }
    ]
  },
  "aggregations" : {
    "max_duration_filtered" : {
      "doc_count" : 0,
      "max_duration" : {
        "value" : null
      }
    }
  }
}

Мне бы очень хотелось понять, почему значение максимальной продолжительности равно нулю. Кажется, я довольно тщательно отразил то, что было в документах. Есть ли что-нибудь, что я могу попытаться исправить? Спасибо!


person gatech-kid    schedule 19.05.2020    source источник
comment
doc_count равен 0. Это означает, что имя, по которому вы фильтруете, отсутствует в результатах запроса.   -  person jaspreet chahal    schedule 19.05.2020
comment
Ваш фильтр не работает с хитами, а только с агрегациями. Можете ли вы объяснить, что вы ожидаете от результатов?   -  person Val    schedule 19.05.2020
comment
@jaspreetchahal -› Я проверил это, выполнив запрос =› ``` { _source : {excludes: [stderr]}, query: {match_all: {} }, size: 40 } ``` и нашел имя конвейер в данных   -  person gatech-kid    schedule 19.05.2020
comment
@Val У меня есть данные, содержащие список конвейеров и соответствующее время их выполнения. Я пытаюсь отфильтровать данные по типу конвейера, а затем найти максимальное время, необходимое для выполнения любого из этих конвейеров. В основном фильтруйте по имени конвейера, а затем находите максимальную продолжительность среди отфильтрованного набора.   -  person gatech-kid    schedule 19.05.2020


Ответы (1)


Следующий запрос даст вам максимальную продолжительность для каждого конвейера. Нет необходимости фильтровать по конкретному конвейеру.

{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "pipeline.keyword": "some-pipeline"
          }
        }
      ]
    }
  },
  "aggs": {
    "pipelines": {
      "terms": {
        "field": "pipeline.keyword",
        "size": 100
      },
      "aggs": {
        "max_duration": {
          "max": {
            "field": "duration"
          }
        }
      }
    }
  }
}
person Val    schedule 19.05.2020
comment
Отличное предложение! Я действительно столкнулся с ошибкой с этим, хотя ``` { тип : незаконное_аргумент_исключение, причина : Полевые данные отключены в текстовых полях по умолчанию. Установите fielddata=true для [конвейера], чтобы загрузить данные поля в память, не инвертируя инвертированный индекс. Обратите внимание, что это может, однако, использовать значительный объем памяти. Вместо этого используйте поле ключевого слова. } ``` - person gatech-kid; 19.05.2020
comment
Кроме того, я хотел придерживаться подхода filter + agg, потому что я хотел бы в конечном итоге фильтровать по нескольким полям и агрегировать максимальную продолжительность в отфильтрованном наборе. - person gatech-kid; 19.05.2020
comment
Исправил мой ответ, пожалуйста, проверьте его снова - person Val; 19.05.2020
comment
Если вы хотите придерживаться фильтра, вам, вероятно, следует переместить его в раздел запросов, а не в раздел агрегатов. Смотри мой ответ - person Val; 19.05.2020
comment
О мой Бог! Это сработало! :D Огромное спасибо Вэл! Я принял ваш ответ. Спасибо еще раз! Могу ли я избавиться от раздела терминов в aggs теперь, когда я фильтрую в разделе запросов? - person gatech-kid; 19.05.2020
comment
Я удалил его, и это сработало! Ты спасатель. Спасибо еще раз. - person gatech-kid; 19.05.2020