Elasticsearch在顶级聚合中包括其他字段

时间:2019-03-01 09:02:05

标签: elasticsearch elasticsearch-aggregation

我的索引文件如下:

{
  "user": { 
     "email": "test@test.com",
     "firstName": "test",
     "lastName": "test" 
  },
  ...
  "category": "test_category"
}

当前,我有一个聚合,该聚合通过用户的电子邮件对文档进行计数,然后进行子聚合以计算每个用户的类别:

"aggs": {
  "users": {
    "terms": {
      "field": "user.email",
      "order": {
        "_count": "desc"
      }
    },
    "aggs": {
      "categories": {
        "terms": {
          "field": "category",
          "order": {
            "_count": "desc"
          }
        }
      }
    }
  }
}

我正在尝试将用户的名字和姓氏包括到顶部聚合生成的存储桶中,同时仍从类别子聚合中获得相同的结果。我已经尝试过加入top_hits聚合,但是我并没有运气获得想要的结果。

有什么建议吗?谢谢!

编辑:

让我改一下。实际上,我确实通过top_hits聚合在用户数据方面获得了预期的结果,我只是不知道如何在原始聚合中正确地包含它,因此categories子聚合仍然为我提供了同样的结果。我尝试了以下top_hits聚合:

"aggs": {
  "user": {
    "top_hits": {
      "size": 1,
      "_source": {
        "include": ["user"]
      }
    }
  }
}

我想将用户数据存储在顶层的agg存储桶中,然后在其下方仍然按类别进行聚合。

1 个答案:

答案 0 :(得分:1)

如果我没错,用户名和姓氏有一个双射。

因此,您可以在这些字段上使用海关脚本来检索它们(并在客户端使用“ _”或Wathever分隔符来提取这些存储桶值)

aggs: {
  users: {
    terms: {
        script: 'doc["users.email"].value + "_" + doc["users.firstName"].value + "_" + doc["users.lastName"].value'
    }
  }
}