带有聚合

时间:2016-11-24 14:02:54

标签: elasticsearch elasticsearch-aggregation

我正在尝试执行以下查询。我在文档中有3个属性 状态 - 可以是" FAIL"," PASS" ,"无效" 日期 - 包含日期和时间。

我想要每个状态的每日计数

  

例如:日期:2016年9月11日,状态:失败,数:120
  日期:2016年11月11日,状态:通过,计数:150

我想要最近一个月,两个月的数据等等

 SearchRequest requestQuery =
Requests.searchRequest(ConstantsValue.indexName)
    .types(ConstantsValue._Type)
    .source("{size:999999,"
    + "\"_source\" : "
    + "[\"DTCREATED\", \"STATUS\"]"             
    + ",\"aggs\": "     
    + "{\"group_by_STATUS\": {\"terms\": {\"field\": \"STATUS\"},"
    + "\"aggs\" : "
    + "{\"group_by_DATE\" : {\"date_histogram\" : "
    + "{\"field\" : \"DTCREATED\", \"interval\" : \"day\","
    + "\"format\" : \"yyyy-MM-dd\" },"
    + "\"aggs\" : "
    + "{\"grades_count\" : { \"value_count\" : { \"field\" : \"STATUS\" } }}}}}}}");

此代码为我提供每个状态的每日计数,但是对于所有记录。并希望添加范围过滤器,如下所示。

+"\"query\": {"
+" \"filtered\": {"
+" \"filter\": {"
+ "\"range\": { \"DTCREATED\": { \"gte\": \"now-90d/d\" }}"
+"}}}}}");

但我无法合并这两个查询的内容。我尽我所能。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您需要使用sub-aggregations

查询看起来像这样:

"aggs" : {
  "days" :{
    "date_histogram" : {
        "field" : "DTCREATED",
        "interval" : "day"
    }
  },
  "aggs" : {
    "statuse_in_day" : {
        "terms" : {
            "field" : "STATUS"
        }
    }
}

首先,您将在白天和每个桶中获得桶,您将获得状态值桶。

答案 1 :(得分:0)

你需要添加查询..你可以结合这样的查询和聚合:

"query": {
    "range": {
       "@timestamp": {
          "from": "now-90d"
       }
    }
},
"aggs" : {"..."}

' d'是重复的日子。在此查询中,您要求所有文档来自"现在 - 90天"直到今天,你加入了最后一次的骚乱 你可以在这里查看查询elasticsearch range query