Elasticsearch 范围过滤器在日期直方图中不起作用
Elasticsearch range filter not working in date histogram
我在 elasticsearch(版本:1.7.1)中遇到了一个困惑。根据文档 https://www.elastic.co/guide/en/elasticsearch/guide/current/_filtering_queries_and_aggregations.html ,应用于查询的过滤器也将应用于聚合。当我发出以下查询时,我得到了意想不到的结果。
{
"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
}
}
}
]
}
}
}
}
}
部分结果在这里。
{
"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
}
]
}
}
]
}
请注意,聚合结果包含超出我应用的范围的键。时间字段的类型是date。我也试过下面的查询,但结果是一样的。
{
"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"
}
}
}
}
}
}
}
}
}
我的问题是聚合结果包括过滤器之外的结果("from":1441619173000,"to":1442835370000)。
为什么没有应用过滤器?
有谁能帮忙吗
您似乎将范围过滤器与范围聚合混淆了。
范围过滤器采用两种类型的参数,gte 或 gt(大于)和 lte 或 lt(小于)。
from/to 参数用于范围聚合,用于将结果拆分到用户定义的桶中。
'extended_bound' 最小值是问题所在。由于min为0,字段类型为date,buckets从1970开始。
我在 elasticsearch(版本:1.7.1)中遇到了一个困惑。根据文档 https://www.elastic.co/guide/en/elasticsearch/guide/current/_filtering_queries_and_aggregations.html ,应用于查询的过滤器也将应用于聚合。当我发出以下查询时,我得到了意想不到的结果。
{
"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
}
}
}
]
}
}
}
}
}
部分结果在这里。
{
"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
}
]
}
}
]
}
请注意,聚合结果包含超出我应用的范围的键。时间字段的类型是date。我也试过下面的查询,但结果是一样的。
{
"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"
}
}
}
}
}
}
}
}
}
我的问题是聚合结果包括过滤器之外的结果("from":1441619173000,"to":1442835370000)。
为什么没有应用过滤器? 有谁能帮忙吗
您似乎将范围过滤器与范围聚合混淆了。
范围过滤器采用两种类型的参数,gte 或 gt(大于)和 lte 或 lt(小于)。
from/to 参数用于范围聚合,用于将结果拆分到用户定义的桶中。
'extended_bound' 最小值是问题所在。由于min为0,字段类型为date,buckets从1970开始。