在Elasticsearch上汇总结果时是否可以返回其他字段?

时间:2016-11-29 18:26:38

标签: elasticsearch aggregate elasticsearch-aggregation

以下是我的索引PublicationsLikes的映射:

  • id:String
  • account:String
  • api:String
  • 日期:日期

我目前正在ES上进行聚合,我按照发布的ID对结果进行分组。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="panel">
  <input type="text" id="filename" value="Name">
</div>
<div class="panel">
  <input type="text" id="newfilename" value="">
</div>
<div class="panel">
  <button type="button" id="btnGenerate">
    Get File Name
  </button>
</div>

返回的&#34;键&#34; (id)是一个信息,但我还需要选择出版物的另一个字段,如account和api。有点像:

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

我该如何管理?

感谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以使用子聚合。

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以查找更多信息

答案 2 :(得分:0)

感谢您的快速回复。我认为第一个解决方案是最好的&#34;美丽&#34; (在请求方面,但也检索结果)但似乎都是子聚合查询。

{ "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。

吸引了很多人。