为什么添加日期范围过滤器会禁用aggs?

时间:2016-02-19 08:52:36

标签: elasticsearch

我有

类型的文件
{
  "host-ip": "192.168.0.1",
  "HOST_END_iso": "2016-02-19T09:30:41+01:00"
}

我成功查询ES以获得一个随机条目和host-ip

的聚合
{
   "query": {
      "match_all": {}
   },
   "size": 1,
   "aggs": {
      "rating": {
         "terms": {
            "field": "host-ip",
            "size": 0,
            "shard_size": 0
         }
      }
   }
}

我现在想要过滤结果并在两个日期之间获取文档。 query部分变得更加复杂:

{
   "query": {
      "filtered": {
         "filter": {
            "query": {
               "match_all": {}
            },
            "terms": {
               "range": {
                  "HOST_END_iso": {
                     "gt": "2015-02-19T09:30:41+01:00",
                     "lt": "2016-02-19T09:30:41+01:00"
                  }
               }
            }
         }
      },
      "size": 1
   },
   "aggs": {
      "rating": {
         "terms": {
            "field": "host-ip",
            "size": 0,
            "shard_size": 0
         }
      }
   }
}

返回了一条记录,但没有聚合。为什么?

请注意,我必须移动size,将返回元素的数量限制在第一个query的范围内。 我不明白为什么我需要这样做:如果我把它放在与queryaggs相同的级别(就像在第一次成功示例中那样),我我不再局限于1个元素,但我得到默认值10(所以size没有被考虑在内,我仍然没有得到aggs)

1 个答案:

答案 0 :(得分:1)

您的查询在许多地方都格格不入:这里是正确的

{
  "size": 1,
  "query": {
    "filtered": {
      "filter": {
        "range": {
          "HOST_END_iso": {
            "gte": "2015-02-19T09:30:41+01:00",
            "lte": "2016-02-19T09:30:41+01:00"
          }
        }
      }
    }
  },
  "aggs": {
    "rating": {
      "terms": {
        "field": "host-ip",
        "size": 0,
        "shard_size": 0
      }
    }
  }
}

主要问题是terms/range过滤器,您需要一个但不需要两个。