Наш индекс 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
в агрегатах, или, возможно,путь по идентификатору, найти верхнюю версию таким образом, а затем объединить эти сегменты перед повторным заполнением полей, которые мы действительно хотим собрать?Или есть какой-то другой способ получить такое поведение?