当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch:查询部分影响嵌套字段上日期直方图的聚合结果

卫皓
2023-03-14

我在组合嵌套日期字段、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”,这也通过date_histogram聚合能够将所有事务放入bucket的事实得到了证实。你知道我可能做错了什么吗?

共有1个答案

鞠修雅
2023-03-14

我也面临同样的问题,我使用的解决方案是使用另一个过滤器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"
                        }
                    }
                }
            }
        }
    }
}
 类似资料:
  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?

  • 我看到一些关于嵌套字段和聚合的帖子,但它们似乎都没有回答我的问题。所以,如果这是一个重复的问题,请原谅,如果有任何帮助,我们将不胜感激。 我们建立了一个讲座索引,讲座具有以下特点: 讲座可以是面对面(现场)或预先录制(在线) 每个讲座可以有多个章节 这些章节中的每一个都可以由不同的讲师讲解(例如:量子物理的第一章可以由五个不同的讲师讲解,其中三个可能是现场直播,另外两个可能在线) 在线讲座每个讲师

  • 如何对同一嵌套下的多个字段执行“必须”“匹配”查询?这是一个可复制的ES索引,其中“用户”字段定义为“嵌套”类型。 这里有2份文件: 对于这个索引,如何查询“John”和“Alice”都存在的文档?使用上面定义的索引,我希望得到的是文档1,而不是文档2。到目前为止,我已经尝试了以下代码,但没有收到任何结果:

  • 我有带有实体和嵌套实体的索引。实体由、和嵌套变体组成。实体由、和字段组成。我需要按、和字段聚合搜索结果,以获得每个颜色、大小和价格组的产品数量。如果我对这些字段使用嵌套聚合,我会得到正确的buckes,但是bucket中的文档数是每个bucket的实体数。但是我需要获得每个bucket的实体(根文档)的数量。 例如,第一个产品有变体(红色,小,$10)、(绿色,小,$10)、(红色,中等,$11)

  • 我有一个如下所示的ElasticSearch查询: 和像这样的文件作对。 因此,我能够根据文档名称和搜索名称与我的查询的接近程度来检索文档。 要求是,文本搜索框应该检索与查询匹配的最接近的名称,但是,如果给定相对相似的名称,在过去的时间段内投诉数量超过10的文档在搜索结果中的显示应该高于那些少于10的文档。 因此,我需要传递一个时间段的关键字,例如“01/01/2001-31/12/2001”,如

  • 问题内容: 我刚开始使用ElasticSearch几天,而作为一项学习练习,我实施了一个基本的工作搜寻器,该工作收集器汇总了一些求职网站上的工作,并在其中填充了一些数据供我使用。 我的索引包含每个列出职位的网站的文档。每个文档的一个属性是一个“作业”数组,其中包含该站点上存在的每个作业的对象。我正在考虑将每个作业作为自己的文档建立索引(特别是因为ElasticSearch文档说inner_hits