如何将嵌套文档的日期直方图聚合限制为特定日期范围?

时间:2015-11-04 17:00:59

标签: elasticsearch

版本

使用Elasticsearch 1.7.2

目标

我想创建一个图表,显示过去n天内用户每天所做的预测次数。在这种情况下,10天。

当前查询

{
    "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
                    }
                }
            }
        }
    }
}

问题

此查询将返回直方图,但会返回所有文档中所有可用日期的存储桶。它并不限制在特定的日期范围内。

我尝试了什么?

我已经尝试了很多方法来解决这个问题,所有方法都失败了。 *范围过滤,然后直方图 *日期范围聚合,然后直方图桶 *使用extended_bounds,完整日期,now-10d以及时间戳 *在直方图聚合中尝试范围过滤器

任何指导将不胜感激!感谢。

2 个答案:

答案 0 :(得分:7)

在这种情况下,{p> query对我不起作用,我使用的是第三种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
                            }
                        }
                    }
                }
            }
        }
    }
}

一个aggs指定nested,一个指定filter,最后一个指定实际聚合。不知道为什么这种语法有意义,但你似乎无法在同一aggs上使用两种语法。

答案 1 :(得分:-1)

您需要添加查询。查询可以是除post_filter之外的任何内容。它应该是嵌套的并包含日期范围。其中一种方法是定义常量分数查询。在常量分数查询中,使用嵌套过滤器,该过滤器应使用范围过滤器。

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

    }
  }
} 

确认这是否适合您。