与ElasticSearch中返回的多个字段进行聚合

时间:2016-10-11 12:25:15

标签: elasticsearch

假设我有一个相对简单的索引,其中包含以下字段......

"testdata": {
    "properties": {
       "code": {
          "type": "integer"
       },
       "name": {
          "type": "string"
       },
       "year": {
          "type": "integer"
       },
       "value": {
          "type": "integer"
       }
    }
}

我可以编写一个查询来获取由code汇总的值的总和,如下所示:

{
  "from":0,
  "size":0,
  "aggs": {
    "by_code": {
      "terms": {
        "field": "code"
      },
      "aggs": {
        "total_value": {
          "sum": {
            "field": "value"
          }
        }
      }
    }
  }
}

这会返回以下(删节)结果:

"aggregations": {
  "by_code": {
     "doc_count_error_upper_bound": 478,
     "sum_other_doc_count": 328116,
     "buckets": [
        {
           "key": 236948,
           "doc_count": 739,
           "total_value": {
              "value": 12537
           }
        },

然而,这些数据被送到网络前端,需要显示代码和名称。那么,问题是,是否有可能以某种方式修改查询以在结果中返回name字段以及code字段?

因此,例如,结果看起来有点像这样:

"aggregations": {
  "by_code": {
     "doc_count_error_upper_bound": 478,
     "sum_other_doc_count": 328116,
     "buckets": [
        {
           "key": 236948,
           "code": 236948,
           "name": "Test Name",
           "doc_count": 739,
           "total_value": {
              "value": 12537
           }
        },

我已经阅读了子聚合,但在这种情况下,codename之间存在一对一的关系(所以,你不会有同一个密钥的不同名称)。另外,在我的实际情况中,还有其他5个字段,比如description,我想要返回,所以我想知道是否还有其他方法可以做到。

在SQL中(此数据在交换到ElasticSearch之前最初来自此)我会写下面的查询

SELECT Code, Name, SUM(Value) AS Total_Value
FROM [TestData] 
GROUP BY Code, Name

1 个答案:

答案 0 :(得分:10)

您可以使用脚本来实现此目的,即您可以指定字段组合而不是指定字段:

{
  "from":0,
  "size":0,
  "aggs": {
    "by_code": {
      "terms": {
        "script": "[doc.code.value, doc.name.value].join('-')"
      },
      "aggs": {
        "total_value": {
          "sum": {
            "field": "value"
          }
        }
      }
    }
  }
}

注意:您需要确保enable dynamic scripting才能使其正常工作