Агрегация гистограммы даты Elasticsearch без учета года

Я хочу агрегировать данные по месяцу и дате, я пытаюсь с агрегацией гистограммы даты, но с учетом полного объекта даты.

У меня есть такие данные:

      {
          "created" : "2020-09-26",
          "id" : 6,
          "name" : "Halum khamu"      
      },
      {
          "created" : "2021-09-26",
          "id" : 7,
          "name" : "new new"
      },
      {
          "created" : "2020-10-07",
          "id" : 8,
          "name" : "Halum new"
      }

и я использую этот запрос:

GET /regulations/_search/
{
  "aggs": {
    "news_over_time": {
      "date_histogram": {
        "field": "created",
        "calendar_interval": "day",
        "keyed": true,
        "format": "yyy-MM-dd",
        "min_doc_count": 1
      }
    }
  }
}

Его возвращаемые данные для меня:

      "buckets" : {
        "2020-09-26" : {
          "key_as_string" : "2020-09-26",
          "key" : 1600300800000,
          "doc_count" : 1
        },
        "2021-09-26" : {
          "key_as_string" : "2021-09-26",
          "key" : 1601337600000,
          "doc_count" : 1
        },
        "2020-10-07" : {
          "key_as_string" : "2020-10-07",
          "key" : 1632873600000,
          "doc_count" : 1
        }
      }

Но мой ожидаемый результат будет без учета года:

      "buckets" : {
        "09-26" : {
          "key_as_string" : "09-26",
          "key" : 1600300800000,
          "doc_count" : 2
        },
        "10-07" : {
          "key_as_string" : "10-07",
          "key" : 1632873600000,
          "doc_count" : 1
        }
      }

Как я могу это сделать?


person Md. Razibul Hasan Mithu    schedule 08.10.2020    source источник


Ответы (1)


Нет простого способа решить эту проблему, но это должно выполнить работу:

GET regulations/_search
{
  "size": 0,
  "aggs": {
    "day_histogram": {
      "scripted_metric": {
        "init_script": "state.day_map = [:];",
        "map_script": """
          def created = doc.created.value;
          
          def month = created.getMonthOfYear();
          def day = created.getDayOfMonth();
          
          def key = String.format('%02d', new def[] { month })  
                    + '-' + 
                    String.format('%02d', new def[] { day });
          
          if (state.day_map.containsKey(key)) {
            state.day_map[key] += 1;
          } else {
            state.day_map[key] = 1;
          }
        """,
        "combine_script": "return state.day_map",
        "reduce_script": "return states"
      }
    }
  }
}

уступающий

{
  ...
  "aggregations":{
    "day_histogram":{
      "value":[
        {
          "09-26":2,
          "10-07":1
        }
      ]
    }
  }
}

РЕДАКТИРОВАТЬ. На самом деле есть более простой способ:

GET regulations/_search
{
  "size": 0,
  "aggs": {
    "day_histogram": {
      "terms": {
        "script": {
          "source": "doc.created.value.monthOfYear + '-' + doc.created.value.dayOfMonth"
        },
        "size": 10
      }
    }
  }
}
person Joe Sorocin    schedule 08.10.2020