Elasticsearch - Merge date histogram aggregation

Query

GET /_search
{
  "size" : 0,
  "query" : {
    "ids" : {
      "types" : [ ],
      "values" : [ "someId1", "someId2", "someId3" ... ]
    }
  },
  "aggregations" : {
    "how_to_merge" : {
      "date_histogram" : {
        "script" : {
          "inline" : "doc['date'].values"
        },
        "interval" : "1y",
        "format" : "yyyy"
      }
    }
  }
}

Result

{
   ...
   "aggregations": {
      "how_to_merge": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key_as_string": "2006",
               "key": 1136073600000,
               "doc_count": 1
            },
            {
               "key_as_string": "2007",
               "key": 1167609600000,
               "doc_count": 2
            },
            {
               "key_as_string": "2008",
               "key": 1199145600000,
               "doc_count": 3
            }
         ]
      }
   }
}

I want to merge "2006" and "2007"

And change key name to "TMP"

So result must like this:

{
   ...
   "aggregations": {
      "how_to_merge": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key_as_string": "TMP",
               "key": 1136073600000,
               "doc_count": 3  <----------- 2006(1) + 2007(2)
            },
            {
               "key_as_string": "2008",
               "key": 1199145600000,
               "doc_count": 3
            }
         ]
      }
   }
}

In the case of term queries, if I write a script query as shown below, it works normally, but the date histogram query does not change the key value.

The query below is a script query in which the key value in term aggregation changes SOMETHING1 and SOMETHING2 to TMP and merges.

def param = new groovy.json.JsonSlurper().parseText(
    '{\"SOMETHING1\": \"TMP\", \"SOMETHING2\": \"TMP\"}'
); 
def data = doc['my_field'].values; 
def list = [];
if (!doc['my_field'].empty) {
    for (x in data) { 
        if (param[x] != null) { 
            list.add(param[x]); 
        } else {
            list.add(x);
        }
    } 
}; 
return list;

How can I write a script query when I want to change the key value to the value I want and combine doc_count in the data histogram query?

Thanks for your help and comments!

That's typically something to do on the client side. Not in Elasticsearch itself.

1 Like

@dadoonet Term query works properly. Is there a way to query the date?

That's another question right?

But yes you can use a range query.