Как отфильтровать результаты от составной агрегации? - PullRequest
0 голосов
/ 05 июня 2019

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

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

{
  "size": 0,
  "aggs": {
    "grouped_data": {
      "composite": {
        "sources": [
          {
            "artifact": {
              "terms": {
                "field": "artifactId.keyword"
              }
            }
          }
        ],
        "size": 20
      },
      "aggs": {
        "top_artifacts_hits": {
          "top_hits": {
            "size": 1,
            "sort": [{
              "initialDate": {
                "order": "desc"
              }
            }]
          }
        }
      }
    }
  }
}

Я пытался использовать query API для фильтрации, но это не очень хороший вариант для меня, так как фильтры, которые я хочу применить, предназначены для сгруппированных результатов. Использование некоторого query перед основным агрегацией делает сначала запрос ElasticSearch, а затем группу. Мне нужно, чтобы это было задом наперед. Я использую ES 6.3 под AWS.

Итак, мои документы выглядят примерно так:

{
  "artifactId": "foo",
  "clientId": "bar",
  "artifactState": "foozz",
  "initialDate": 1559745246
}

Что мне нужно сделать, так это получить последний artifactState на основе initialDate для каждого отдельного artifactId, поэтому я использую top_hits + композитный.

...