使用ElasticSearch进行多字段聚合

6
假设我有一个相对简单的索引,其中包含以下字段...
"testdata": {
    "properties": {
       "code": {
          "type": "integer"
       },
       "name": {
          "type": "string"
       },
       "year": {
          "type": "integer"
       },
       "value": {
          "type": "integer"
       }
    }
}

我可以编写一个查询来获取按代码聚合的值的总和,如下所示:

{
  "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个回答

12

你可以使用脚本来实现这一点,即不是指定一个字段,而是指定多个字段的组合:

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

注意:您需要确保启用动态脚本,以使此功能正常工作


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接