Фильтрация агрегированных дочерних документов по верхнему дочернему элементу для поля перед группировкой? - PullRequest
0 голосов
/ 12 июня 2019

Наш индекс Elasticsearch в настоящее время имеет родительские и дочерние объекты;родитель и все его дочерние элементы имеют одинаковое поле идентификатора, а дочерние имеют версию.Мы очень часто запрашиваем дочерние объекты и хотим, чтобы для каждого идентификатора был только дочерний объект с самой высокой версией.

Сначала это кажется достаточно простым при has_child запросах:

{
  "query" : {
    "has_child" : {
      "type" : "child_entity",
      "query" : {
        ...
      }
      "inner_hits" : {
        "size" : 1,
        "sort" : [{"version", "desc"}]
      }
    }
  }
}

Это прекрасно работает, пока агрегаты не входят в картину.У нас есть несколько простых terms агрегатов, которые мы хотим применить к полям только тех дочерних объектов, которые соответствуют тому, что мы видим в inner_hits блоках результатов, но я не могу найти способпримените это к выводу агрегации children.

В частности, это немного неправильно:

{
  "query" : {
    "has_child" : {
      "type" : "child_entity",
      "query" : {
        "term" : { "id" : 0 }
      }
      "inner_hits" : {
        "size" : 1,
        "sort" : [{"version", "desc"}]
      }
    }
  }
  "aggs" : {
    "get-children": {
      "children": {
        "type": "child_entity"
      },
      "aggs": {
        "bucket-some-field": {
          "terms": {
            "field" : "some_field" 
          },
          "aggs": {
            "unique-ids": {
              "cardinality": {
                "field": "id"
              }
            }
          }
        }
      }
    }
  }
}

В приведенном выше примере, если у нас есть один дочерний объект {id = 0,version = 1, some_field = "a"} и другой {id = 0, version = 2, some_field = "b"}, наши результаты, извлеченные из внутренних попаданий, будут (правильно) отображать только последние, тогда как количество элементовнаши агрегатные сегменты будут давать счетчик 1 для some_field = "a" и some_field = "b".

Не хватает ли какого-либо способа применить усечение, выполняемое inner_hits в агрегатах, или, возможно,путь по идентификатору, найти верхнюю версию таким образом, а затем объединить эти сегменты перед повторным заполнением полей, которые мы действительно хотим собрать?Или есть какой-то другой способ получить такое поведение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...