Elasticsearch聚合在不同字段

时间:2016-05-23 13:13:59

标签: elasticsearch elasticsearch-aggregation

我正在尝试对经过筛选的文档集执行聚合;但是,过滤器细节需要​​使用聚合(每个'申请人'最近'测试')。 顶级聚合将在文档的字段上完成,但在与执行过滤聚合的字段不同的字段上完成。

例如(我在这里建立另一个用户的问题:Query or Filter for minimum field value?)。

给出以下一组文件:

{ "test": 1, "applicant":1, "score":90, “topic”:”geometry”},
{ "test": 2, "applicant":2, "score":65, “topic”:”physics” },
{ "test": 3, "applicant":2, "score":88, "topic”:”geometry”},
{ "test": 4, "applicant":1, "score":23, "topic”:”english” },
{ "test": 5, "applicant”:3, "score”:50, "topic”:”physics” },
{ "test": 6, "applicant”:3, "score”:77, "topic”:”english” }

我们有兴趣了解每个类别中有多少用户获得最高分。

换句话说,我们想要:

  1. 仅筛选每个用户的最高得分测试
  2. 根据主题对结果进行分组(并计算)。
  3. 因此,对于第1步,我们应该只保留:

    { "test": 1, "applicant":1, "score":90, “topic”:”geometry” },
    { "test": 3, "applicant":2, "score":88, "topic”:”geometry” },
    { "test": 5, "applicant”:3, "score”:50, "topic”:”physics”  },
    { "test": 6, "applicant”:3, "score”:77, "topic”:”english”  }
    

    并且对于第2步,按主题分组:

    {“topic”:”geometry” , “count”: 2}
    {“topic”:”physics”  , “count”: 1}
    {“topic”:”english”  , “count”: 1}
    

    问题是,如果我使用aggregation / top_hits进行过滤:

    {
      "aggs": {
        “applicants”: {
          "terms": {
            "field": “applicant”,
            "order" : { “highest_score" : "desc" }
          },
          "aggs": {
            “highest_score": { “max”: { "field": "score" }},
            “highest_score_top_hits": {
              "top_hits": {
                "size":1,
                "sort": [{"score": {"order": "desc"}}]
              }
            }
          }
        }
      }
    }
    

    我的第一步是正确的(top_hits),但是如果我按'主题'添加'父'聚合,top_hits聚合将不再正常工作,因为'申请人'将在不同的'主题'存储桶之间混合,因此,最高分数的汇总将是不正确的。

    看起来最好的方法是在“主题”聚合之前使用查询过滤器,但我无法创建这样的过滤器,因此它只保留每个申请人的最高得分测试。

    有什么想法吗?

0 个答案:

没有答案