我们的Elasticsearch索引当前具有父实体和子实体;父级及其所有子级共享相同的ID字段,并且子级具有一个版本。对于我们来说,查询子实体并为每个id只想要具有最高版本的子实体是很常见的。
首先,使用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”},则提取了我们的结果从内部匹配中,将(正确)仅显示后者,而我们的聚合存储桶的基数将对some_field =“ a”和some_field =“ b”的计数为1。
我是否缺少某种方法来应用inner_hits
在聚合中的截断,或者缺少一种通过id进行存储的方法,以这种方式找到最高版本,然后合并这些存储桶,然后在我们对字段进行重新存储之前实际要汇总吗?还是有其他方法可以实现这种行为?