【问题标题】:Elasticsearch: Query partly affect the aggregation result for date histogram on nested fieldElasticsearch:查询部分影响嵌套字段上日期直方图的聚合结果
【发布时间】:2018-05-24 07:16:46
【问题描述】:

我有一个关于组合嵌套日期字段、date_histogram 聚合和范围查询的问题。

我的整个查询如下所示:

{
    "query": {
        "nested": {
            "path": "transactions",
            "query": {
                "range": {
                    "transactions.date": {
                        "gte": "2013",
                        "lte": "2014",
                        "format": "yyyy"
                    }
                }
            }
        }
    },
    "aggs" : {
        "transactions": {
            "nested": {
                "path": "transactions"
            },
            "aggs": {
                "count_per_year": {
                    "date_histogram": {
                        "field": "transactions.date",
                        "interval": "year"
                    }
                }   
            }
        }
    }
}

给出以下响应(仅显示聚合):

"aggregations": {
    "transactions": {
        "doc_count": 23302,
        "count_per_year": {
            "buckets": [
                {
                    "key_as_string": "2013-01-01T00:00:00.000Z",
                    "key": 1356998400000,
                    "doc_count": 181
                },
                {
                    "key_as_string": "2014-01-01T00:00:00.000Z",
                    "key": 1388534400000,
                    "doc_count": 8363
                },
                {
                    "key_as_string": "2015-01-01T00:00:00.000Z",
                    "key": 1420070400000,
                    "doc_count": 9621
                },
                {
                    "key_as_string": "2016-01-01T00:00:00.000Z",
                    "key": 1451606400000,
                    "doc_count": 5137
                }
            ]
        }
    }
}

如您所见,我仍然得到指定范围之外的日期值。更奇怪的是,如果我删除查询部分,我会得到以下响应:

"aggregations": {
    "transactions": {
        "doc_count": 65485,
        "count_per_year": {
            "buckets": [
                {
                    "key_as_string": "2013-01-01T00:00:00.000Z",
                    "key": 1356998400000,
                    "doc_count": 181
                },
                {
                    "key_as_string": "2014-01-01T00:00:00.000Z",
                    "key": 1388534400000,
                    "doc_count": 23009
                },
                {
                    "key_as_string": "2015-01-01T00:00:00.000Z",
                    "key": 1420070400000,
                    "doc_count": 27017
                },
                {
                    "key_as_string": "2016-01-01T00:00:00.000Z",
                    "key": 1451606400000,
                    "doc_count": 15278
                }
            ]
        }
    }
}

如您所见,所有存储桶(与范围对应的存储桶除外)的 doc_count 都增加了,这意味着过滤掉了一些值,但不是全部。我检查了映射,transactions.date 是“日期”类型,这也得到了 date_histogram 聚合能够将所有事务放入存储桶的事实的证实。知道我可能做错了什么吗?

我目前正在运行 Elasticsearch 5.6.3。

【问题讨论】:

    标签: elasticsearch elasticsearch-5


    【解决方案1】:

    我也遇到了同样的问题,我使用的解决方案是使用另一个过滤器 aggs 来根据日期缩小文档的范围。 以下查询应该可以解决您的问题:

    {
        "query": {
            "nested": {
                "path": "transactions",
                "query": {
                    "range": {
                        "transactions.date": {
                            "gte": "2013",
                            "lte": "2014",
                            "format": "yyyy"
                        }
                    }
                }
            }
        },
        "aggs": {
            "transactions": {
                "nested": {
                    "path": "transactions"
                },
                "aggs": {
                    "filtering_date_range": {
                        "filter": {
                            "range": {
                                "transactions.date": {
                                    "gte": "2013",
                                    "lte": "2014",
                                    "format": "yyyy"
                                }
                            }
                        }
                    },
                    "aggs": {
                        "count_per_year": {
                            "date_histogram": {
                                "field": "transactions.date",
                                "interval": "year"
                            }
                        }
                    }
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-30
      • 2020-12-21
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2015-07-30
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多