elasticsearch - 聚合 ElasticSearch 中返回的多个字段

标签 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
           }
        },

但是,此数据被提供给 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
           }
        },

我已经阅读了子聚合,但在这种情况下,codename 之间存在一对一的关系(因此,您不会同一个键有不同的名称)。此外,在我的真实案例中,还有 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/

相关文章:

elasticsearch - 合并多个聚合的结果

elasticsearch - 计算两个日期字段之间差异的平均值

elasticsearch - Elasticsearch-术语为空?

elasticsearch - elasticsearch批量脚本与elasticsearch.yml更改都不起作用

elasticsearch - 使用最近更新的时间戳进行 Elasticsearch 版本控制?

elasticsearch - Elastic Search 嵌套多匹配查询

elasticsearch - 使用ReactiveSearch进行AND查询

elasticsearch - 如何通过REST创建新的Kibana可视化?

python - 使用稀疏向量进行查询的 Elasticsearch 运行时错误

django - Django Rest Framework Elasticsearch :RequestError 400 parsing_exception