如何在elasticsearch中基于每年的特定日期聚合字段?

0h4hbjxa  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(2)|浏览(412)

我的指数里有2010年到2015年的数据。
我使用了下面的代码来获取2010年到2015年期间每年汇总的名字详细信息,它按预期工作

POST profile/_search
{
  "size": "0",
  "aggs": {
    "count_by_year": {
      "date_histogram": {
        "field": "logdate",
        "interval": "year",
        "format": "yyyy"
      },
      "aggs": {
        "count_by_firstname": {
          "terms": {
            "field": "profile.firstname"
          }
        }
      }
    }
  }
}

如何根据每年的特定日期汇总数据。
例如,我想检索每年2月15日到4月15日的数据。

rsl1atfo

rsl1atfo1#

日期范围聚合,范围如下:

{
    "aggs": {
        "range": {
            "date_range": {
                "field": "logdate",
                "format": "YYYYMMDD",
                "ranges": [
                    {
                        "from": "20150201"
                    },
                    {
                        "to": "20150430"
                    }
                ]
            },
            "aggs": {
                "count_by_firstname": {
                    "terms": {
                        "field": "profile.firstname"
                    }
                }
            }
        }
    }
}
kmb7vmvb

kmb7vmvb2#

你可以试着用 filter 用一个 script 像这样过滤。请注意,2月15日是一年中的第46天,4月15日是一年中的第105天(当然闰年除外,但这说明了一个解决方案)。
这个 script 会把任何文件 logdate 2月15日至4月15日(任何一年),然后 date_histogram 会在适当的年份把它们送到桶里。最后是 terms 聚合按名字拆分计数。

{
  "size": "0",
  "aggs": {
    "specific_period": {
      "filter": {
        "script": {
          "script": "doc.logdate.date.dayOfYear >= 46 && doc.logdate.date.dayOfYear <= 105"
        }
      },
      "aggs": {
        "byyear": {
          "date_histogram": {
            "field": "logdate",
            "interval": "year",
            "format": "yyyy"
          },
          "aggs": {
            "count_by_firstname": {
              "terms": {
                "field": "profile.firstname"
              }
            }
          }
        }
      }
    }
  }
}

相关问题