2
votes

I came across a confusion in elasticsearch (version : 1.7.1). As per documentation https://www.elastic.co/guide/en/elasticsearch/guide/current/_filtering_queries_and_aggregations.html ,a filter applied to the query will also be applied to aggregation. When I issued the following query, I am getting unexpected results.

{
  "aggregations": {
    "outer": {
      "aggregations": {
        "inner": {
          "date_histogram": {
            "extended_bounds": {
              "min": 0
            },
            "field": "time",
            "interval": "30d",
            "min_doc_count": 0,
            "order": {
              "_key": "desc"
            }
          }
        }
      },
      "terms": {
        "field": "ad_id",
        "size": 10
      }
    }
  },
  "query": {
    "filtered": {
      "filter": {
        "and": {
          "filters": [
            {
              "range": {
                "time": {
                  "from": 1441619173000,
                  "include_lower": false,
                  "include_upper": true,
                  "to": 1442835370000
                }
              }
            }
          ]
        }
      }
    }
  }
}

A portion of result is here.

{
  "buckets": [
    {
      "key": 203737,
      "doc_count": 27,
      "inner": {
        "buckets": [
          {
            "key_as_string": "2015-09-02T00:00:00.000Z",
            "key": 1441152000000,
            "doc_count": 27
          },
          {
           "key_as_string": "1970-01-31T00:00:00.000Z",
           "key": 2592000000,
           "doc_count": 0
          },

          ...
          {
            "key_as_string": "1970-01-01T00:00:00.000Z",
            "key": 0,
            "doc_count": 0
          }
        ]
      }
    }
  ]
}

Please note that the aggregation result includes keys outside the range I have applied. Type of the time field is date. I have also tried the following query, but the result was same.

{
  "aggs": {
    "outer_filter": {
      "filter": {
        "and": {
          "filters": [
            {
              "range": {
                "time": {
                  "from": 1441619173000,
                  "include_lower": false,
                  "include_upper": true,
                  "to": 1442835370000
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "outer_term": {
          "terms": {
            "field": "ad_id",
            "size": 10
          },
          "aggs": {
            "inner": {
              "date_histogram": {
                "extended_bounds": {
                  "min": 0
                },
                "field": "time",
                "interval": "30d",
                "min_doc_count": 0,
                "order": {
                  "_key": "desc"
                }
              }
            }
          }
        }
      }
    }
  }
}

My problem is that the aggregation result includes results outside the filters ("from": 1441619173000,"to": 1442835370000).

Why are the filters not getting applied ? Can anyone help please.

2

2 Answers

1
votes

'extended_bound' min value is the problem. As min is 0 and the field is of type date, buckets starts from 1970 itself.

0
votes

You appear to have the range filter confused with the range aggregation.

The range filter takes two types of parameters, gte or gt (greater than) and lte or lt (less than).

The from/to parameters are for the range aggregation, which is used to split your results into user defined buckets.