假设我有一个相对简单的索引,其中包含以下字段......
"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
}
},
我已经阅读了子聚合,但在这种情况下,code
和name
之间存在一对一的关系(所以,你不会有同一个密钥的不同名称)。另外,在我的实际情况中,还有其他5个字段,比如description
,我想要返回,所以我想知道是否还有其他方法可以做到。
在SQL中(此数据在交换到ElasticSearch之前最初来自此)我会写下面的查询
SELECT Code, Name, SUM(Value) AS Total_Value
FROM [TestData]
GROUP BY Code, Name
答案 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才能使其正常工作