假设我有一个相对简单的索引,其中包含以下字段...
"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
}
},
但是,此数据被提供给 Web 前端,需要在其中显示代码和名称。所以,问题是,是否可以以某种方式修改查询以在结果中返回 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 之前最初来自 SQL)我会编写以下查询
SELECT Code, Name, SUM(Value) AS Total_Value
FROM [TestData]
GROUP BY Code, Name
最佳答案
您可以使用脚本实现这一点,即不指定字段,而是指定字段的组合:
{
"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为了这个工作
关于elasticsearch - 聚合 ElasticSearch 中返回的多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977199/