在 Elasticsearch 上聚合结果时是否可以 returns 其他字段?
Is it possible to returns other fields when you aggregate results on Elasticsearch?
这是我的索引 PublicationsLikes 的映射:
- id : 字符串
- 账户:字符串
- api : 字符串
- 日期:日期
我目前正在 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.
非常感谢大家。
这是我的索引 PublicationsLikes 的映射:
- id : 字符串
- 账户:字符串
- api : 字符串
- 日期:日期
我目前正在 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.
非常感谢大家。