在存储分区之前,按顶级子项过滤汇总的子项文档中的某个字段?

时间:2019-06-12 19:25:06

标签: elasticsearch

我们的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进行存储的方法,以这种方式找到最高版本,然后合并这些存储桶,然后在我们对字段进行重新存储之前实际要汇总吗?还是有其他方法可以实现这种行为?

0 个答案:

没有答案