David Yell
David Yell

Reputation: 11855

How to limit a date histogram aggregation of nested documents to a specific date range?

Version

Using Elasticsearch 1.7.2

Objective

I would like to create a graph of the number of predictions made by users per day for the last n days. In this case, 10 days.

Current query

{
    "size": 0,
    "aggs": {
        "predictions": {
            "nested": {
                "path": "user_answers"
            },
            "aggs": {
                "predictions_over_time": {
                    "date_histogram": {
                        "field": "user_answers.created",
                        "interval": "day",
                        "format": "yyyy-MM-dd",
                        "min_doc_count": 0
                    }
                }
            }
        }
    }
}

Issue

This query will return a histogram but will return buckets for all available dates across all documents. It doesn't restrict to a specific date range.

What have I tried?

I've tried a number of approaches to solving this, all of which have failed. * Range filter, then histogram that * Date range aggregation, then histogram the buckets * Using extended_bounds with, full dates, now-10d and also timestamps * Trying a range filter inside the histogram aggregation

Any guidance would be appreciated! Thanks.

Upvotes: 4

Views: 5679

Answers (2)

Oded Niv
Oded Niv

Reputation: 2737

query didn't work for me in that situation, what I used is a third aggs:

{
    "size": 0,
    "aggs": {
        "user_answers": {
            "nested": { "path": "user_answers" },
            "aggs": {
                "timed_user_answers": {
                    "filter": {
                        "range": {
                            "user_answers.created": {
                                "gte": "now",
                                "lte": "now -10d"
                            }
                        }
                    },
                    "aggs": {
                        "predictions_over_time": {
                            "date_histogram": {
                                "field": "user_answers.created",
                                "interval": "day",
                                "format": "yyyy-MM-dd",
                                "min_doc_count": 0
                            }
                        }
                    }
                }
            }
        }
    }
}

One aggs specifies nested, one specifies filter, and the last specifies the actual aggregation. Don't know why this syntax makes sense, but you seem to not be able to use two on the same aggs.

Upvotes: 7

piyushGoyal
piyushGoyal

Reputation: 1099

You need to add a query. Query can be anything except from post_filter. It should be nested and contain date range. One of the ways is to define a constant score query. Inside constant score query, use a nested filter which should use a range filter.

{
  "query": {
    "constant_score": {
      "filter": {
        "nested": {
          "path": "user_answers",
           "filter": {
             "range": {
               "user_answers.created": {
                 "gte": "now",
                 "lte": "now -10d"
               }
             }
           }
        }
      }

    }
  }
} 

Confirm if this works for you.

Upvotes: -1

Related Questions