Elasticsearch聚合。按嵌套存储桶doc_count排序

时间:2015-10-02 13:51:06

标签: elasticsearch aggregation elasticsearch-net

我想要实现的是通过唯一对(city,STATE)进行聚合。根据Elasticsearch文档术语聚合不支持从同一文档中的多个字段收集术语。因此我创建了一个嵌套的agg:

{
  "size": 0,
  "aggs": {
    "cities": {
      "terms": {
        "field": "address.city",
        "size": 12
      },
      "aggs": {
        "states": {
          "terms": {
            "field": "address.stateOrProvince"
          },
          "aggs": {
            "topCity": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "price.value": {
                      "order": "desc" }}]}}}}}}}}

由于这种聚合,我得到这样的回应:

{
  "aggregations": {
    "cities": {
      "buckets": [
        {
          "key": "las vegas",
          "doc_count": 5927,
          "states": {
            "buckets": [
              { "key": "nv", "doc_count": 5840 },
              { "key": "nm", "doc_count": 85 }
            ]
          }
        },
        {
          "key": "jacksonville",
          "doc_count": 5689,
          "states": {
            "buckets": [
              { "key": "fl", "doc_count": 2986 },
              { "key": "nc", "doc_count": 1962 },
              { "key": "ar", "doc_count": 290 }]}}]}}}

问题是如何按最深的doc_count排序结果?

预期的有序列表应该是这样的:

  1. 拉斯维加斯,nv(5840)
  2. jacksonville,fl(2986)
  3. jacksonville,nc(1962)
  4. jacksonville,ar(290)
  5. 拉斯维加斯,nm(85)

2 个答案:

答案 0 :(得分:2)

我不相信有多种方法可以对多个存储桶中的内部doc_count进行排序。在ES 2.0(仍处于测试版)中,您将能够对聚合采取行动,但这在ES 1.x中是不可能的

答案 1 :(得分:0)

我通过应用transform

设法解决了这个问题
"transform": {
  "script": "ctx._source['address']['cityState'] = ctx._source['address']['city'] + ', ' + ctx._source['address']['state']"
}

然后聚合新添加的字段。按预期工作!