【问题标题】:Elasticsearch - perform multi-field max aggregationElasticsearch - 执行多字段最大聚合
【发布时间】:2020-12-07 12:24:09
【问题描述】:

我有一个包含来自不同来源的事件的索引,因此,我有两个不同的名称用于同一字段,“accounting_date”和“dt_comptable”,我需要查询并获取两个字段值的最大值, 以下查询适用于我的一个字段:

GET indexXX/_search
{
  "size": 0,
  "aggs": {
    "latest_accounting_date": {
      "max": {
        "field": "dt_comptable"
      }
    }
  }
}  

我需要包含另一个字段“accounting_date”。

【问题讨论】:

  • 是否需要获取每个文档 ID 的两个字段的最大值?
  • @AssaelAzran 不,我需要所有文档之间的最大日期,但使用这两个字段,因为每个文档都有其中一个

标签: elasticsearch logstash aggregation elasticsearch-aggregation elk


【解决方案1】:

输入scripting...您可以指定一个脚本来检索任一字段(以存在者为准),而不是指定一个字段,但max 聚合将能够对这两个字段起作用:

GET indexXX/_search
{
  "size": 0,
  "aggs": {
    "latest_accounting_date": {
      "max": {
        "script": {
          "source": "doc['dt_comptable'].size() > 0 ? doc['dt_comptable'].value : doc['accounting_date'].value"
        }
      }
    }
  }
}  

【讨论】:

  • 谢谢你的回答,你给了我一个很好的领导,我更新了你的答案,因为我有一些没有值的文档,它工作正常,但我不能再将值作为字符串,而是我得到了结果就像 Long 类型:“aggregations”:{“latest_accounting_date”:{“value”:1.5943392E12 } }
  • 之前肯定是一样的,max聚合返回的是最近日期的long值,不是字符串。这个 long 值是自纪元以来的毫秒数,因此如果需要,可以很容易地将其转换回日期字符串。
  • 我所说的字符串是指使用带字段的简单最大值时得到的“value_as_string”:“aggregations”:{“latest_accounting_date”:{“value”:1.5943392E12,“value_as_string”:“ 2020-07-10" } } 但正如你所说,无论如何我都可以将 long 值转换为 date,所以非常感谢
  • 是的,确实,使用脚本,我们利用 doc 值,并且 ES 没有可用的类型来知道如何格式化 value_as_string 字段。但我想你可以在客户端轻松解决这个问题。很高兴它有帮助!
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2015-07-12
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2016-11-23
相关资源
最近更新 更多