在 Elasticsearch 上聚合结果时是否可以 returns 其他字段?

Is it possible to returns other fields when you aggregate results on Elasticsearch?

这是我的索引 PublicationsLikes 的映射:

我目前正在 ES 上进行聚合,我在其中按(出版物的)id 对结果计数进行分组。

{
    "key": "<publicationId-1>",
    "doc_count": 25
},
{
    "key": "<publicationId-2>",
    "doc_count": 387
},
{
    "key": "<publicationId-3>",
    "doc_count": 7831
}

返回的 "key"(id)是一个信息,但我还需要 select 发布的其他字段,如帐户和 api。有点像:

{
   "key": "<publicationId-1>",
   "api": "Facebook",
   "accountId": "65465z4fe6ezf456ezdf",
   "doc_count": 25
},
{
  "key": "<publicationId-2>",
  "api": "Twitter",
  "accountId": "afaez5f4eaz",
  "doc_count": 387
}

我该如何管理?

谢谢。

您可以为此使用子聚合。

GET /PublicationsLikes/_search
{
 "aggs" : {
  "ids": {
   "terms": {
    "field": "id"
   },
   "aggs": {
    "accounts": {
     "terms": {
      "field": "account",
      "size": 1
     }
    }
   }
  }
 }
}

你的结果不会完全符合你的要求,但会有点相似:

{
    "key": "<publicationId-1>",
    "doc_count": 25,
    "accounts": {
      "buckets": [
        {
          "key": "<account-1>",
          "doc_count": 25
        }
      ]
    }
},
{
    "key": "<publicationId-2>",
    "doc_count": 387,
    "accounts": {
      "buckets": [
        {
          "key": "<account-2>",
          "doc_count": 387
        }
      ]
    }
},
{
    "key": "<publicationId-3>",
    "doc_count": 7831,
    "accounts": {
      "buckets": [
        {
          "key": "<account-3>",
          "doc_count": 7831
        }
      ]
    }
}

您还可以查看 the link 以查找更多信息

此要求最好通过 top_hits 聚合来实现,您可以在其中对每个存储桶中的文档进行排序并选择第一个,还可以控制要返回的字段:

{
  "size": 0,
  "aggs": {
    "publications": {
      "terms": {
        "field": "id"
      },
      "aggs": {
        "sample": {
          "top_hits": {
            "size": 1,
            "_source": ["api","accountId"]
          }
        }
      }
    }
  }
}

感谢两位的快速回复。我认为第一个解决方案是最"beautiful"(就请求而言也是检索结果)但两者似乎都是子聚合查询。

{ "size": 0, "aggs": { "publications": { "terms": { "size": 0, "field": "publicationId" }, "aggs": { "sample": { "top_hits": { "size": 1, "_source": ["accountId", "api"] } } } } } }

我想我必须小心 size=0 参数,所以,因为我在 Java Api 工作,所以我决定用 INT.Max 而不是 0.

非常感谢大家。